中国免费素材网站,如何诊断网站seo,wordpress更新配置文件,ui设计师面试必问问题#x1f308;个人主页#xff1a;godspeed_lucip #x1f525; 系列专栏#xff1a;C从基础到进阶 #x1f384;1 C对象模型和this指针#x1f336;️1.1 成员变量和成员函数分开存储#x1f336;️1.2 this指针概念#x1f336;️1.3 空指针访问成员函数#x1f336;…
个人主页godspeed_lucip 系列专栏C从基础到进阶 1 C对象模型和this指针️1.1 成员变量和成员函数分开存储️1.2 this指针概念️1.3 空指针访问成员函数️1.4 const修饰成员函数 2 总结 1 C对象模型和this指针
️1.1 成员变量和成员函数分开存储
在C中类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
class Person {
public:Person() {mA 0;}//非静态成员变量占对象空间int mA;//静态成员变量不占对象空间static int mB; //函数也不占对象空间所有函数共享一个函数实例void func() {cout mA: this-mA endl;}//静态成员函数也不占对象空间static void sfunc() {}
};int main() {cout sizeof(Person) endl;system(pause);return 0;
}️1.2 this指针概念
通过1.3.1我们知道在C中成员变量和成员函数是分开存储的
每一个非静态成员函数只会诞生一份函数实例也就是说多个同类型的对象会共用一块代码
那么问题是这一块代码是如何区分那个对象调用自己的呢
c通过提供特殊的对象指针this指针解决上述问题。this指针指向被调用的成员函数所属的对象
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义直接使用即可
this指针的用途
当形参和成员变量同名时可用this指针来区分在类的非静态成员函数中返回对象本身可使用return *this
class Person
{
public:Person(int age){//1、当形参和成员变量同名时可用this指针来区分this-age age;}Person PersonAddPerson(Person p){this-age p.age;//返回对象本身return *this;}int age;
};void test01()
{Person p1(10);cout p1.age p1.age endl;Person p2(10);p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);cout p2.age p2.age endl;
}int main() {test01();system(pause);return 0;
}️1.3 空指针访问成员函数
C中空指针也是可以调用成员函数的但是也要注意有没有用到this指针
如果用到this指针需要加以判断保证代码的健壮性
示例
//空指针访问成员函数
class Person {
public:void ShowClassName() {cout 我是Person类! endl;}void ShowPerson() {if (this NULL) {return;}cout mAge endl;}public:int mAge;
};void test01()
{Person * p NULL;p-ShowClassName(); //空指针可以调用成员函数p-ShowPerson(); //但是如果成员函数中用到了this指针就不可以了
}int main() {test01();system(pause);return 0;
}️1.4 const修饰成员函数
常函数
成员函数后加const后我们称为这个函数为常函数常函数内不可以修改成员属性成员属性声明时加关键字mutable后在常函数中依然可以修改
常对象
声明对象前加const称该对象为常对象常对象只能调用常函数
示例
class Person {
public:Person() {m_A 0;m_B 0;}//this指针的本质是一个指针常量指针的指向不可修改//如果想让指针指向的值也不可以修改需要声明常函数void ShowPerson() const {//const Type* const pointer;//this NULL; //不能修改指针的指向 Person* const this;//this-mA 100; //但是this指针指向的对象的数据是可以修改的//const修饰成员函数表示指针指向的内存空间的数据不能修改除了mutable修饰的变量this-m_B 100;}void MyFunc() const {//mA 10000;}public:int m_A;mutable int m_B; //可修改 可变的
};//const修饰对象 常对象
void test01() {const Person person; //常量对象 cout person.m_A endl;//person.mA 100; //常对象不能修改成员变量的值,但是可以访问person.m_B 100; //但是常对象可以修改mutable修饰成员变量//常对象访问成员函数person.MyFunc(); //常对象不能调用const的函数}int main() {test01();system(pause);return 0;
}2 总结
在代码的舞台上C翩翩起舞。
纵观代码的山川大地无边的可能在眼前延展 C是智慧的风吹动着科技的帆船。
用韵律的二进制谱写着自由的交响曲 C是数字艺术的荣光闪烁在信息的星空。
愿C永远如诗激励创造者的灵感。
渴望挑战C的学习路径和掌握进阶技术不妨点击下方链接一同探讨更多C的奇迹吧。我们推出了引领趋势的C专栏《C从基础到进阶》 旨在深度探索C的实际应用和创新。