class String {
public:
// 错误: 名字 index_type 还没有被声明
char& operator[]( index_type );
typedef int index_type;
};
在类定义中用到的名字必须在使用前首先被声明这个规则有两种例外的情况第一个
例外是对于被用在inline 成员函数定义中的名字第二个例外是于被用作缺省实参的名字
我们来依次了解每一种情况
==================
注意成员_string 是在类体中operator[]()的定义之后被声明的这是可以的在operator[]()
函数体中_string 不是一个未声明的名字
缺省实参也是在名字解析的第二步——在类的完整域中被解析例如成员函数clear()
的声明使用了定义在后面的静态成员bkground 的名字
class Screen {
public:
// bkground 指向在类定义中后来声明的静态成员
Screen& clear( char = bkground );
private:
static const char bkground = '#';
};
尽管在成员函数声明中的缺省实参是在类的完整域中被解析的但是如果缺省实参引用
了一个非静态成员则程序仍然是错的非静态数据成员在它的值被程序使用之前必须先
被绑定到该类类型的对象上或绑定到指向该类类型的对象的指针上把非静态数据成员用
作缺省实参违背了这个限制
在类体之外的类成员定义中在被定义的成员名字之前的程序文本不在该类的域内
如果这些程序文本要引用类成员则必须使用域解析操作符例如如果静态成员的类型是
类Account 的typedef 成员Money 则在类体之外定义静态数据成员时名字Money 必须被
限定修饰
class Account {
typedef double Money;
// ...
private:
static Money _interestRate;
static Money initInterest();
};
// Money 必须用 Account:: 限定修饰
Account::Money Account::_interestRate = initInterest();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)