3
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 参数的构造,则发生编译错误。
所以,我认为它与构造函数有关。是对的吗?

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

4

1 回答 1

9

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

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;
};

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

于 2011-01-22T08:55:23.247 回答