声明过程中的C++赋值运算符



这是我的类Hero,有两个重载赋值运算符——Hero到Hero和String到Hero。

#include <iostream>
class Hero {
private:
int         x;
std::string name;
public:
Hero():x(42), name("JohnDoe") {};
Hero(int a, std::string b):x(a), name(b) {};

void print(){
std::cout<<name<<" : "<<x<<"n";
}
const Hero &operator =(const Hero &other){
std::cout<<"Overloaded Assignment class to class! n";
x    = other.x;
name = other.name;
return *this;
}
const Hero &operator =(const std::string N){
std::cout<<"Overloaded Assignment from string! n";
x    = 777;
name = N;
return *this;
}
};
int main(){
Hero foo(42, "Hercules");
Hero zak = foo; // Regular assignmnet, not the overloaded

// Hero bar = "HelloWorld";  <<<<  Illegal
Hero zoo(HelloWorld",42);  <<  Ok, but here we use constructor, not an assignment operator
Hero bar; 
bar =  "Ayax";  // "Overloaded Assignment from string! n";

zak = bar; //"Overloaded Assignment class to class! n";
zak.print();
bar.print();
}

产生的结果:

Overloaded Assignment from string! 
Overloaded Assignment class to class! 
Ayax : 777
Ayax : 777

为什么我不能在声明中使用重载运算符进行变量初始化?

在行中,Hero zak = foo;编译器使用非重载运算符,而字符串Hero bar = "HelloWorld"只是非法的。

在定义处初始化对象时,即使使用=语法,也不会使用赋值。

当你这样做:

Hero zak = foo;

它相当于:

Hero zak(foo);

这是复制初始化,因此调用复制构造函数。


的问题

Hero bar = "HelloWorld";

它相当于:

Hero bar = Hero("HelloWorld");

这反过来相当于:

Hero bar(Hero("HelloWorld"));

由于您没有Hero("HelloWorld")的构造函数,所以它是无效的。

最新更新