友元函数
在重载复数运算符时可能遇到下列问题:
重载“+”使得double + complex得一个complex。
这是+左边是一个基本数据类型,不能再complex类中定义一个成员函数来解决,这是就要用到全局函数
如图所示:这是一个定义在类外的全局函数,这样就能处理上述问题,但这样编译会报错。
因为这是个全局函数,无法直接访问类的私有类型,也就是c.real 和 c.imag。
这时就要用到友元函数
上图在类中声明了这个全局函数是类的友元函数,这样这个全局函数就可以直接使用类的私有变量了。
注意运算符重载在类中作为成员函数和类外作为全局函数有不同的写法,成员函数中默认了其第一个操作数是类本身。
位移操作符的重载:
将>>和<<重载为能够支持输入输出的运算符
上述是一个重载右位移运算符,重载后支持用
cin >> z1
的方式直接向复数类型数据进行赋值
重载和IO缓冲区有关的运算符需要套注意的地方:
上述代码中均使用了引用,在输入输出流中最好使用引用;另外z1没有使用const进行保护,因为z1为要输入的变量,其值是要修改的。
另外一点,该函数是全局函数,需要声明友元
下面是一个重载输出运算的例子
const的使用
使用const要注意以上4个的语法关系。
1.在引用中使用const要注意const的引用是不能修改的。
2.临时对象的常引用对象
临时对象只能作为常引用的实际参数
在上述代码中
这一行会报错,原因已经在注释中说明(cn1 + cn2是临时对象)
可以看到下述中<<的重载并没有使用常引用
3.const对象的使用
const对象只能调用const成员函数
上图说所示的加法重载没有定义为一个const的成员函数
当const对象调用该成员函数时会报错
4.const成员函数只能调用const成员函数
同样的为了保证逻辑自洽,有下述规定
补充:const成员函数是不能修改对象私有变量的
下述代码会报错
因为real为类的私有变量,该函数却为const成员函数。
报错类型为
另外const成员函数的声明例子如下:
5.类的成员必须在构造函数初始化列表中初始化
错误写法:
正确写法:
‘报错类型为:
总结:
- 临时对象只能作为常引用的实际参数
- const表示只读,使用const有关的语法均要用const相关的手段进行保护。(两点启示 1.构造类的时候能用const尽量用;2.有const类对象时,使用的语法全要用const
this关键字
this关键字在类的成员函数中使用
下面是一个分数类的成员函数,在实现分数的减法的成员函数中用到了this关键字
this指针实现的神奇小原理
图解:
第一行为C++的编译过程
后面为类是如何转化为C语言的。
其中函数部分的转化默认实现了一个this指针(倒数两行)。