`unique_ptr<Sample> sp1(new Sample);` `unique_ptr<Sample> sp1(new Sample());` 和 `unique_ptr[= 之间的区别10=] sp2(新样本{});`

Differences among `unique_ptr<Sample> sp1(new Sample);` `unique_ptr<Sample> sp1(new Sample());` and , `unique_ptr<Sample> sp2(new Sample{});`

unique_ptr<Sample> sp1(new Sample);unique_ptr<Sample> sp1(new Sample());unique_ptr<Sample> sp2(new Sample{});有什么区别?我发现它们都是合法的 indeed.You 可以在 http://cpp.sh/3icui.

上查看

我是 C++ 的新手。我反复思考但仍然可以得到 idea.I 将感谢任何关于此问题的提示。

#include <iostream>
#include <vector>
#include <memory>
#include <cstdio>
#include <fstream>
#include <cassert>
#include <functional>

using namespace std;

class Sample {
public:
    Sample() { cout << "Sample Constuctor" << endl; }
    ~Sample() { cout << "Sample Destructor" << endl; }
    void publicFn() { cout << "This is public function of class" << endl; }
};
int main() {
    unique_ptr<Sample> sp1(new Sample{});
    unique_ptr<Sample> sp2(new Sample());
    unique_ptr<Sample> sp3(new Sample);
    sp1->publicFn();
    sp2->publicFn();
    return 0;
}

{}可以在没有构造函数的情况下直接初始化成员数据。

() 只能在没有带参数的构造函数的情况下不带任何参数使用。

在您的情况下,它们将执行相同的操作,因为您有一个已定义的构造函数。

一个简单的例子:

struct h
{
    int tmp=3;
    int k=3;
};


int main()
{
    h h1{6, 4};
    h h2;

    std::cout << h1.tmp << std::endl;
    std::cout << h2.tmp << std::endl;

    return 0;
}

这里的效果是一样的

new Sample()执行value initalization,对象由Sample.

的默认构造函数初始化

new Sample{}通过Sample的默认构造函数执行list initialization (since C++11), as the effect the object is also value-initialized

顺便说一句:new Sample也有同样的效果,它执行default initialization并且对象也由默认构造函数初始化。

这些初始化样式的效果取决于上下文,尤其是类型的行为方式。 class Sample 都是一样的效果