1  class A
2   {
3     public:
4     A(double):a(b){};
5  ......     
第四行代码的意思是?

解决方案 »

  1.   

    A(double):a(b){};
    是个构造函数,参数类型是double(但是没有形参的名字,也是可以的),函数体为空
    :后面是构造函数的初始化表,a(b)表示构造的时候,a将被赋值为b,所以A中应该成员a
    但是b......,所以有可能是这样的:A(double b/*注意这里*/):a(b){};
      

  2.   

    类的构造函数进行成员变量初始化
    参看林锐的《高质量C、C++编程指南》之 “9.2 构造函数的初始化表”构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表
    位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体
    内的任何代码被执行之前。
    构造函数初始化表的使用规则:
    􀂋 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。
    例如
    class A
    {…
    A(int x); // A 的构造函数
    };
    class B : public A
    {…
    B(int x, int y);// B 的构造函数
    };
    B::B(int x, int y)
    : A(x) // 在初始化表里调用A 的构造函数
    {

    }
    􀂋 类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式
    来初始化(参见5.4 节)。类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的
    效率不完全相同。
    非内部数据类型的成员对象应当采用第一种方式初始化,以获取更高的效率。例如
    class A
    {…
    A(void); // 无参数构造函数
    A(const A &other); // 拷贝构造函数
    A & operate =( const A &other); // 赋值函数
    };
    class B
    {
    public:
    B(const A &a); // B 的构造函数
    private:
    A m_a; // 成员对象
    };
    示例9-2(a)中,类B 的构造函数在其初始化表里调用了类A 的拷贝构造函数,从而
    将成员对象m_a 初始化。
    示例9-2 (b)中,类B 的构造函数在函数体内用赋值的方式将成员对象m_a 初始化。
    我们看到的只是一条赋值语句,但实际上B 的构造函数干了两件事:先暗地里创建m_a
    对象(调用了A 的无参数构造函数),再调用类A 的赋值函数,将参数a 赋给m_a。
    B::B(const A &a)
    : m_a(a)
    {

    }
    B::B(const A &a)
    {
    m_a = a;

    }
    示例9-2(a) 成员对象在初始化表中被初始化 示例9-2(b) 成员对象在函数体内被初始化
    对于内部数据类型的数据成员而言,两种初始化方式的效率几乎没有区别,但后者
    的程序版式似乎更清晰些。若类F 的声明如下:
    class F
    {
    public:
    F(int x, int y); // 构造函数
    private:
    int m_x, m_y;
    int m_i, m_j;}
    示例9-2(c)中F 的构造函数采用了第一种初始化方式,示例9-2(d)中F 的构造函
    数采用了第二种初始化方式。
    F::F(int x, int y)
    : m_x(x), m_y(y)
    {
    m_i = 0;
    m_j = 0;
    }
    F::F(int x, int y)
    {
    m_x = x;
    m_y = y;
    m_i = 0;
    m_j = 0;
    }
    示例9-2(c) 数据成员在初始化表中被初始化 示例9-2(d) 数据成员在函数体内被初始化