Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;声明期间的赋值运算符_C++_Operator Overloading - Fatal编程技术网

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

C++ C++;声明期间的赋值运算符,c++,operator-overloading,C++,Operator Overloading,这是我的类英雄,有两个重载赋值操作符-英雄对英雄和字符串对英雄 #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(){

这是我的类英雄,有两个重载赋值操作符-英雄对英雄和字符串对英雄

#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();
}
为什么不能在声明中使用重载运算符进行变量初始化


行中,Hero zak=foo编译器使用非重载运算符,字符串
Hero bar=“HelloWorld”
是非法的。

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

当您这样做时:

Hero zak = foo;
这相当于:

Hero zak(foo);
Hero bar = Hero("HelloWorld");
Hero bar(Hero("HelloWorld"));
这是复制初始化,因此调用复制构造函数


问题在于

Hero bar = "HelloWorld";
这相当于:

Hero zak(foo);
Hero bar = Hero("HelloWorld");
Hero bar(Hero("HelloWorld"));
这反过来相当于:

Hero zak(foo);
Hero bar = Hero("HelloWorld");
Hero bar(Hero("HelloWorld"));

由于您没有用于
Hero(“HelloWorld”)
的构造函数,因此它是无效的。

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

当您这样做时:

Hero zak = foo;
这相当于:

Hero zak(foo);
Hero bar = Hero("HelloWorld");
Hero bar(Hero("HelloWorld"));
这是复制初始化,因此调用复制构造函数


问题在于

Hero bar = "HelloWorld";
这相当于:

Hero zak(foo);
Hero bar = Hero("HelloWorld");
Hero bar(Hero("HelloWorld"));
这反过来相当于:

Hero zak(foo);
Hero bar = Hero("HelloWorld");
Hero bar(Hero("HelloWorld"));

由于您没有用于
英雄(“HelloWorld”)
的构造函数,因此它是无效的。

初始化总是调用构造函数而从不赋值运算符,
=
的存在是误导性的。初始化总是调用构造函数而从不赋值运算符,
=
的存在是误导性的。