一、成员变量和成员函数分开存储
在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;}
二、this指针概念
通过4.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;}
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; //p2.age = 20// 为什么是20,而不是40呢?// 因为p2.PersonAddPerson(p1)调用完该函数返回的是p2对象的一份拷贝,也就是一个新对象,并不是p2对象本身,所以p2对象的age值只加了一次,之后一直都是新产生的对象在加}int main() {test01();system("pause");return 0;}