14.1 Basic Concepts(重载操作符和转换基本概念)
operator(), 一个重载操作可能没有默认参数
当一个重载函数是成员函数时,this被绑定到左边操作对象。
一个操作函数要么的类的成员,要么至少有一个类类型
int operator+(int, int);//不能重新定义内置类型为int
一个重载操作符和对应的内置类型操作有相同的优先级哥结合性。
通常来讲,逗号, 取地址,逻辑或操作符不应该被重载;
选择成员或者非成员执行
- 赋值,下标,调用和成员访问箭头操作符必须被定义为成员
- 复合赋值操作符通常应该定义为成员,但和赋值操作符不同的是,他们不必必须定义为成员。
- 改变对象状态或者和他们给出类型密切相关的操作符,应该被定义为成员,像自增和自减,解引用。
- 这些可能会转换为任意一边的对称操作符,像算术,相等,关系,和位操作符,通常应当被定义为普通非成员函数。
当我们定义一个操作符为成员函数,左边的运算对象必须是一个类对象。
string s = "world"; string t = s + "!";//ok string u = "hi" + s;//error,如果 + 是一个成员函数
重载运算符和内置运算符的不同:
- 重载运算符至少需要一个class或者枚举类型的操作数
- 重载运算符不保证操作符的运算顺序,例如对&&和||不在具有“短路求值”的特性,两个操作数都要求值,而且不规定操作数的求值顺序。
短路求值
#include <iostream> using namespace std; //expression1 ... expression2... int main() { /* 执行的依据:exp1的真假是否可以判断该语句的真假, 能,则不再判断, 不能,则继续判断。 */ int a = 1; cout << "a的值:" << a << endl; true && (a = 5);//exp1为真,继续执行后面的exp2 cout << "a的值:" << a << endl; false && (a = 10);//exp1为假,后面的不再执行 cout << "a的值:" << a << endl; true || (a = 15);//exp2不再执行 cout << "a的值:" << a << endl; false || (a = 20);//exp2执行 cout << "a的值:" << a << endl; system("PAUSE"); return 0; }

#include <iostream> using namespace std; //expression1 ... expression2... int main() { /* 执行的依据:exp1的真假是否可以判断该语句的真假, 能,则不再判断, 不能,则继续判断。 */ int a = 1; (a > 5) && (a = 10); cout << "a的值为:" << a << endl; (a > 5) || (a = 15); cout << "a的值为:" << a << endl; system("PAUSE"); return 0; }


浙公网安备 33010602011771号