【问题标题】: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{});` 的区别
【发布时间】:2020-09-14 01:57:56
【问题描述】:

unique_ptr&lt;Sample&gt; sp1(new Sample);unique_ptr&lt;Sample&gt; sp1(new Sample());unique_ptr&lt;Sample&gt; sp2(new Sample{});有什么区别?我发现它们确实都是合法的。你可以在http://cpp.sh/3icui查看。

我是 C++ 的新手。我反复思考,但仍然能得到这个想法。我会感谢你对这个问题的任何提示。

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

【问题讨论】:

标签: c++ c++11 initialization unique-ptr


【解决方案1】:

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

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

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

一个简单的例子:

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

【讨论】:

  • 没问题。如果我能提供更多帮助,请告诉我。
  • 你真好。我会的。
  • 你的例子doesn't compile。此外,()can be used 在您的示例中。
  • 它在我的机器上用 g++ 编译。似乎 g++ 做的事情不同。 @sunshilong369,根据在线编译器,我们需要有一个带2个参数的构造函数才能使用{}。
  • @bhristov 您使用哪个版本的 gcc?
【解决方案2】:

这里的效果是一样的。

new Sample()执行value initalization,对象由Sample的默认构造函数初始化。

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

这些初始化样式的效果取决于上下文,尤其是类型的行为方式。对于Sample 类,它们都具有相同的效果。

【讨论】:

  • 谢谢。unique_ptr&lt;Sample&gt; sp3(new Sample);呢?
  • @sunshilong369 答案已修改。
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 2017-07-15
  • 2020-11-07
  • 2022-07-12
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多