【问题标题】:How can the assignment from int to object be possible in C++?在 C++ 中,从 int 到 object 的赋值是如何实现的?
【发布时间】:2011-06-13 14:38:44
【问题描述】:
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;
}

大家好

只是我声明了一个像上面这样的简单类。
之后,我将 int 值分配给该类的对象,然后它就起作用了!
(我打印了它的值。它被正确存储了)

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

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

【问题讨论】:

  • 在 C++ 中,如果没有参数,最好不要放置 void。你也可以让你的号码获得一个 const 函数。

标签: c++ constructor variable-assignment assignment-operator


【解决方案1】:

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

p1 = 20;

被解释为

p1.operator= (20);

这又被解释为

p1.operator= (phone(20));

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

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

    private:
        int num;
};

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

【讨论】:

  • 我要添加一个注释,虽然这种行为“非常奇怪”,但它允许您编写 func(std::string s);(或 func(const std::string& s))并将它们称为 @987654330 @.
  • @Chris Lutz- 你说的完全正确。 “真的很奇怪”,我的意思是“在这种情况下,这真的很奇怪。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2020-08-14
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多