#include <iostream>
#include <memory>
using namespace std;
class Init {
private:
int x;
public:
Init(int y) {
x = y;
cout << "default constructor called" << endl;
}
Init(std::shared_ptr<Init> z) {
this->x = z->x;
cout << "copy constructor called" << endl;
}
};
int main()
{
int k = 5;
std::shared_ptr<Init> a = std::make_shared<Init>(k);
std::shared_ptr<Init> b(a);
return 0;
}
我的期望是调用default和copy构造函数,但只调用default构造函数。可能是什么问题呢??
输出为:默认构造函数调用
1条答案
按热度按时间91zkwejq1#
复制构造共享指针调用共享指针的复制构造函数。这个
std::shared_ptr<Init> b(a);
不是在构造Init
。相反,它构造了一个shared_ptr
,与a
共享同一Init
示例的所有权。在代码中,只创建了一个Init
示例。共享一个示例的所有权是拥有共享指针的多个副本的目的。Init(std::shared_ptr<Init> z)
不是复制构造函数。一个复制构造函数是Init(const Init&)
(在您的代码中也没有使用)。你实际上想做什么并不明显,但是,这就是你如何创建第二个
shared_ptr
来管理第二个Init
示例的生存期,该示例是从第一个示例复制构造的:输出:
Live Demo
PS:
Init(int y)
不是默认构造函数。默认构造函数是可以在没有参数的情况下调用的构造函数,例如Int(int y=0)
是默认构造函数。