关于类的唯一指针的问题(.h VS 构造函数中变量的初始化)

Question about unique pointer of classes (initialisation of variables in .h VS in constructor)

提问人:Baptiste Girard 提问时间:9/28/2023 更新时间:9/28/2023 访问量:48

问:

我是一个乞丐,从独特的指针开始,我对它们有一个问题:unique_ptr

如果我有一个类,里面是 .h,我还有一个像这样的类:AB

class A{

   B b;

public:

   A();
}

(考虑包含)

如果我想创建一个在这些情况下有什么区别:unique_ptrAB

(unique_ptr<A> a = make_unique<A>())

案例 1 :

class A{

   B b = b(1);

public:

   A();
}

和案例 2:

class A{

   B b;

public:

   A();
}

在 A() 的构造函数中:

A::A() {
   b = b(1);
}

他们每个人的内部使用似乎都不同,但我不明白为什么。BA

C++ 指针 构造函数 unique-ptr

评论

1赞 Tim Roberts 9/28/2023
的实现不会因为其他人创建了 .我不确定你在这里得到了什么。Aunique_ptr<A>
0赞 Baptiste Girard 9/28/2023
@TimRoberts 更多的是关于 B 的,如果我尝试将它与 A 一起使用(例如 A->getB().doStuff() 或任何使用 A 的 B 的东西),它可能有什么区别
0赞 Tim Roberts 9/28/2023
阅读我的答案。A 的实现不会改变。A不知道。 是私有的,所以无论如何,班级之外没有人使用它。b
0赞 j6t 9/28/2023
实际的实例应该是吗?b(1)B(1)

答:

2赞 Remy Lebeau 9/28/2023 #1

在情况 1 中,构造时,它直接以 1 初始化。AA::b

在案例 2 中,构造时,它首先默认初始化,然后为其分配另一个使用 1 初始化的对象。AA::bB

这对操作方式没有任何影响unique_ptrmake_unique()

0赞 Jakkapong Rattananen 9/28/2023 #2

c++ 的构造函数不同于其他 OOP 语言中的构造函数。 它分为两部分。

  • 成员初始化。
  • 函数体。

#include <iostream>
struct BB{
    int num;
    BB(int in):num{in}
    {
        std::cout << "ctor BB value=" << num <<"\n";
    }
};
struct AA{
    BB b{1};
    AA()
    {
        b = BB{2};
    }

};
struct AB{
    BB b{1};//default initialization
    AB():b{2}//member initialization
    {
      //function body
    }

};

int main() {
   std::cout << "-- create AA \n";
   AA a{};
   std::cout << "value AA.b.num=" << a.b.num << "\n";
   std::cout << "-- create AB \n";
   AB b{};
   std::cout << "value AB.b.num=" << b.b.num << "\n";
}

结果是

-- create AA 
ctor BB value=1
ctor BB value=2
value AA.b.num=2
-- create AB 
ctor BB value=2
value AB.b.num=2