曲径通幽论坛

标题: 使用成员初始化列表来初始化 const 数据成员和引用成员 [打印本页]

作者: easy    时间: 2013-7-24 16:07
标题: 使用成员初始化列表来初始化 const 数据成员和引用成员
const 数据成员和引用成员必须用成员初始化列表来初始化,这是因为 const 常量只能被初始化,而不能被用来赋值;引用成员必须将定义和赋值放在一起。另外的一个应用场合是对象成员也必须使用成员初始化列表来初始化,这个另外举例。

所有的数据成员均可以使用初始化参数列表进行初始化,但 const 数据成员和引用的数据成员必须使用成员初始化列表来初始化。

看下面的代码(VS2010):

stdafx.h :
[C++] 纯文本查看 复制代码
#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <iostream>


Increment.h:
[C++] 纯文本查看 复制代码
#ifndef INCREMENT_H
#define INCREMENT_H

class Increment
{
public:
    Increment( int c = 0, int i = 1 ); // default constructor

    // function addIncrement definition
    void addIncrement()
    {
        count += increment;
    } // end function addIncrement

    void print() const; // prints count and increment
private:
    int count;
    const int increment; // const data member
}; // end class Increment

#endif


Increment.cpp:
[C++] 纯文本查看 复制代码
#include "stdafx.h"
using std::cout;
using std::endl;

#include "Increment.h" // include definition of class Increment

// constructor
Increment::Increment( int c, int i )
    : count( c ), // initializer for non-const member
    increment( i ) // required initializer for const member    
{
    // empty body
} // end constructor Increment

// print count and increment values
void Increment::print() const
{
    cout << "count = " << count << ", increment = " << increment << endl;
} // end function print


main.cpp:
[C++] 纯文本查看 复制代码
// increment.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Increment.h"

using std::cout;

int _tmain(int argc, _TCHAR* argv[])
{
    Increment value( 10, 5 );

    cout << "Before incrementing: ";
    value.print();

    for ( int j = 1; j <= 3; j++ )
    {
        value.addIncrement();
        cout << "After increment " << j << ": ";
        value.print();
    } // end for
    return 0;
}

运行输出:
Before incrementing: count = 10, increment = 5
After increment 1: count = 15, increment = 5
After increment 2: count = 20, increment = 5
After increment 3: count = 25, increment = 5

在上面的构造函数中,使用一个成员初始化列表来初始化 Increment 类的两个数据成员:count 和 increment (const 类型) 。

成员初始化列表位于构造函数的参数列表和作为构造函数体开始的左花括号之间,它被一个冒号(:) 与参数列表分开。每一个成员的初始化方式都是由数据成员名称后面紧跟着包含该成员初始化值的一对圆括号组成,比如上面的 increment( i ) 表示 increment 是由 i 来初始化, count( c ) 表示 count 由 c 来初始化;这样的 increment(i) 形式也称为一个”成员的初始化器”。多个成员初始化器之间用逗号隔开。另外需要注意的是,成员初始化器列表在构造函数体执行之前执行

一个常见的错误就是,不为 const 数据成员提供相应的成员初始化器。

常量数据成员 (const 对象和 const 变量)和声明为引用的数据成员必须采用成员初始化器语法形式进行初始化,在构造函数中为这些类型数据赋值是不允许的。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2