gpt4 book ai didi

c++ - 什么时候不调用 C++ 构造函数?

转载 作者:可可西里 更新时间:2023-11-01 18:42:36 26 4
gpt4 key购买 nike

我有一种情况,似乎没有构造函数被调用:

#include <iostream>

using namespace std;

int main ()
{
class yoyo
{
public:
int i;
yoyo()
{
i = 0;
cout << "defaultly initialized to 0" << endl;
}
yoyo (int j) : i(j)
{
cout << "initialized to " << j << endl;
}
};

int i;

yoyo a;
cout << "Hello1, i: " << a.i << endl;

yoyo b(5);
cout << "Hello2, i: " << b.i << endl;

yoyo c = b; /* 1 */
cout << "Hello3, i: " << c.i << endl;

return 0;
}

输出是:

defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
Hello3, i: 5

(注意:Hello2 和 Hello3 之间没有任何区别)

如果我把程序改为如下:

#include <iostream>

using namespace std;

int main ()
{
class yoyo
{
public:
int i;
yoyo()
{
i = 0;
cout << "defaultly initialized to 0" << endl;
}
yoyo (int j) : i(j)
{
cout << "initialized to " << j << endl;
}
};

int i;

yoyo a;
cout << "Hello1, i: " << a.i << endl;

yoyo b(5);
cout << "Hello2, i: " << b.i << endl;

yoyo c; c = b; /* 1 */
cout << "Hello3, i: " << c.i << endl;

return 0;
}

(唯一不同的是/* 1 */标记的行)

现在的输出是:

defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
defaultly initialized to 0
Hello3, i: 5

现在 Hello2 和 Hello3 之间有一个构造函数调用。我的问题是,为什么在第一种情况下没有(可见的)构造函数调用?

最佳答案

如果是

yoyo c = b;

这是copy constructor这就是所谓的。

在这种情况下

yoyo c; c = b;

这是copy assignment调用的运算符。

如果您不提供其中任何一个,编译器将为您生成默认版本。


如果你想创建自己的复制构造函数,它可能看起来像这样:

yoyo(const yoyo& other)
: i(other.i)
{ std::cout << "copy constructor initialized\n"; }

复制赋值运算符如下所示:

yoyo& operator=(const yoyo& other)
{
i = other.i;
return *this;
}

当然,它们都在类定义内部定义。

关于c++ - 什么时候不调用 C++ 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287492/

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