【发布时间】:2021-03-11 05:47:18
【问题描述】:
您好,我正在尝试了解复制构造函数的工作原理并查看示例。示例如下:
{//new scope
Sales_data *p = new Sales_data;
auto p2 = make_shared<Saled_data>();
Sales_data item(*p); // copy constructor copies *p into item
vector<Sales_data> vec;
vec.push_back(*p2);// copies the object to which p2 points
delete p;
}
我的问题是:
- 为什么写“复制构造函数将*p复制到
item”?我的意思是,item是直接初始化的。如果我们写Sales_data item = *p;,那么它将被称为复制初始化,那么为什么他们写复制构造函数将*p复制到注释中的项目中。
现在,为了自己验证这一点,我尝试自己创建一个简单的示例,但我也无法正确理解这个概念。我的自定义示例如下:
#include<iostream>
#include<string>
class MAINCLASS{
private:
std::string name;
int age =0;
public:
MAINCLASS(){
std::cout<<"This is default initialization"<<std::endl;
}
MAINCLASS(MAINCLASS &obj){
std::cout<<"This is direct initialization"<<std::endl;
}
MAINCLASS(const MAINCLASS &obj):name(obj.name),age(obj.age){
std::cout<<"This is copy initialization"<<std::endl;
}
};
int main(){
MAINCLASS objectone;
MAINCLASS objecttwo =objectone;
MAINCLASS objectthree(objectone);
return 0;
}
现在当我运行这个程序时,我得到以下输出:
这是默认初始化
这是直接初始化
这是直接初始化
我对这个程序的问题如下:
- 为什么在我写
MAINCLASS objecttwo =objectone;的第二种情况下我们没有输出“这是复制初始化”?我已经读过,在直接初始化函数匹配中使用了复制构造函数,我们将右手操作数成员复制到左手操作数成员中。因此,当我编写MAINCLASS objecttwo =objectone;时,它应该调用复制构造函数并在屏幕上打印“这是复制初始化”。但相反,它是直接初始化对象。这里发生了什么?
【问题讨论】:
-
请显示
Sales_data定义。它有Sales_data(Sales_data&)构造函数吗? -
@S.M.
Sales_data具有以下构造函数:Sales_data(const Sales_data&);,Sales_data() = default;,Sales_data(const std::string &s, unsigned n, double p);,explicit Sales_data(const std::string &s);,explicit Sales_data(std::istream&);。 -
请在问题中添加所有相关详细信息(例如
Sales_data的定义),而不是作为评论。
标签: c++ c++11 c++14 copy-constructor