gpt4 book ai didi

C++ 子类和运算符= : infinite loops and unexpected calls

转载 作者:行者123 更新时间:2023-11-27 23:23:56 25 4
gpt4 key购买 nike

下面的代码进入无限循环。

#include <string>
#include <iostream>
using namespace std;

class A{
public:
A(){
cout << "Normal constructor" << endl;
}
A(const A& moo){
cout << "It's a constructor!" << endl;
operator=(moo);
}
void operator=(const A& moo){
cout << "Calling A::Operator=" << endl;
}
};

class B : public A{
public:
B(){}
B(const A& thea){
cout << "Gotshere" << endl;
operator=(thea);
}
};


int main(){

B b;

b = A();

}

无限循环的输出在“Normal constructor”和“Gotshere”之间循环。我从 main 函数中猜测,当将 A 分配给 B 类时,它会尝试调用 B::operator =,它不存在,因此它再次调用 B(const A&)

我不明白为什么要调用 A()。有人知道吗? EDIT 应该已经清楚了,A() 在无限循环中被重复 调用。

当然,解决方法是放置 B::operator=(const A&),但我很想知道它为什么这样做。

此外,我为 B 类添加了一个运算符:

void B::operator=(const A&) { cout << "That should fix things. A::Operator=" << endl; }

它确实解决了问题,但是当我执行 B b; b = B(),我得到 Calling A::operator= 而不是 `B::operator=' 的输出。这是为什么?

最佳答案

B::operator= 接受一个 B&,但你传递给它一个 A&,所以它必须从 A 构造一个新的 B,这会导致无限递归。

关于第二个问题。你定义了B::operator=(const A &),但是一个取const B &的赋值运算符仍然会自动生成,自动生成的赋值运算符调用基础赋值运算符。

关于C++ 子类和运算符= : infinite loops and unexpected calls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10763566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com