C++学习笔记——成员变量和成员函数
静态成员
静态成员由static修饰,所有对象共享;
静态成员变量在编译阶段进行分配内存,类内声明,类外初始化;
静态成员函数只能访问静态成员变量,因为普通成员变量在创建对象时会拷贝副本,所以静态成员函数无法识别操作的普通成员变量属于哪个对象;
成员变量和成员函数分开存储
一个空对象的大小为1字节,普通对象的大小大于或等于所有成员变量的大小(考虑内存对齐),成员函数和静态成员不属于对象,不占对象空间,只有一份实例;
this指针
所有成员函数都有一个this指针:this 指针指向 被调用的成员函数 所属的对象,其本质是一个指针常量;
空指针可以访问成员函数,但是不能访问成员变量。进行操作的成员函数,因为成员函数内部的成员变量本质是this->attribute
,会出现NULL->attribute
的情况;
class Teacher
{
public:
char name;
void showTeacher()
{
name = 'a'; // => this->name = 'a';
}
void func()
{
}
};
void test01()
{
Teacher* t = NULL;
t->func();
t->showTeacher(); // => NULL->name = 'a';
}
常函数和常对象
在成员函数后面跟上const,成员函数成为常函数,常函数不允许修改成员属性;
因为每个成员函数都会带有this指针,是一个指针常量,指针的指向是不可以修改的;
而在成员函数后面加const,修饰的是this指针,让指针指向的值也不可以修改;
class Teacher
{
public:
char name;
// mutable 关键字修饰的变量,可以在常函数中修改
mutable int age;
// this指针是指针常量,指针的指向是不可以修改的
// 在成员函数后面加const,修饰的是this指针,让指针指向的值也不可以修改
void showTeacher() const //常函数不允许修改成员属性 =》const Teacher* const this
{
// this->name = 'a'; 该变量没有被mutable修饰,不可修改
this->age = 100;
}
void func()
{
}
Teacher(char name, int age) : name(name), age(age)
{
}
};
对象前加const,表示常对象,常对象属性不允许修改;
常对象需要自己提供初始化的构造函数,要确保该构造函数不会尝试修改任何成员变量,因为值在初始化之后就不能被修改;
编译器提供的构造函数无法进行值的初始化;常对象只能调用常函数,因为常对象不能修改属性,而普通成员函数是可以修改属性的;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构