目录
1.成员变量和成员函数分开存储
2 this指针概念
3 空指针访问成员函数
4 const修饰成员函数
在C++中成员变量和成员函数是分开存储的;只有非静态成员变量才属于类的对象。空类的内存大小为1个字节。
class Person { int m_A; //非静态成员变量,属于类的对象上 static int m_B; // 静态成员变量 类内声明,类外赋值,不属于类 void func() //非静态成员函数,只需一份 { } static void func2() { } }; static int m_B = 0; void test01() { Person p; //空对象占用的内存空间 //C ++对象会给每一个空对象分配一个字节空间,是为了区分空对象占内存的位置 //每个空对象都应该有一个独一无二的内存地址 cout << "sizeof p =" << sizeof(Person) << endl; } int main() { test01(); system("pause"); return 0; }成员变量和成员函数是分开存储的;
每一个非静态只会诞生一份函数实例,也就是说多个同类对象会共用一块代码;
那么问题来了:一块代码是如何区分哪个对象调用的自己的呢?
C++通过提供特殊的指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象。
this指针是隐含每一个非静态成员函数的一种指针,this指针不需要定义,直接使用即可。
this指针的用途,当形参和成员变量同名时,可用this指针来区分。
在类的非静态成员函数中,返回对象本身,可以使用return *this;
C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针;如果用到了this指针,需要加以判断保证代码的健壮性;
//空指针调用成员函数 class Person { public: void showClassName() { cout << "This is Person class" << endl; } void showPersonAge() { if (this == NULL) return; cout << "age = " << m_Age << endl; } int m_Age; }; void test01() { Person* p = NULL; p->showClassName(); p->showPersonAge(); } int main() { test01(); system("pause"); return 0; }常函数:
成员函数后加const 后我们称之为这个函数为长函数;常函数内不可以修改成员属性;成员属性声明时加关键字mutable 后,在常函数中依然可以修改。常对象:
声明对象前加const称该对象为常对象;常对象只能调用常函数; /常函数 class Person { public: //this 指针的本质是指针常量,指针的指向是不可以修改的; //const Person * const this; //在成员函数后加const ,修饰的是指向this指向,让指针指向的值也不可以修改 void showPerson() const { //m_A = 100; m_B = 100; //this = NULL;//this指针不可以修改指针的指向,但是指针的指向的值可以修改 } void func(); int m_A; mutable int m_B; }; //常对象 void test02() { const Person p;//在对象前加const ,变为常对象; //p.m_A = 100; p.m_B = 100;//m_B是特殊值 //常对象只能调用常函数 p.showPerson();//常对象不可以调用普通成员函数,因为普通成员函数可以修改属性。 } void test01() { Person* p; p->showPerson(); } int main() { test01(); system("pause"); return 0; }