声明期间的 C++ 赋值运算符

2024-04-19

这是我的 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")这是无效的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声明期间的 C++ 赋值运算符 的相关文章

随机推荐