提问人:chandu 提问时间:6/21/2023 更新时间:6/21/2023 访问量:124
为什么不调用复制构造函数?
Why does the copy constructor is not called?
问:
#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;
}
我的期望是同时调用默认构造函数和复制构造函数,但只调用默认构造函数。 可能是什么问题??
输出为:默认构造函数调用
答:
9赞
463035818_is_not_an_ai
6/21/2023
#1
复制构造共享指针将调用共享指针的复制构造函数。这不是在构造一个 .相反,它构造一个与同一实例共享所有权的实例。在代码中,仅创建一个实例。共享一个实例的所有权是拥有共享指针的多个副本的目的。std::shared_ptr<Init> b(a);
Init
shared_ptr
a
Init
Init
Init(std::shared_ptr<Init> z)
不是复制构造函数。复制构造函数是(代码中也不使用)。Init(const Init&)
目前尚不清楚您实际想做什么,但是,您可以创建一个第二个实例来管理第二个实例的生存期,该实例是从第一个实例构造的副本:shared_ptr
Init
#include <iostream>
#include <memory>
// better not using namespace std;
class Init {
private:
int x;
public:
Init(int y) : x(y){ // <--- use member initializer list for initialization
std::cout << "default constructor called\n";
}
Init(const Init& other) : x(other.x) { // <--- copy constructor
std::cout << "copy constructor called\n";
}
};
int main()
{
int k = 5;
std::shared_ptr<Init> a = std::make_shared<Init>(k);
std::shared_ptr<Init> b = std::make_shared<Init>(*a);
// return 0; // not needed here
}
输出:
default constructor called
copy constructor called
PS:不是默认构造函数。默认构造函数是可以在没有参数的情况下调用的构造函数,例如默认构造函数。Init(int y)
Int(int y=0)
下一个:构造 3D 矢量类时出错
评论
Init(std::shared_ptr<Init> z)
不是复制构造函数std::shared_ptr<Init>
Init
make_shared
shared_ptr