目录
一、友元
1.1什么是友元?
1.2如何使用友元?
1.3使用友元
1.4使用友元注意事项
二、初始化列表
2.1什么是初始化列表?
2.2为什么要有初始化列表?
2.3使用初始化列表
2.4注意事项
一、友元
1.1什么是友元?
友元是一种用来突破封装的手段,使用友元可以访问到被封装的数据
1.2如何使用友元?
比方说,我有一个类叫A,它有一个成员为int _a;而这个成员我把它封装到private中了,那么在类外面显然是不能够正常访问到_a这个变量的,但是我们可以通过友元访问到,在类里面输入这串代码:friend+需要访问私有成员的函数名,之后这个函数便可以在类外面访问到A这个类的私有成员
1.3使用友元
正常情况下我们想直接拿到A中的_a编译器便直接报错了
可以看出,使用友元建立链接之后test便可以直接访问到A这个类中的_a
1.4使用友元注意事项
(1)友元函数可访问类的私有和保护成员,但不是类的成员函数
(2)友元函数不能用const修饰
(3)友元函数可以在类定义的任何地方声明,不受类访问限定符限制
(4)一个函数可以是多个类的友元函数
(5)友元函数的调用与普通函数的调用原理相同
二、初始化列表
2.1什么是初始化列表?
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。如此便可以初始化对应类的成员变量
2.2为什么要有初始化列表?
其实之所以要有初始化列表是因为构造函数直接写入无法定义const,引用这些一定义就必须要初始化的变量
2.3使用初始化列表
不使用初始化列表无法初始化const变量
使用初始化列表便可以解决这一问题
2.4注意事项
(1) 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
(2)类中包含以下成员,必须放在初始化列表位置进行初始化:引用成员变量,const成员变量,自定义类型成员(且该类没有默认构造函数时)(3)尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化
(4)成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
第四点验证:
#include<iostream>
using namespace std;
class A
{
public:A():_a(666), _b(_a),_c(10){}void Print(){cout<<_a<<" "<<_b<<" "<<_c<< endl;}
private:int _b;int _a;const int _c;
};
int main()
{A a1;a1.Print();
}
可以看出,如果是根据初始化列表的顺序进行初始化,那么输出的值应该是666,666,10
实际上为666,随机值,10,这是因为编译器先定义_b,再定义_a,最后定义_c
调换一下_b和666的位置,果然输出666 666 10
综上所述可以证明 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关