类的友元:
允许它们访问类对象中非公共的成员,就好像它们是类的成员一样,这种函数称为类的友元。友元可以访问类对象的任意成员。
可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。
- 友元函数
- 友元类
友元函数:
友元函数是一种定义在类外部的普通函数,但它需要在类体内进行说明
为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下:
friend 类型 友元函数名(参数表);
友元的作用在于提高程序的运行效率,但他破坏了C++的封装性
友元函数的注意事项
- 友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。
- 友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。
- 某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。
- 友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性
友元类
如果某类B的成员函数会频繁的存取另一个类A的数据成员, 而A的数据成员的Private/Protectd限制造成B存取的麻烦, B只能通过Public的成员函数进行间接存取
把B做成A类的友元类,即A类向B类开放其Private/Protectd内容, 让B直接存取
友元类:一个类可以作另一个类的友元
友元类的所有成员函数都是另一个类的友元函数
友元类的定义:
friend class 类名;
运算符重载的概念
运算符重载类似于函数重载
运算符重载允许把标准运算符(如+、—、*、<等)应用于定制数据类型的对象
什么情况下需要考虑运算符重载?
需要用运算符操作自定义类的对象时,如对象之间直观自然,可以提高比较大小等,通过重载支持类的运算程序的可读性,体现了C++的可扩充性
运算符重载函数的定义2-1
作为类的成员函数或友元函数、作为一般函数(很少用)
( ) [ ] -> = 的重载函数必须是类的成员函数
成员函数原型的格式:
函数类型 operator 运算符(参数表);
成员函数定义的格式:
函数类型 类名::operator 运算符(参数表){
函数体;
}
以成员函数的方式重载运算符
单目运算符:不带参数,该类对象为唯一操作数
双目运算符:带一个参数,该类对象为左操作数、参数为右操作数
运算符重载函数的定义2-2
友元函数原型的格式:
friend 函数类型 operator 运算符(参数表);
友元函数定义的格式:
函数类型 operator 运算符(参数表){
函数体;
}
以友元函数的方式重载运算符
单目运算符:带一个参数,该参数为唯一操作数,是自定义类的对象 ++(a)
双目运算符:带两个参数,第一个参数为左操作数、第二个参数为右操作数,至少有一个参数为自定义类的对象
+(a, b)
自增、自减运算符重载2-1
在C++中,单目运算符有++和--,它们是变量自动增1和自动减1的运算符。在类中可以对这两个单目运算符进行重载。
前置自增和前置自减的重载
成员函数的方式重载,原型为:
函数类型 & operator++();
函数类型 & operator--();
友元函数的方式重载,原型为:
函数类型 & operator++(类类型 &);
函数类型 & operator--(类类型 &);
当函数要返回开辟的空间时,返回值类型不能取引用,因为开辟的空间等到函数结束时会释放掉,取引用与他共用一片空间.
自增、自减运算符重载2-2
后置自增和后置自减的重载
成员函数的方式重载,原型为:
函数类型 operator++(int);
函数类型 operator--(int);
友元函数的方式重载,原型为:
函数类型 operator++(类类型 &,int);
函数类型 operator--(类类型 &,int);
使用前缀运算符的语法格式
++<对象>;
使用后缀运算符的语法格式
<对象>++;