c++ 重载运算与类型转换

1. 基础概念ios

重载的运算符是具备特殊名字的函数:(重载运算符函数,运算符函数。重载运算符)函数

依次包含返回类型,函数名(operator=),参数列表,函数体。this

只有重载的函数调用运算符operator()才能有默认实参。spa

关于参数的数量,通常来讲,一元运算符有一个参数,二元有两个,三元有三个;指针

可是若是该运算符函数是成员函数,则其中一个运算对象将是本类对象,第一个参数隐式绑定到this常量指针上,不显示在参数列表中。成员运算符函数的参数数量比运算符对象少一个。code

  HasPtr& operator=(const HasPtr& right){
    mString = right.mString;
    return *this;
  }

运算符函数要么是一个类类型的成员函数,要么它必有类类型的参数。这是由于不能重载内置类型之间的运算(能够重载类类型与类类型之间的运算,类类型和内置类型之间的运算)。对象

不能本身发明运算符,不能改变运算符的优先级,也不能改变运算符原始运算对象的个数,例如&运算符能够用于一元运算,也能够用于二元运算,则根据参数数量判断是一元仍是二元,可是!操做符永远不可能重载为二元运算符。blog

2. 一个例子string

能够先看一个简单的例子,重载了类类型Data的 "+" 二元运算符,该运算符函数不是成员函数,所以,参数为两个类类型,返回的是类类型中string成员的拼接版(中间加入--)io

#include <iostream>
#include <string>

using namespace std;

class Data{
public:
  Data(){}
  Data(string str){
    this->str = str;
  }
  string str;
};

string operator+(const Data& data1, const Data& data2){
  string str = data1.str + " -- " + data2.str;
  return str;
}

int main(){
  Data data1("hello"), data2("slam"), data3("!!!");
  cout << data1+data2+data3 << endl;
}

输出:

hello -- slam -- !!!

若但愿将操做符函数定义为Data类的成员函数,则须要改动以下:

#include <iostream>
#include <string>

using namespace std;

class Data{
public:
  Data(){}
  Data(string str){
    this->str = str;
  }
  string str;
  Data operator+(const Data& data);
};

// 只有将返回值定义为Data类型,表达式才能使用连续运算的形式data1+data2+data3
Data Data::operator+(const Data& data){
  str = str + " -- " + data.str;
  return *this;
}

int main(){
  Data data1("hello"), data2("slam"), data3("!!!");
  cout << (data1+data2+data3).str << endl;
}

输出结果相同。

注意在第一个例子中(非成员函数)

data1+data2 等价于 operator+(data1, data2)

第二个例子中(成员函数调用)

data1+data2 等价于 data1.operator+(data2)

 

3. 经常使用重载运算符

1) 输入输出运算符 << >>

2) 算数和关系运算符 == != <

3) 赋值运算符 = 

4) 下标运算符 []

5) 递增和递减运算符 ++ --

6) 成员访问运算符 * ->

7) 函数调用运算符 () 

相关文章
相关标签/搜索