为什么给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) { /* ... */}
然后它不再是一个转换构造函数,如果没有强制转换(或您提供的自定义赋值运算符),赋值将无法实现。
密码是:
#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) { /* ... */}
然后它不再是一个转换构造函数,如果没有强制转换(或您提供的自定义赋值运算符),赋值将无法实现。