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,表示常对象,常对象属性不允许修改;
常对象需要自己提供初始化的构造函数,要确保该构造函数不会尝试修改任何成员变量,因为值在初始化之后就不能被修改;
编译器提供的构造函数无法进行值的初始化;常对象只能调用常函数,因为常对象不能修改属性,而普通成员函数是可以修改属性的;

posted @   万舜  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示