use*_*270 6 c++ constructor explicit-constructor
我有一种情况,似乎没有调用构造函数:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
Hello3, i: 5
Run Code Online (Sandbox Code Playgroud)
(注意: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;
}
Run Code Online (Sandbox Code Playgroud)
(唯一的区别在于他标有/*1*/的行)
现在的输出是:
defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
defaultly initialized to 0
Hello3, i: 5
Run Code Online (Sandbox Code Playgroud)
现在Hello2和Hello3之间有一个构造函数调用.我的问题是,为什么在第一种情况下没有(可见)构造函数调用?
Som*_*ude 16
如果是
yoyo c = b;
Run Code Online (Sandbox Code Playgroud)
它是被调用的复制构造函数.
而在这种情况下
yoyo c; c = b;
Run Code Online (Sandbox Code Playgroud)
它是被调用的复制赋值运算符.
如果您不提供其中任何一个,编译器将为您生成默认版本.
如果要创建自己的复制构造函数,它可能如下所示:
yoyo(const yoyo& other)
: i(other.i)
{ std::cout << "copy constructor initialized\n"; }
Run Code Online (Sandbox Code Playgroud)
复制赋值运算符如下所示:
yoyo& operator=(const yoyo& other)
{
i = other.i;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
他们两个定义里面当然的类定义.
在第一种情况下:
yoyo c = b;
Run Code Online (Sandbox Code Playgroud)
copy constructor
在这种情况下,调用编译器为您隐式生成的内容.
归档时间: |
|
查看次数: |
482 次 |
最近记录: |