gpt4 book ai didi

c++ - 以对象为参数的构造函数

转载 作者:行者123 更新时间:2023-11-30 01:09:32 25 4
gpt4 key购买 nike

假设我有一个类如下:

class A{
int x ;
A( int i ){
x = i ;
}
}

我还有另一个类 B,它有一个类 A 的实例作为成员对象。

class B{
int y ;
A obj_a ;
B( int j , A a ){
y = j ;
obj_a = a ;
}
}

当我执行以下操作时:

int main(){
A obj1( 1 ) ; // obj.x has value 1
B obj2( 2 , obj1 ) ;
}

第二行抛出一个错误,指出没有调用 A::A() 形式的函数。我知道这意味着缺少默认样式构造函数,但我为什么需要它? obj1 是使用定义的构造函数创建的,因此这不是问题。

我目前的想法是 A aobj_a = a 将调用隐式定义的复制构造函数。

注意:为简洁起见,我排除了私有(private)、公共(public)等。

最佳答案

一个对象必须是完全一致的,在它进入构造函数体时,它的所有成员都已构造。所以在

B( int j , A a ){
y = j ;
obj_a = a ;
}

之前

{
y = j ;
obj_a = a ;
}

有机会做任何事情,obj_a 一定已经构造好了。

因为 Member Initializer List 没有提供关于如何构造 obj_a 的说明, obj_a 将使用类 A 的默认构造函数构建。类 A 没有默认构造函数,没有 A::A(),因此引发错误。

解决方案是使用成员初始化器列表而不是在函数体内赋值。这不仅可以节省您构建将立即被覆盖的对象的时间,而且编译器还有更多的优化余地,您可能会得到一些其他小的改进。

B 类应该是:

class B{
int y ;
A obj_a ;
B( int j , A a ): y(j), obj_a(a)
{
}
}

关于c++ - 以对象为参数的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40138402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com