如何在C++中从int到object的赋值?

Jay*_*ark 0 c++ constructor variable-assignment assignment-operator

class phone {  
    public:  
        phone(int x) { num = x; }
        int number(void) { return num; }
        void number(int x) { num = x; }

    private:
        int num;
};

int main(void)
{
    phone p1(10);

    p1 = 20;    // here!

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

嗨,大家好

我刚刚宣布了一个类似上面的简单类.
之后我将int值赋给了该类的对象,然后就可以了!
(我打印了它的价值.它存放得当)

如果没有带有int参数的构造,则发生编译错误.
所以,我认为它与构造函数有关.是对的吗?

请给我一个很好的解释.
谢谢.

tem*_*def 6

这是合法的,因为C++解释了可以使用类型的单个参数调用的任何构造函数,T作为从Ts 隐式转换为自定义对象类型的方法.在你的情况下,代码

p1 = 20;
Run Code Online (Sandbox Code Playgroud)

被解释为

p1.operator= (20);
Run Code Online (Sandbox Code Playgroud)

反过来,这被解释为

p1.operator= (phone(20));
Run Code Online (Sandbox Code Playgroud)

这种行为非常奇怪,而且几乎肯定不是你想要的.要禁用它,您可以标记构造函数explicit以禁用隐式转换:

class phone {  
    public:  
        explicit phone(int x) { num = x; }
        int number(void) { return num; }
        void number(int x) { num = x; }

    private:
        int num;
};
Run Code Online (Sandbox Code Playgroud)

现在,在进行隐式转换时不会考虑构造函数,上面的代码会导致错误.

  • 我会添加一个注释,虽然这种行为"非常奇怪",但它允许你编写`func(std :: string s);`(或`func(const std :: string&s) `)并将它们称为`func("literal");`. (2认同)
  • @Chris Lutz-你是完全正确的."真的很奇怪",我的意思是"在这种情况下,这真的很奇怪." (2认同)