gpt4 book ai didi

c++ - 为什么在分配发生时调用参数化构造函数?

转载 作者:行者123 更新时间:2023-11-30 00:47:04 25 4
gpt4 key购买 nike

我的问题是关于最后一条语句,即 return 0;

之前

为什么在我们尝试将 int 值分配给对象时调用 parametrize 构造函数。

我的代码:

#include<iostream>
using namespace std;
class Test {
private:
int i;
public:
Test(int s=0):i(s) {
cout<<"param ctor: "<<i<<endl;
}
};

int main()
{
Test a; //param ctor called
Test b(5); //param ctor called
//b(a); //error as we have not implemented copy ctor
b=a; //compiler provided assignment opr. called
b=100; //why param ctor called for this.??
return 0;
}

输出:

  param ctor: 0
param ctor: 5
param ctor: 100

最佳答案

原因很简单:每个X都有一个拷贝构造函数(一个取X的构造函数)和一个拷贝赋值运算符(一个赋值运算符采用 X)。如果您不自己声明这些,编译器会隐式地为您声明它们。在某些情况下,它们被定义为已删除(这意味着使用它们是错误的),但它们始终存在。

所以当你这样做的时候:

b = 100;

它被有效地翻译成这样:

b.operator=(100)

并搜索operator= 的最佳匹配重载。实际上只有一个重载:隐式声明的复制赋值运算符 Test& Test::operator=(const Test &),因此编译器会检查它是否可以转换参数 100 赋值运算符的参数类型 const Test &。事实证明它可以,多亏了转换构造函数 Test::Test(int),所以这就是最终调用的内容。

如果你想禁用这种行为,你可以将构造函数标记为explicit。这将防止它被用于隐式转换,例如将 100 转换为赋值运算符参数的类型。

关于c++ - 为什么在分配发生时调用参数化构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35919559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com