为什么构造函数没有被多次调用? 我正在通过Marshall Cline的C++ FAQ。< /P>
目前正在使用第10.5点中的代码 我有这个:为什么构造函数没有被多次调用? 我正在通过Marshall Cline的C++ FAQ。< /P>,c++,constructor,C++,Constructor,目前正在使用第10.5点中的代码 我有这个: class Fred { public: Fred(); Fred(int x, int y) { std::cout << "Fred with two ints\n" << std::endl; }; }; int main() { std::vector<Fred>(3, Fred(4,5)); return 0; } class { 公众: 弗雷德(); 弗雷德(整数x,
class Fred
{
public:
Fred();
Fred(int x, int y)
{
std::cout << "Fred with two ints\n" << std::endl;
};
};
int main()
{
std::vector<Fred>(3, Fred(4,5));
return 0;
}
class
{
公众:
弗雷德();
弗雷德(整数x,整数y)
{
std::cout这是您正在调用的向量
构造函数的签名:
vector( size_type _Count, const Type& _Val, const Allocator& _Alloc = Allocator() );
Fred(4,5)
调用您定义的构造函数一次,创建的实例通过引用传递给vector
构造函数。然后,它[创建的实例]被复制到vector中3次。复制操作通过使用执行(默认值)复制构造函数;这样就不会多次调用构造函数。编写Fred(4,5)时,您只调用了一次用户定义的构造函数。这将传递给向量的构造函数,该构造函数将它复制3次到3个fred中。这将使用您的复制构造函数,而不是默认或自定义构造函数。如果您不编写自己的复制构造函数,则会隐式添加一个复制构造函数,就像赋值操作一样。下面,我添加了一个复制构造函数和赋值操作,以显示所需的内容ing在幕后补充道:
class Fred
{
public:
Fred(); // default constructor
Fred(int x, int y) // custom constructor
{
std::cout << "Fred with two ints\n" << std::endl;
};
Fred(const Fred&); // copy constructor
Fred& operator=(const Fred&); // assignment operator overload
};
如果不使用C++11,则可以通过在私有中声明它们来有效地禁用它们:
private:
Fred(const Fred&); // NOTE: Don't define this function.
一旦它被禁用,您将看到您的程序不再编译,因为它试图访问被禁用的函数。它只是为您编译的,因为您允许通过不自己定义来隐式添加这些函数。添加复制构造函数以查看vector类正在使用它。感谢您在示例中提到我这是上个世纪的答案:(@KerrekSB你什么意思?如果我的英语不太好,我很抱歉,但我想我已经描述了这种行为的原因。在目前的标准中,有一个带有签名的(大小类型)
,还有一个带有签名的(size_type,T const&,Allocator const&=Allocator())
(注意:没有默认值!)。这允许元素的值初始化,这在以前是不可能的。@KerrekSB我修改了我的答案。现在更好了。
Fred(const Fred&) = delete;
private:
Fred(const Fred&); // NOTE: Don't define this function.