局部变量和临时对象不能作为返回值
operator+()
operator*()
重载运算符的限制:
- 重载的运算符必须有一个操作数是用户自定义的类型
- 使用运算符是不能违反运算符原来的句法规则
- 不能创建新运算符
- 不能重载以下运算符
- sizeof
- .
- *
- ::
- ?:
- typeid
- const cast
- dynamic cast
- reinterpret
- static cast
- 大多数的可以重载的运算符都可以通过成员或非成员函数进行重载,但是以下运算符只能通过成员函数进行重载:
- = 赋值
- () 函数调用
- [] 下标
- -> 指针访问类成员
访问类中私有数据成员或者成员函数的途径是公有函数。也可通过友元进行访问。
友元函数
友元类
友元成员函数
类成员函数重载二元运算符,其中一个参数不是类对象时,运算的第一个参数必须是类对象。
解决方法:
非类成员函数重载运算符
但是,非类成员函数不能访问对象的私有成员
友元函数的出现就是为了解决这个问题
友元函数特性:
- 使用方法:在类中声明,函数前面添加friend
- 不能使用类对象调用
- 和成员函数的访问权限相同
只有类声明可以控制哪些函数是友元
强制类型转换,函数无返回值无参数
重载输出运算符,返回值是ostream对象的引用,参数ostream对象,声明为友元函数。
重载运算符是选择为成员函数还是选择为非成员函数呢?
- 对于某些运算符选择成员函数时唯一的选择
- 其他情况两种格式没有太大的区别
当类的构造函数只有一个参数时,可以直接赋值,将其他类型自动转换为类类型。反之不能自动转换,需要用户定义强制类型转换。
任何一个接收唯一参数的构造函数都一个被用作转换函数。
- String类的构造函数只有一个char*参数,可以写作:
String bean = “adg”; - 如果该构造函数前使用了关键字:explicit。则该构造函数只能用于显式类型转换。
String bean = String(“adg”);
转换函数必须是类方法,
转换函数不能指定返回类型
转换函数不能有参数
eg:operator double();