C++ 操作符重载

Posted LarryZeal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 操作符重载相关的知识,希望对你有一定的参考价值。

题外话,贴个白噪音网站 Rainy Mood ,敲代码的时候可以听,就像不存在一样

 

言归正传

在C++复制控制那篇帖子里面,有提到操作符的功能实际上都是被定义出来的。--这一点其实可以推广到其他的语言,只不过其他语言禁止了自定义操作符。

先说个总结认识:操作符本质上是函数,只不过不同于普通函数,标准里单独规定了怎么写怎么调用它。

前提:

  语言底层实现了内置类型的操作符定义,并且,不允许重新自定义内置类型的操作符。

  为了保证内置类型的操作符不被重载,编译器对操作符函数做出了限制---这个稍后再说。

 

规定一:

  操作符函数都是以operator再加上操作符作为函数名的,如operator+、operator=等等。

  只要正确的定义(重载)了操作符函数,那么相应类型去调用操作符时,本质上就是调用这个操作符函数。--例如复制控制那篇里提到过的赋值操作符重载。

  如:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

class Person{
private:
    string name;
    int age;
public:
    Person(string _name="anonymous", int _age=18):name(_name),age(_age){} //带默认实参的构造函数
    Person operator+(const Person &person_b){
        Person person; //default 
        person.name = name + person_b.name; // 
        person.age = age + person_b.age;
        return person;
    }

    string toString(){
        ostringstream out;
        out<<"name=["<<name<<"], age=["<<age<<"]";
        return out.str();
    }
};

int main(){
    Person p1;
    Person p2;

    Person p3,p4;
    p3=p1+p2; // operator +
    p4=p1.operator+(p2); //

    cout<<"p3:"<<p3.toString()<<endl;
    cout<<"p4:"<<p4.toString()<<endl;

    return 0;
}

  上面,p1+p2 p1.operator+(p2) 是完全一致的,也就是说编译器规定了遇到+就会去调用operator+() 。其他的操作符同理。

 

------突然没了性质,还是继续看资料吧

 

以上是关于C++ 操作符重载的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL 基础及应用 模板与操作符重载

C++ 操作符重载

C++学习基础八——重载输入和输出操作符

C++中前置操作符和后置操作符的重载

C++操作符=重载继承,基类中定义了,派生类中是不是需要重新定义? [复制]

C++运算符重载