首页 > 试题广场 >

查看下面两段代码,下面说法正确的是

[单选题]
查看下面两段代码
(1)
class classA {...};
class classB
{
public:
	classB(classA a) {mA = a;}
private:
	classA mA;
};
(2)
class classA {...};
class classB
{
public:
	classB(classA a): mA(a) {}
private:
	classA mA;
};
  • 两种方法产生的结果和效率完全相同
  • 通常情况下(2)的效率更高
  • 通常情况下(1)的效率更高
  • 两种调用方法会产生不同的结果
看了别人解释,自己理解的,不知道对不对。 第一种先调用class A,用实参来初始化拷贝构造函数中的形式参数,然后调用A的默认构造函数建立mA,最后用赋值运算符将形参赋值给mA。 第二种,调用两次class A的拷贝构造函数,第一次调用将实参初始化形参,第二次调用,将形参初始化mA。
发表于 2020-12-17 11:09:48 回复(0)
第一种先调用 a的默认构造函数,在调用operator=赋值函数,第二中直接调用复制构造函数
发表于 2016-05-04 23:16:37 回复(4)
第一个就是调用构造函数,再赋值一次,第二个就是调用拷贝构造函数,直接初始化列表来进行构造(也就是:mA(a))。这就是初始化列表,很方便。而且初始化列表的顺序只和变量声明的顺序有关
发表于 2016-08-15 11:11:34 回复(5)


发表于 2018-06-05 19:47:42 回复(0)
        使用初始化列表才是真正的初始化,而在构造函数里面只是赋值。使用初始化列表会直接调用拷贝构造函数一步构造出对象,但是在构造函数里面的mA = a;会先调用默认构造函数构造出mA,再调用拷贝复制运算符operator=。也就是说对于自定义数据类型来说,使用初始化列表只有一次函数调用,且会先于赋值行为进行,而在构造函数内部赋值会有两次函数调用,这样来说谁快谁慢就不言自明了。但是对于基本数据类型int、char、short等来说,并不存在构造对象的过程,所以都是只有一步赋值,所以使用初始化列表和构造函数内部赋值效率相同,这也是题目说通常情况下(2)的效率更高的原因。
发表于 2021-10-30 16:18:31 回复(0)
copy 构造函数的效率大于运算符的重载
发表于 2017-02-27 22:56:19 回复(1)
如果A没有默认构造函数的话,只能用初始化列表初始化吧。。感觉自己想多了
发表于 2017-03-01 07:35:36 回复(0)
使用初始化列表要比赋值初始化的效率高。
发表于 2016-06-22 16:16:14 回复(0)
*****又看错了
两段代码主要涉及的是C++中类的构造函数的初始化方式。对于这个问题,正确答案是B:通常情况下,第二种方法(代码段2)的效率更高。
默认赋值拷贝
在代码段1中,构造函数classB(classA a)通过赋值运算符将参数a的值赋给成员变量mA。这意味着在构造函数体内部,首先使用了默认构造函数创建了一个未初始化的mA对象,然后再将参数a的值赋给mA。这种方式涉及了两次构造函数调用和一次赋值操作,可能会引入不必要的开销和性能损失。
默认拷贝构造函数

而在代码段2中,构造函数classB(classA a): mA(a) {}使用了成员初始化列表的方式直接将参数a的值传递给成员变量mA进行初始化。这种方式只涉及一次构造函数调用,并且直接将参数值传递给成员变量,避免了不必要的赋值操作,因此在效率上更高。

需要注意的是,对于简单的类类型(如整数、指针等),这两种方式的效率差异可能并不明显。但对于复杂的类类型,尤其是带有昂贵的构造函数或大量成员变量的类,使用成员初始化列表可以显著提高构造函数的效率。

至于结果,这两种调用方法在功能上是等效的,都能够成功地将参数a的值传递给成员变量mA。所以D选项是不正确的。

综上所述,答案是B:通常情况下,第二种方法(代码段2)的效率更高。


编辑于 2023-10-18 22:35:56 回复(0)
不太懂第二个。。。。那个冒号是什么意思,怎么个关系呢,有点晕,求解,谢谢~
发表于 2016-08-13 19:54:04 回复(3)
第一种先调用a的默认构造函数,在调用operator,第二种直接调用复制构造函数
发表于 2022-02-23 10:49:44 回复(0)
带参构造就只能在初始化列表初始化
发表于 2020-06-13 18:12:29 回复(0)
话说有规定说拷贝构造函数和重载=运算符的行为必须一致吗……
发表于 2018-01-04 22:41:32 回复(0)
正确定义拷贝背构造函数是一个很好的习惯!深拷贝!
发表于 2017-06-03 12:58:22 回复(0)
没注意看,以为是说内联,原来是构造
发表于 2016-10-19 13:28:09 回复(0)
第一先调用构造,再调用赋值
发表于 2016-07-12 20:37:26 回复(0)