美文网首页
C++赋值构造对象时,重载赋值运算符究竟是谁在调用(Boolan

C++赋值构造对象时,重载赋值运算符究竟是谁在调用(Boolan

作者: T4Technology | 来源:发表于2017-07-12 13:51 被阅读39次

    有这样一个类A,有它的两个对象a, b。它重载了赋值运算符。那么A a = b;这样一条简单的语句,你们想过这里的赋值运算符是谁在调用吗?是a吗?。

    重载的运算符代码如下:

    A& A::operator=(const &ra) {
      member = ra.member;
      return *this;
    }
    

    若调用赋值运算符的是a的话,构造函数是没有返回值的,怎么能在构造的时候使用它的成员呢?
    调用者是b的话,就更不可能了,若调用者是b的话,就是把a的值赋给b了。那么作为类A的成员函数,=还有谁能调用呢。

    我说了答案怕被打死。

    这里没有赋值运算符调用。

    这里A a = b;调用的是A的拷贝构造函数。。。在此感谢知乎上vczh和lavinci的倾情解答。
    C++重载运算符的调用者是谁?

    // A.h
    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        A() = default;
        A(const A&);
        A &operator=(const A&);
    };
    
    A::A(const A &a) {
        cout << "I am copy constructor!" << endl;
    }
    
    A& A::operator=(const A&) {
        cout << "I am =" << endl;
    }
    // AMain.cpp
    #include "A.h"
    
    int main() {
        A b;
        A a = b;
    }
    

    输出结果:
    D:\c++>g++ -o a AMain.cpp -std=c++11

    D:\c++>a
    I am copy constructor!


    有个相同的问题,<< 运算符重载返回ostream&,那cout << a;这条语句的调用者是谁?

    实际上问这个问题的我是没有从java的思想转为c++的思想。在java里,凡是方法一定有对象或者类(静态方法)在调用它。而这个操作符接收两个参数(ostream&,const A&),它是A的友元,是一个全局函数。。。所以A根本没有对象调用它。

    在文末再提一个我不解的问题,重载函数一定是函数名相同,返回值相同或为子类,参数列表不同,而c++没有共同的基类Object,那为什么重载运算符可以有不同的参数类型,和不同的返回值?希望你们来为我解答

    相关文章

      网友评论

          本文标题:C++赋值构造对象时,重载赋值运算符究竟是谁在调用(Boolan

          本文链接:https://www.haomeiwen.com/subject/ytkbhxtx.html