【简述】
本章主要包括以下几方面,运算符重载,友元函数,<<重载,类的自动转换和转换函数
【知识点】
1.运算符重载形式:operatorop(argumentlist) EG:operator+()
2.返回类的声明(不会改变数据的那种)
Time sum(const Time &t) const ——说明该函数不会修改数据成员
Time Time::sum(const Time &t) const —— 返回类型 域名::函数
3.返回值如果返回的局部变量或临时对象,不能返回引用,因为返回后放空。类似指正
4.重载函数
total = A.operator+(B);
相当于
total = A + B;
这也是为什么要重载运算符,这种重载方法,类名必须在左侧,如果基本类型则有问题,如果要基本类型在左,则需要用友元函数;
5.重载的运算符,其中一个操作数必须是自定义,否则和基本类型运算符冲突,(如不可重载 int-int)
6.非成员函数重载,如友元函数,但=,(),【】,-》必须用成员函数
7.友员函数的原型要声明在对应类中,并加friend;实现时,不用域,因为非成员函数,亦不需要friend关键字
8.<<重载时,返回引用,这样可以使用 COUT<<A<<B<<ENDL ,形式,如果直接返回对象就不能这么用
由于基类引用可以用于扩展类,所以ostream得引用,可以返回fotream的流,P394
9.COUT<<A; 实际上相当于operator<<(cout,a);
friend std::ostream & operator << (std::ostream & os, const Time &t)
10.非成员函数的形参数目和操作数相同,而成员函数少1,因为存在隐式调用。
11.类中直接定义的简短函数将被作为内联
12.枚举可以在类声明时定义,使用变量注意域,如友元函数不在命令空间,变量使用全名限定
13.如果函数返回或计算出一个新类,要考虑用构造函数,这样可以保证正确性。
14.一元的运算符重载
VECTOER OPERATOR-() CONST
VECTOER VECT::OPERATOR-() COSNT {}
【转换相关】
1.C++中,接受一个参数的构造函数为将类型与该参数相同的值得类提供转换,作为转换函数。(隐式转换)
my=1.1 则直接调用,生成临时对象,前提是有一个参数的构造函数。
2.explicit 关闭隐式转换
3.P413,eg:什么情况使用stonewt(double)
A.将stonewt对象初始化为double值, Stonewt Jumbo(1.1)
B.double值赋给对象,mycat = 1.1
C将double值穿个接受Stonewt的参数 func(1.1),FUNC接受类
D.返回时声明为Stonewt的函数, return 11.1
E.以上倾向,可以向上合理转换的的情况,如把1.1都换成1.
4.可以int = Stonwt么,可以,但不是用构造函数,用到转换函数。
double A = double (Stonewt),前提是定义了转换函数,那么怎么定义ne?
operator typename()
限制:必须是类成员方法,无入参,无返回类型
CLASS A
{
PUBLIC:
operator int() const;
}
A::operator int() const
{
return xx,
}
这样是cout<<可以直接指定类对象名称,如果只有一个转换函数,没有二义性,则自动转换为double
5.最后,多用显示,少用隐式