Различия между `unique_ptr <Sample>sp1 (new Sample);` `unique_ptr <Sample>sp1 (new Sample ());` и `unique_ptr <Sample>sp2 (new Sample {});` - PullRequest
0 голосов
/ 27 мая 2020

В чем разница между unique_ptr<Sample> sp1(new Sample); unique_ptr<Sample> sp1(new Sample()); и unique_ptr<Sample> 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;
}

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

У них здесь такой же эффект.

new Sample() выполняет инициализацию значения , объект инициализируется конструктором по умолчанию Sample.

new Sample{} выполняет инициализацию списка (начиная с C ++ 11), поскольку в результате объект также инициализируется значением конструктором по умолчанию Sample.

BTW : new Sample также имеет тот же эффект, он выполняет инициализацию по умолчанию , и объект также инициализируется конструктором по умолчанию.

Эффект этих стилей инициализации зависит от контекстов, особенно от того, как тип ведет себя. Для класса Sample все они имеют одинаковый эффект.

1 голос
/ 27 мая 2020

{} можно использовать для прямой инициализации данных-членов в отсутствие конструктора.

() можно использовать только без каких-либо параметров при отсутствии конструктора, который принимает параметры.

В вашем случае они будут работать так же, потому что у вас есть определенный конструктор.

Быстрый пример:

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