友元:可以访问私有权限下的一种代码
全局函数作友元:
我们创建了两个属性,并且通过无参构造函数给属性赋了值, 这个时候再创建一个goodgay类,形参是应用的buil1的对象,用这个引用的对象调用属性。所以下面在使用goodgay这个函数时候,传入的实参应该是创建出来的build对象。
目前来说只能调用public,如果想要调用私有下的属性那么我们需要使用友元,就是将调用私有属性的函数的声明放在class下面的头行,前面加一个friend关键字就可以了
这个代码还是挺简单的,是要思路对了就很好理解了,我们先创建一个Building的对象,给它属性以及无参构造函数,我们在下面书写goodgay函数,给它传入Building的对象(我们可以使用引用或者指针的方式),给它传入对象后我们就可以使用Building里面的属性通过我们传入的对象。
额外的一个知识,如何在将无参构造函数放到类外实现
下面这个是还在类内
下面是转换后的代码 ,它没有在();后面紧跟{}然后在中括号里面赋值,而是转移到全局函数里面,为了声明它的类是Build,所以在前面加了一个Build::
类作友元
当一个类中创建另一个类的对象有两张方式
1:当直接在栈上创建对象时(例如,Building build;
),对象的内存分配和初始化是由编译器自动处理的,您不需要(也不能)在构造函数中手动分配内存。编译器会为build
对象在栈上分配足够的内存,并调用Building
类的构造函数(如果有的话)来初始化这块内存。如果Building
类没有显式定义构造函数,编译器会生成一个默认构造函数来完成初始化工作。(一般情况下就是这种直接创建)(直接在栈上创建对象时,对象的内存分配和初始化是自动的)
2:使用new的方法创建对象,因为new出来的是一个地址,所以我们先创建一个build的指针,后面在默认构造函数里面new出来对象(
- 当您使用
new Building;
时,您实际上是在堆(heap)上为Building
类型的新对象分配了内存,并返回了一个指向该内存的指针。 - 在这种情况下,您确实需要在某个地方(不一定是默认构造函数,但通常是类的构造函数或某个初始化函数中)来执行这个
new
操作,因为默认构造函数不会自动为您执行new
。 - 您需要负责在适当的时候使用
delete(析构函数)
来释放这块内存,以避免内存泄漏。
)