对象成员
定义
类中的成员可以是另一个类的对象,我们称该成员是对象成员
此时A为对象成员
静态成员
特点
重点:所有对象都共享同一份数据
编译阶段就分配内存,在全局区
类内生命,类外初始化操作
访问方式
1、通过对象进行访问
2、通过类名进行访问
注意
静态成员变量也是有访问权限的,私有权限,类外就访问不到了
静态成员函数
访问方式
对象访问,类名访问
静态成员函数也是有访问权限的,如果在类中有private的静态函数,那么在类外是访问不到这个静态函数的
成员变量和成员函数
当类里面是空的时候,生成了一个对象的话,已经会占一个字节,因为编译器hi对每个空对象也分配一个字节空间,是为了区分空对象占内存的位置。每个空对象也会有一个独一无二的内存地址
如果类里面声明了静态变量,那么这个变量不属于类对象上,所以生成的字节就是除静态变量以外的字节数
如果里面有函数的话,也不影响类所占用的字节数,因为成员函数又是存在另一个区域
this指针
每个非静态成员函数只会诞生一份函数实例,多个同类型代码共用一块代码,但是这块代码如何区别哪个对象调用的呢?
this指针指向被调用的成员函数所属的对象
this指针是隐含在每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
用途
当形参和成员变量同名时,可以用this指针来区分
在类的非静态成员函数中返回对象本身,可使用return *this,因为this终究是个指针,*this就是解引用的过程
1、名称冲突
用this来解决,谁调用的有参构造,this就指向谁
2、返回对象本身用 *this
class Person{
}
这里person后面必须引用,因为这样的话,就是改的都一样
如果不加引用,那么就相当于一个拷贝函数,拷贝函数返回的是拷贝后的那个对象
空指针访问成员函数
这样写会崩的,因为p并没有生成一个对象,仅仅是一个空指针,然而又让一个空的东西指向它里面的年龄。显然不现实,所以会报错,更改方式就是在上面一个函数上面写一个this 是否为NULL的判断语句,如果为空的话,直接return;即可
const修饰成员函数、
常函数
在成员函数后头加的const,是修饰this的指向,这让指针指向的值不可以修改,想要修改就要在变量生命时候,加关键字
常对象
常对象不可以调用普通成员函数,因为普通成员函数可以修改属性
总结
友元
意义
让一个函数或者类,能够访问一个类中私有成员
关键字
friend
实现
全局函数做友元
类做友元
成员函数做友元
类做友元:
new building是因为初始化的是building的指针
成员函数做友元