首页 > 试题广场 >

查看下面两段代码(1)class classA {.....

[不定项选择题]
查看下面两段代码
(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;
};
  • 两种调用方法效果是一样的
  • 通常情况下(1)的效率更高
  • 通常情况下(2)的效率更高
  • 两种调用方法效果是不一样的
为什么用成员初始化列表会快一些

首先把数据成员按类型分类
1。内置数据类型,复合类型(指针,引用)
2。用户定义类型(类类型)

分情况说明:
对于类型1,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
对于类型2,结果上相同,但是性能上存在很大的差别

因为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是 对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)

简单的来说:
对于用户定义类型:
1)如果使用类初始化列表,直接调用对应的构造函数即完成初始化
2)如果在构造函数中初始化,那么首先调用默认的构造函数,然后调用指定的构造函数

所以对于用户定义类型,使用列表初始化可以减少一次默认构造函数调用过程

测试代码如下:
#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout << "A()" << endl;
    }
    A(int a)
    {
        value = a;
        cout << "A(int "<<value<<")" << endl;
    }

    A(const A& a)
    {
        value = a.value;
        cout << "A(const A& a):  "<<value << endl;
    }
    int value;
};

class B
{
public:
    B() : a(1)
    {
        b = A(2);
    }
    A a;
    A b;
};
int main()
{
    B b;
    system("pause");
}
运行结果如下图:

发表于 2020-08-09 20:27:10 回复(0)
应该选ac
C++ Primer中在讲构造函数初始化列表的时候有这么一段话:
无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值。

发表于 2020-10-05 17:32:20 回复(2)
这题目,如果A中有指针成员,那么初始化列表会调用拷贝构造,赋值函数会调用赋值函数,你A中什么重载没重载都不说明,我怎么给你选答案
发表于 2022-01-20 14:30:39 回复(1)
第一种:1.先调用复制构造函数给形参a赋值 2.调用默认构造函数初始化子对象 3.进行对象赋值的操作。 第二种:1.和第一种一样首先调用复制构造函数给形参a赋值 2.根据初始化列表调用复制构造函数将a复制给mA。 一般情况下:复制构造函数<默认构造函数+赋值操作函数。
发表于 2022-05-19 05:55:27 回复(0)
没理解这个产生相同或不同的结果是什么意思?是对象生成过程的不同还是最后输出的结果
发表于 2020-09-18 11:46:33 回复(0)
AC?
发表于 2021-02-05 19:05:40 回复(0)