Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么构造函数没有被多次调用? 我正在通过Marshall Cline的C++ FAQ。< /P>_C++_Constructor - Fatal编程技术网

为什么构造函数没有被多次调用? 我正在通过Marshall Cline的C++ FAQ。< /P>

为什么构造函数没有被多次调用? 我正在通过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,

目前正在使用第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,整数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.