伊犁哈萨克自治州网站建设_网站建设公司_虚拟主机_seo优化
2026/1/17 10:55:58 网站建设 项目流程

C++中类内的成员变量和成员函数分开存储,只有非静态成员变量才存储在类的对象上

 
你想理解的核心是:在 C++ 中,一个类的对象占用的内存空间,只包含它的非静态成员变量,而成员函数和静态成员变量是所有对象共享的,并不占用单个对象的内存。这个概念是理解 C++ 类内存布局的关键。

一、用通俗的比喻理解

可以把类想象成一个工厂的设计图纸,对象就是根据图纸生产出来的具体产品:
  • 非静态成员变量:相当于每个产品独有的属性(比如手机的序列号、颜色),每个产品都有一份,占用产品自身的空间。
  • 成员函数:相当于图纸上标注的 “使用方法”(比如手机的 “打电话” 功能),所有产品都遵循同一个方法,图纸只需要一份,不需要每个产品都带一份。
  • 静态成员变量:相当于工厂的 “公共库存”(比如生产的手机总数),属于工厂所有,不是某个产品的属性,所有产品共享这个数值。

二、分点详细解释 & 代码验证

1. 非静态成员变量:属于对象,占用对象内存

每个对象的非静态成员变量都是独立的,修改一个对象的非静态成员变量,不会影响其他对象。对象的内存大小,本质上就是所有非静态成员变量的大小之和(可能有内存对齐,略大)。
代码验证:
 
#include <iostream>
using namespace std;class Phone {
public:// 非静态成员变量:每个对象独有string color;  // 字符串类型,占用内存int price;     // 整型,4字节(32/64位系统)// 成员函数(非静态)void call() {cout << "打电话" << endl;}
};int main() {Phone p1;p1.color = "白色";p1.price = 5999;Phone p2;p2.color = "黑色";p2.price = 6999;// 输出对象占用的内存大小(包含color和price,因string是复杂类型,大小固定为8字节(64位)+4字节=12字节,内存对齐后可能为16字节)cout << "单个Phone对象的大小:" << sizeof(p1) << endl;return 0;
}
 
输出(64 位系统):
plaintext
 
单个Phone对象的大小:16
 
可以看到,对象的大小只和非静态成员变量有关,完全不包含成员函数的大小。

2. 成员函数:所有对象共享,不占用对象内存

不管类有多少个成员函数,也不管创建了多少个对象,这些成员函数的代码只在内存中存在一份。当调用对象的成员函数时,编译器会隐式地把对象的地址传给函数(通过this指针),函数再通过this访问该对象的非静态成员变量
关键证明:即使给类添加多个成员函数,对象的内存大小也不会变:
 
class Phone {
public:string color;int price;void call() {}void sendMsg() {}void takePhoto() {}
};int main() {// 大小依然是16字节(仅包含color和price)cout << sizeof(Phone) << endl; return 0;
}

 

3. 静态成员变量:所有对象共享,不占用对象内存

静态成员变量用static修饰,属于类本身,而不是某个对象。它在程序启动时就分配内存,所有对象都访问同一份静态成员变量。
代码验证:
 
class Phone {
public:string color;int price;static int totalCount;  // 静态成员变量:记录生产的手机总数
Phone() {totalCount++;  // 每创建一个对象,总数+1
    }
};// 静态成员变量必须在类外初始化
int Phone::totalCount = 0;int main() {Phone p1;Phone p2;Phone p3;// 所有对象共享totalCount,输出3cout << "手机总数:" << Phone::totalCount << endl;// 对象的大小依然是16字节,不包含totalCountcout << "对象大小:" << sizeof(p1) << endl;return 0;
}

 

 
输出:
plaintext
 
 
手机总数:3
对象大小:16
 

三、特殊情况:空类

如果一个类没有任何非静态成员变量(空类),C++ 为了区分不同对象的地址,会给空类分配1 字节的内存,而成员函数依然不占用这 1 字节。
 
class Empty {
public:void func() {}  // 成员函数不占用对象内存
};int main() {cout << sizeof(Empty) << endl;  // 输出1return 0;
}

 

总结

  1. 非静态成员变量:属于单个对象,是对象内存的核心组成部分,修改一个对象的非静态成员变量不会影响其他对象。
  2. 成员函数(无论是否静态):所有对象共享一份代码,不占用单个对象的内存,非静态成员函数通过this指针关联到具体对象。
  3. 静态成员变量:属于类本身,所有对象共享,不占用单个对象的内存,需在类外初始化。
这个规则的核心目的是节省内存—— 如果每个对象都存储一份成员函数代码,会造成极大的内存浪费,而共享函数代码、仅存储独有的数据(非静态成员变量)是最高效的设计。
 

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询