c++ 类的指针成员与非指针成员

rsaldnfx  于 2023-02-06  发布在  其他
关注(0)|答案(5)|浏览(233)

我的问题是,假设我们有两个类A和B,我想在类A中有一个对象B。
我应该用,

class A
{
public:
    A();
    ~A();
    B* b;
};

class A
{
public:
    A();
    ~A();
    B b;
};

据我所知,在第一个场景中,我可以使用new操作符初始化对象*b,而在第二个场景中,如果我不想使用class B的默认构造函数,我可以使用初始化列表初始化b。使用哪个更方便?

zpf6vheq

zpf6vheq1#

这要看情况。
即使使用指针,也可以在初始化列表中初始化成员,但这不是您最关心的问题。
两者都有优点和缺点:

使用指针:

优点:

  • 该类在内存中的大小将更小
  • 你只需要一个对另一个类的forward声明--不需要在你的头文件中包含另一个头文件
  • 可以使用从B派生的对象作为成员

缺点:

  • 内存管理-这是一个相当大的问题。2你希望内存由类来管理(重写析构函数,赋值操作符和复制构造函数)吗?

使用对象:

优点:

  • 无需担心内存管理

缺点:

  • 只能使用基类的对象。如果要从B派生该怎么办?
  • 为每个示例提供更多内存
  • 构造A时将调用B的构造函数
  • 您需要在标头中提供B的完整定义

如果我想到更多答案,我会修改我的答案。

nnsrf1az

nnsrf1az2#

在这个场景中,无指针版本更方便,你不需要担心在正确的时间调用delete,因此你不需要担心析构函数、复制构造函数和复制赋值操作符。
通常,您应该尽可能避免动态分配内存。

qltillow

qltillow3#

第二个更方便,因为你不需要自己管理内存。没有new,就没有delete
如果你选择第一个,那么你可能还需要实现三法则(C++03):

或者,五规则(C++11):

这一规则背后的基本思想如下:

因此,除非你有充分的理由为什么你需要 * 指针 * 版本(比如当你需要 * 多态 * 行为的时候),你必须使用第二种方法(非指针方法)。

mkshixfv

mkshixfv4#

使用第二个,在C++中尽量避免使用new,除非你使用RAII。

o2gm4chl

o2gm4chl5#

如果你想在A中得到一个B类的对象,那么你必须使用第二种方法,第一种方法并没有在A中给予一个B类的对象,而是在A中得到一个B*类的对象。
第二种方法对几乎所有的用途来说都更方便,只在必要时才使用指针,即使这样,使用智能指针处理资源也比使用B*更方便。

相关问题