为什么不调用复制构造函数?

Why does the copy constructor is not called?

提问人:chandu 提问时间:6/21/2023 更新时间:6/21/2023 访问量:124

问:

#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;
}

我的期望是同时调用默认构造函数和复制构造函数,但只调用默认构造函数。 可能是什么问题??

输出为:默认构造函数调用

C++ 共享 PTR 智能指针 复制构造函数 default-constructor

评论

7赞 463035818_is_not_an_ai 6/21/2023
Init(std::shared_ptr<Init> z)不是复制构造函数
0赞 saxbophone 6/21/2023
复制构造函数必须采用引用参数,而不是指针。查看参考资料
1赞 Nathan Pierson 6/21/2023
@saxbophone 它将是复制构造函数std::shared_ptr<Init>
1赞 molbdnilo 6/21/2023
只有一个实例;由 创建的那个。我认为您需要更多地了解“复制构造函数”的含义。Initmake_sharedshared_ptr
2赞 Fareanor 6/21/2023
此外,接受参数的构造函数不能称为“默认构造函数”

答:

9赞 463035818_is_not_an_ai 6/21/2023 #1

复制构造共享指针将调用共享指针的复制构造函数。这不是在构造一个 .相反,它构造一个与同一实例共享所有权的实例。在代码中,仅创建一个实例。共享一个实例的所有权是拥有共享指针的多个副本的目的。std::shared_ptr<Init> b(a);Initshared_ptraInitInit

Init(std::shared_ptr<Init> z)不是复制构造函数。复制构造函数是(代码中也不使用)。Init(const Init&)

目前尚不清楚您实际想做什么,但是,您可以创建一个第二个实例来管理第二个实例的生存期,该实例是从第一个实例构造的副本:shared_ptrInit

#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)