为什么给class的对象赋整数值时调用参数化构造函数?

Why is parameterized constructor called, when we assign an integer value to an object of a class?

密码是:

#include<iostream>
using namespace std;

class Integer
{
    int num;

    public:
        Integer()
        {
            num = 0;
            cout<<"1";
        }
        
        Integer(int arg)
        {
            cout<<"2";
            num = arg;
        }
        int getValue()
        {
            cout<<"3";
            return num;
        }

};

int main()
{
    Integer i;
    i = 10;  // calls parameterized constructor why??
    cout<<i.getValue();
    return 0;

}

在上面的代码中,语句i=10调用了参数化构造函数。你能解释一下吗?

正在调用参数化构造函数,因为创建了临时 Integer 对象,然后将其分配给您的 i 对象,例如:

i = Integer(10);

如果您指定赋值运算符,例如:

Integer& operator=(int const val) {
    num = val;
    return *this;
}

参数化的构造函数不会被调用。

您的参数化构造函数是转换构造函数。 C++ 非常乐意让表达式有效,只要它能找到一个合理的转换序列来使事情正常进行。因此,如前所述,10 被转换为 Integer 临时值,然后由生成的 operator= (Integer const&).

的编译器分配。

如果您希望防止构造函数被用于意外转换,您可以将其标记为explicit

explicit Integer(int arg) { /* ... */}

然后它不再是一个转换构造函数,如果没有强制转换(或您提供的自定义赋值运算符),赋值将无法实现。