14.1 Basic Concepts(重载操作符和转换基本概念)

operator(), 一个重载操作可能没有默认参数

 

当一个重载函数是成员函数时,this被绑定到左边操作对象。

 

一个操作函数要么的类的成员,要么至少有一个类类型

int operator+(int, int);//不能重新定义内置类型为int

 

一个重载操作符和对应的内置类型操作有相同的优先级哥结合性。

 

通常来讲,逗号, 取地址,逻辑或操作符不应该被重载;

 

选择成员或者非成员执行

  1. 赋值,下标,调用和成员访问箭头操作符必须被定义为成员
  2. 复合赋值操作符通常应该定义为成员,但和赋值操作符不同的是,他们不必必须定义为成员。
  3. 改变对象状态或者和他们给出类型密切相关的操作符,应该被定义为成员,像自增和自减,解引用。
  4. 这些可能会转换为任意一边的对称操作符,像算术,相等,关系,和位操作符,通常应当被定义为普通非成员函数。

 

当我们定义一个操作符为成员函数,左边的运算对象必须是一个类对象。

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;
}

posted @ 2018-12-14 10:16  Hk_Mayfly  阅读(201)  评论(0)    收藏  举报