簡體   English   中英

聲明期間的 C++ 賦值運算符

[英]C++ assignment operator during declaration

這是我的 Hero 類,帶有兩個重載賦值運算符 - Hero to Hero 和 String to 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")的構造函數,所以它是無效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM