1. 成员变量 与 成员函数 是分开储存的;
类内的 成员变量 与 成员函数 是分开储存的;
只有非静态成员变量属于类的对象上;
空对象占用内存空间为1,C++编译器会为每个空对象分配1个内存,来区分每个空对象占内存的位置。
可以用下面代码实验,当person为空对象时,占用内存为1,类内只有int a时占用内存为4,说明它属于类的对象,后面三个加上以后,占用内存还是4,说明后面3个不占用内存,不属于类的对象
class person
{
int a; //非静态成员变量
static int b;//静态成员变量
void fun();//非静态成员函数
static void func();//静态成员函数};
void test()
{
person p;
cout<<sizeof(p)<<endl;
}int main ()
{
test();
return 0;
}
2.this指针的概念
this 指针指向 被调用的成员函数 所属的对象。
this指针是隐含在每一个非静态成员函数内的一种指针。它不需要定义,可直接使用。
用途:
1.当形参与成员变量同名时,this指针用来区分他俩
2.在非静态成员函数中返回对象本身,用 return *this;
class person
{
public:
person (int age)
{
//this 解决名称冲突,形参 与 成员变量 同名,用this指向成员变量 来区分
this->age =age;
}
person& addage(person &p)//引用 返回本体
{
this->age +=p.age ;
//this指向p3的指针,*this指向p3的本体
return *this;
}
int age;
};//1.解决名称冲突
void test1()
{
person p(10);//this指针指向 被调用的成员函数(这里指拷贝函数) 所属的对象(p)
cout<< p.age <<endl;
}//2.返回对象本身*this
void test2()
{
person p1(10);
person p2(20);
person p3(30);
//p3.addage(p1)返回p3本体,所以后面可以追加 .addage(p2) ,所以 p3.addage(p1) 返回p3本体 再追加 .addage(p2)后 相当于 p3.addage(p2)
p3.addage(p1).addage(p2);//链式编程思想
cout<<p3.age <<endl;
}
注意: 空指针(*p->NULL)也可以访问成员函数,但要注意,如果成员函数中使用了this指针,会报错,因为 this 指针指向 被调用的成员函数 所属的对象。而空指针里什么都没有,this没有指向目标。
3.const修饰成员函数
常函数:
成员函数后加上const后叫做常函数。如:void show() const
常函数内不可以修改成员属性。
成员属性声明时,加关键字mutable,在常函数中依然可以修改。
常对象:
声明对象前加const称该对象为常对象。
常对象只能调用常函数。