成员初始化表

 让我们修改Account 类重新声明它的_name 成员为string 型
#include <string>
class Account {
public:
// ...
private:
unsigned int _acct_nmbr;
double _balance;
string _name;
};
我们还需要修改构造函数这涉及到两个主题1 维持与原始接口的兼容性同时适合
新的类型2 用一组相关的构造函数来初始化一个成员类对象
原来的双参数Account 构造函数
Account ( const char*, double = 0.0 );
对于我们的新string 类类型不够用例如如下代码将失败
string new_client( "Steve Hall" );
Account new_acct( new_client, 25000 );
因为在从string 对象到char*之间没有隐式转换而写成
Account new_acct( new_client.c_str(), 25000 );
虽然会奏效但是可能会使用户困惑一个解决方案就是简单地增加一个形式如下的新
构造函数
Account( string, double = 0.0 );
现在当我们写以下语句
Account new_acct( new_client, 25000 );
就会调用该实例

===========================

const 和引用数据成员也必须是在成员初
始化表中被初始化否则就会产生编译时刻错误例如下列构造函数的实现将导致编译
时刻错误
class ConstRef {
public:
ConstRef( int ii );
private:
int i;
const int ci;
int &ri;
};
ConstRef::
ConstRef( int ii )
{ // 赋值
i = ii; // ok
ci = ii; // 错误: 不能给一个 const 赋值
ri = i; // 错误 ri 没有被初始化
}

==========

// ok: 初始化引用和 const
ConstRef::
ConstRef( int ii )
: ci( ii ), ri( i )
{ i = ii; }

===========================

对于类对象在初始化和赋值之间的区别是巨大的成员类对象应该总是在成员初始化
表中被初始化而不是在构造函数体内被赋值缺省Account 构造函数的更正确的实现如下
inline Account::
Account() : _name( string() )
{
_balance = 0.0;
_acct_nmbr = 0;
}
它之所以更正确是因为我们已经去掉了在构造函数体内不必要的对_name 的赋值但
是对于缺省构造函数的显式调用也是不必要的下面是更紧凑但却等价的实现
inline Account::
Account()
{
_balance = 0.0;
_acct_nmbr = 0;
}

=====================

inline Account::
Account( const char* name, double opening_bal )
: _name( name ), _balance( opening_bal )
{
_acct_nmbr = get_unique_acct_nmbr();
}
成员初始化表跟在构造函数的原型后由冒号开头成员名是被指定的后面是括在括
号中的初始值类似于函数调用的语法如果成员是类对象则初始值变成被传递给适当的
构造函数的实参该构造函数然后被应用在成员类对象上在我们的例子中name 被传递给
应用在_name 上的string 构造函数_balance 用参数opening_bal 初始化

 

类似地下面是另一个双参数Account 构造函数
inline Account::
Account( const string& name, double opening_bal )
: _name( name ), _balance( opening_bal )
{
_acct_nmbr = get_unique_acct_nmbr();
}
在这种情况下string 的拷贝构造函数被调用把成员类对象_name 初始化成string 参数
name

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值