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

有这样一个类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,那为什么重载运算符可以有不同的参数类型,和不同的返回值?希望你们来为我解答

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容