复制构造函数未被调用
Copy Constructor is not invoked
可能重复:
为什么在这种情况下不调用复制构造函数?
考虑下面的示例程序:
#include <iostream>
using namespace std;
class sample
{
private:
int x;
public:
sample(int a=0) : x(a)
{
cout << "default ctor invokedn";
}
sample(const sample& obj)
{
cout << "copy ctor invokedn";
}
};
int main()
{
sample s2 = sample(20); //Line1
sample s3 = 20; //Line2
return 0;
}
在Line1
中,首先用参数20调用sample
类的构造函数explicitly
。然后我期望调用复制构造函数来初始化s2。
在第2行中,首先用参数20调用sample
类的构造函数implicitly
。在这里,我还期望调用复制构造函数来初始化s2。
在这两种情况下,复制构造函数都没有被调用?为什么会发生这种情况?我相信,我对复制构造函数调用的理解有问题。有人能纠正我哪里出了问题吗?
这是意料之中的事。这叫做复制省略。
您的期望是正确的,但他们在C++中做了一个例外(为了性能),允许编译器将您的表达式视为一个实例的直接初始化,同时绕过复制构造函数。
在第一行中,它不调用复制构造函数,因为您不复制对象。您正在将一个对象指定给另一个对象。C++提供默认=执行浅拷贝的运算符。这是隐含调用的。构造函数是为右手对象调用的,默认构造函数是为左手对象调用的。在调用默认=运算符之后。
对于第2行,它使用构造函数,该构造函数接受您定义的int参数。它实际上是转换器构造函数,因为它接受一个整数并创建类的对象。这就是为什么c++将其用作转换器构造函数的原因,当您尝试为对象分配一个整数时,c++会正确地调用此转换器构造函数。
我希望这能帮助你理解。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素