我的问题是,假设我们有两个类A和B,我想在类A中有一个对象B。我应该用,
class A { public: A(); ~A(); B* b; };
或
class A { public: A(); ~A(); B b; };
据我所知,在第一个场景中,我可以使用new操作符初始化对象*b,而在第二个场景中,如果我不想使用class B的默认构造函数,我可以使用初始化列表初始化b。使用哪个更方便?
new
*b
class B
b
zpf6vheq1#
这要看情况。即使使用指针,也可以在初始化列表中初始化成员,但这不是您最关心的问题。两者都有优点和缺点:
B
A
如果我想到更多答案,我会修改我的答案。
nnsrf1az2#
在这个场景中,无指针版本更方便,你不需要担心在正确的时间调用delete,因此你不需要担心析构函数、复制构造函数和复制赋值操作符。通常,您应该尽可能避免动态分配内存。
delete
qltillow3#
第二个更方便,因为你不需要自己管理内存。没有new,就没有delete。如果你选择第一个,那么你可能还需要实现三法则(C++03):
或者,五规则(C++11):
这一规则背后的基本思想如下:
因此,除非你有充分的理由为什么你需要 * 指针 * 版本(比如当你需要 * 多态 * 行为的时候),你必须使用第二种方法(非指针方法)。
mkshixfv4#
使用第二个,在C++中尽量避免使用new,除非你使用RAII。
o2gm4chl5#
如果你想在A中得到一个B类的对象,那么你必须使用第二种方法,第一种方法并没有在A中给予一个B类的对象,而是在A中得到一个B*类的对象。第二种方法对几乎所有的用途来说都更方便,只在必要时才使用指针,即使这样,使用智能指针处理资源也比使用B*更方便。
B*
5条答案
按热度按时间zpf6vheq1#
这要看情况。
即使使用指针,也可以在初始化列表中初始化成员,但这不是您最关心的问题。
两者都有优点和缺点:
使用指针:
优点:
B
派生的对象作为成员缺点:
使用对象:
优点:
缺点:
B
派生该怎么办?A
时将调用B
的构造函数B
的完整定义如果我想到更多答案,我会修改我的答案。
nnsrf1az2#
在这个场景中,无指针版本更方便,你不需要担心在正确的时间调用
delete
,因此你不需要担心析构函数、复制构造函数和复制赋值操作符。通常,您应该尽可能避免动态分配内存。
qltillow3#
第二个更方便,因为你不需要自己管理内存。没有
new
,就没有delete
。如果你选择第一个,那么你可能还需要实现三法则(C++03):
或者,五规则(C++11):
这一规则背后的基本思想如下:
因此,除非你有充分的理由为什么你需要 * 指针 * 版本(比如当你需要 * 多态 * 行为的时候),你必须使用第二种方法(非指针方法)。
mkshixfv4#
使用第二个,在C++中尽量避免使用
new
,除非你使用RAII。o2gm4chl5#
如果你想在A中得到一个B类的对象,那么你必须使用第二种方法,第一种方法并没有在A中给予一个B类的对象,而是在A中得到一个
B*
类的对象。第二种方法对几乎所有的用途来说都更方便,只在必要时才使用指针,即使这样,使用智能指针处理资源也比使用
B*
更方便。