Cor*_*lks 8 c++ copy-constructor copy-initialization
可能重复:
复制和直接初始化的动机背后的动机是什么?
通过复制初始化,我的意思是这样的:
struct MyStruct
{
MyStruct(int) {}
MyStruct(const MyStruct&) {}
};
MyStruct s = 5; // needs *both* the int and copy constructor
Run Code Online (Sandbox Code Playgroud)
尽管用C++编程多年,但我从未意识到上面的代码需要复制构造函数(感谢jogojapan).暂时一直被遗忘,因此我甚至都不知道它是否存在(至少在肤浅的层面,尽管它被优化了),直到它被指出给我.
经过大量的谷歌搜索,我了解它是如何工作的.我的问题是为什么它是这样的?
为什么标准不能使上面的例子不需要复制构造函数?是否有一些特定的案例/示例表明在这种初始化中需要复制构造函数很重要?
如果没有合理的解释为什么事情就是他们的方式,我只是把它看作是一件讨厌的神器,但如果有一些重要的东西我不想知道,我宁可不要无知.
对象的复制初始化与直接初始化不明确,两者可以在相同程度上使用,以便将值设置为彼此相等。
int a = 4;
int a = int(4);
int a(4);
Run Code Online (Sandbox Code Playgroud)
所有这些调用都是不明确的,它们都将 a 设置为 4。在整数的情况下使用复制构造函数的原因是方便,想象一下没有 this 的 C++ 数据类型
int a(foo(b,r)); //a little messy for a variable declaration
int a = foo(b,r) //ok, cleaner
Run Code Online (Sandbox Code Playgroud)
您还可以使用隐式和显式复制构造函数,下面是一个示例程序,它显式使用复制构造函数来处理虚数:
#include <iostream>
using std::cout;
using std::endl;
class complexNumbers {
double real, img;
public:
complexNumbers() : real(0), img(0) { }
complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; }
explicit complexNumbers( double r, double i = 0.0) { real = r; img = i; }
friend void display(complexNumbers cx);
};
void display(complexNumbers cx){
cout<<"Real Part: "<<cx.real<<" Imag Part: "<<cx.img<<endl;
}
int main() {
complexNumbers one(1);
display(one);
complexNumbers two =2;
display(200);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |