1. 从内存布局理解C++类的本质
在C++中,类(class)和结构体(struct)的底层实现其实非常相似。当我们定义一个类时,编译器会在内存中为这个类创建一个蓝图,这个蓝图决定了每个对象实例的内存布局。让我们通过一个具体的例子来理解:
cpp复制class Student {
public:
void setAge(int age) { m_age = age; }
int getAge() const { return m_age; }
private:
int m_age;
std::string m_name;
};
这个简单的Student类在内存中的布局是怎样的呢?在32位系统上,int通常占4字节,std::string通常占32字节(取决于实现),所以每个Student对象至少需要36字节的内存空间。但实际情况会更复杂,因为涉及到内存对齐(alignment)的问题。
内存对齐是编译器为了提高内存访问效率而采取的一种优化策略。在x86架构上,数据类型通常按其大小对齐(如4字节的int按4字节边界对齐)。
类的成员函数(如setAge和getAge)并不存储在对象实例中,而是存储在代码区。所有该类的对象共享同一份成员函数代码,这就是为什么我们可以在不增加对象大小的情况下添加更多成员函数。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 封装的艺术:访问控制实战
封装是面向对象编程的三大特性之一,C++通过public、private和protected三个访问限定符来实现封装。让我们深入探讨每种访问级别的实际应用场景:
cpp复制class BankAccount {
public:
// 公有接口
double getBalance() const { return m_balance; }
void deposit(double amount) {
if (amount > 0) m_balance += amount;
}
protected:
// 子类可访问
void setInterestRate(double rate) { m_interestRate = rate; }
private:
// 仅类内可
