成员变量和成员函数分开存储
首先我们尝试打印下无属性方法的类空间大小,如下

如上,我们可以看到对于未定义属性方法的对象,c++也会分配一个字节,用于区分其他空对象

如果我们添加了个int属性,则大小并不是1+4,而是4,因为不用区分空对象了。

如上,我们又给其添加了个静态属性,发现大小还是4,这是因为静态变量和类对象不是定义在一起,而是属于类本身

所以,我们又给添加了方法和静态方法,可以看到大小都没变,证明非静态方法和静态方法也不是和类对象定义在一起的。
综上,我们可以知道只有非静态成员属性是和类对象定义在一起
this指针
我们刚才知道除了只有非静态成员变量和类对象定义在一起,其他都为共享的代码块,我们如何区分是哪个类对象调用了代码块呢,就要使用this指针,this指针指向被调用的类对象,this指针隐含在每个非静态方法内,直接使用即可
其作用为当费静态方法参数和属性同名使用this->作为区别,方法返回自身时,使用return *this

如上,我们不能方法里写age=age;会默认没有给属性age赋值,使用this->age表明是对象的age

如上,如果我们想做个效果,Person对象可以加别人的年龄,我们可以定义个方法,传入另一个对象,将年龄相加。但是如果我们想将p2反复多加几次,就不能在一行里反复点调用方法了,这时就可以设置方法返回自身,反复调用

如上,我们这里需要注意的是返回的是引用,否则不能准确返回对象自身
空指针访问成员函数
c++空指针也是可以访问成员函数的,所以调用前要先判断保证健壮性

如上,我们调用时定义了个空指针,看运行是报错的,但是第一个函数输出了,第二个函数func2报错,其实报错的原因就是age默认省略了this->age,然而我们并没有给p指针指向对象,没有创建对象,所以不可能有this指向,所以报错

我们应该如上判断,对于this指针做个判断,当是NULL时做特殊处理
const修饰成员函数
常函数 const修饰的函数,函数内不可修改属性,但是属性声明加mutable可以修改
常对象 const修饰声明的对象,常对象只能调用常函数

如上,我们定义了常函数,注意const的位置是在小括号后花括号前,我们尝试在小括号里修改属性age,会报错,这是因为age等同于this->age,而this指针时指针常量,不可以修改指针指向,再加上const修饰过后,变得this对象不可修改,所以常函数的const本质上是限制了this类对象不可修改

但是我们加上了mutable修饰后就可以修改了,如上。

如上,我们给p加上const修饰,那p就是不可修改的,我们去修改weight就报错,但是如果修改的是mutable的age是可以的。

如上,我们可以看到我们常变量不可以调用非常函数的func2

如上,我们调用常函数func就可以
网友评论