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