1.成员变量和成员函数分开存储
在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才存放类的对象内存
classPerson{};voidtest01(){//空对象占有内存空间为1//C++编译器会给每个对象也分配一个字节空间,是为了区分空对象占内存中的位置。//每个空对象也应该有一个独一无二的内存地址Personp;cout"对象占内存"sizeof(p)endl;//输出为1}classStruend{intm_A;//非静态的成员变量,存放在类的对象内存staticintm_B;//静态的成员变量,不存放类的对象内存voidfunc1(){};//非静态成员函数,不存放类的对象内存staticvoidfunc2(){};//静态成员函数,不存放类的对象内存};voidtest02(){Struendstu;cout"对象占内存"sizeof(stu)endl;//输出为4//当在类中添加staticintm_B;时cout"对象占内存"sizeof(stu)endl;//输出为4//当在类中添加voidfunc(){};时cout"对象占内存"sizeof(stu)endl;//输出为4//当在类中添加staticvoidfunc2(){};时cout"对象占内存"sizeof(stu)endl;//输出为4}2.this指针概念
C++中的成员变量和成员函数是分开存储的,每一个非静态变量成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。
那么问题是:这一块代码是如何区分那个对象调用自己呢?
C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属对象
当this所属的函数被p1调用,那么this这个指针就指向p1所属对象。
this指针的本质:是指针常量,指针常量的指向不可改变,指向的内容可以改变。
this的用途:
1.当形参和成员变量同名时,可以用this指针来区分
2.在类的非静态成员函数中返回对象本身,可使用return*this
classPerson{public:intAge;Person(intAge){this-Age=Age;}voidPersonAddAge(Personp){this-age+=p.age;}PersonPersonAddAge2(Personp){this-age+=p.age;return*this;}};//当形参和成员变量同名时,可以用this指针来区分voidtest01(){Personp1(18);coutp1.Ageendl;}//返回对象本身用*thisvoidtest02(){Personp1(12);Personp2(18);p2.PersonAddAge(p1)//输出是:0//如果要实现这种p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);//PersonAddAge()的返回值要是Person*this指向的是调用该函数对象本身//PersonAddAge2的返回值是PersonPerson的引用,所以一直是指向p2的,p2.PersonAddAge2(p1).PersonAddAge2(p1).PersonAddAge2(p1);//输出是:44这个也是链式编程//当返回值是Person时p2.PersonAddAge2(p1).PersonAddAge2(p1).PersonAddAge2(p1);//返回值是0//因为这时调用的拷贝函数创建的新对象,不是p2}.空指针访问成员函数
C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针,如果用到this指针,需要加以判断保证代码健壮性。
classPerson{public:intm_Age;voidshowClassName(){cout"thisisPersonclass"endl;}voidshowPersonAge(){//为了防止传来空指针,因此报错所以if(this==NULL){return;}cout"age="this-m_Ageendl;}};voidtest01(){Person*p;p-showClassName();//可以调用p-showPersonAge;//不可以调用,this指向是一个空指针,没有对象无法访问到m_Age}4.const修饰成员函数
常函数:
1.成员函数后加const后称这个函数为常函数
2.常函数内不可以修改成员属性
.成员属性声明时加关键字mutable后,在常函数中才可以修改。
常对象:
1.声明对象前加const称该对象为常对象
2.常对象只能调用常函数。
常函数
classPerson{public:intm_A;mutableintm_B;voidshowPerson()const{m_A=;//报错,常函数内不可以修改成员变量//因为m_A=;是等价于this-m_A=;//this指针的本质:是指针常量,指针常量的指向不可改变,指向的内容可以改变。//当函数没有加const时,是指针常量constPerson*constthis;,当在函数上加const时就变成constPerson*constthis;this这个指针变成常量指针常量这样this指针的指向和内容都不可以改变。m_B=;//可以修改,因为m_B上面加了关键字mutable}};
常对象
classPerson{publicintm_A;mutableintm_B;voidshowPerson()const{}voidfunc(){}};voidmain(){constPersonp;//在对象前加const,变为常对象p.m_A=;//报错,因为常对象不可以修改属性p.m_B=;//可以,因为加了关键字mutablep.showPerson();//可以调用p.func();//报错,常对象不可以调用普通函数,只能调用常函数}