为什么构造函数没有被多次调用
Why is the constructor not invoked multiple times?
我正在阅读Marshall Cline的C++常见问题解答。
目前正在玩10.5点的代码。
我有这个:
class Fred
{
public:
Fred();
Fred(int x, int y)
{
std::cout << "Fred with two intsn" << std::endl;
};
};
int main()
{
std::vector<Fred>(3, Fred(4,5));
return 0;
}
我本以为《弗雷德有两个整数》会印三次,但只印了一次。为什么——它没有被调用3次吗?
这是您正在调用的vector
构造函数的签名:
vector( size_type _Count, const Type& _Val, const Allocator& _Alloc = Allocator() );
Fred(4,5)
调用您定义的构造函数一次,创建的实例通过引用传递给vector<Fred>
构造函数。然后,它[创建的实例]被复制到向量中3次。复制操作是通过使用(默认)复制构造函数来执行的;所以你的构造函数不会被调用不止一次。
在编写Fred(4,5)时,您调用了一次用户定义的构造函数。它被传递给向量的构造函数,后者将它复制3次到3个Fred中。这使用复制构造函数,而不是默认或自定义构造函数。如果您不编写自己的复制构造函数,则会隐式添加一个,赋值操作也是如此。下面,我添加了一个复制构造函数和赋值操作,以显示在幕后添加的内容:
class Fred
{
public:
Fred(); // default constructor
Fred(int x, int y) // custom constructor
{
std::cout << "Fred with two intsn" << std::endl;
};
Fred(const Fred&); // copy constructor
Fred& operator=(const Fred&); // assignment operator overload
};
复制构造函数:弗雷德(const Fred&);当向量构造函数将您的Fred复制到包含的3个Fred中时,将调用什么。如果你自己实现它,你会看到它被调用了3次。以下是完整的演示:
#include <iostream>
#include <vector>
using namespace std;
class Fred
{
private:
int x,y;
public:
Fred() // default constructor
{
cout << "Fred's default constructorn";
}
Fred(int x, int y) // custom constructor
{
cout << "Fred's custom constructorn" << std::endl;
};
Fred(const Fred& rhs) // copy constructor -- NOTE rhs stands for "right-hand-side"
:x(rhs.x),y(rhs.y)
{
cout << "Fred's copy constructorn";
}
Fred& operator=(const Fred& rhs) // assignment operator overload
{
if(&rhs != this)
{
cout << "Fred's assignment overloadn";
x = rhs.x;
y = rhs.y;
}
return *this;
}
};
int main(int argc, char** argv)
{
Fred fred; // calls default constructor
vector<Fred> myFreds(3,Fred(4,5)); // calls custom constructor, then copy constructor 3 times.
fred = myFreds[0]; // calls assignment overload
return 0;
}
输出:
Fred的默认构造函数
弗雷德的自定义构造函数
弗雷德的复制构造函数
弗雷德的复制构造函数
弗雷德的复制构造函数
弗雷德的任务使过载
如果禁用复制构造函数和赋值重载,那么在尝试使用它们时会出现错误。如果您使用C++11,如果您可以通过如上所述声明它们来禁用它们,后跟=delete;
Fred(const Fred&) = delete;
如果你不使用C++11,你可以通过私下声明它们来有效地禁用它们:
private:
Fred(const Fred&); // NOTE: Don't define this function.
一旦它被禁用,您将看到您的程序不再编译,因为它试图访问被禁用的函数。它只是为您编译的,因为您允许通过不自己定义它们来隐式添加这些内容。
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素