数据成员不能在类体中被显式地初始化。类的数据成员通过类的构造函数进行初始化

 

string::size_type
这是一个可移植的类型用来存放string 的索引

 

公有成员public member 在程序的任何地方都可以被访问

私有成员private member 只能被成员函数和类的友元访问

被保护成员protected member 对派生类derived class 就像public 成员一样
对其他程序则表现得像private

 

友元声明以关键字friend 开头它只能出现在类的声明中所以它们不受其在类体中被声明的public private 和protected 区的影响

 

通常在类体外定义的成员函数不是inline 的但是这样的函数也可以被声明为inline
函数可以通过显式地在类体中出现的函数声明上使用关键字inline 或者通过在类体外出
现的函数定义上显式使用关键字inline 或者两者都用

 

由于内联函数必须在调用它的每个文本文件中被定义所以没有在类体中定义的内联成
员函数必须被放在类定义出现的头文件中例如前面给出的move()和get()的定义应该被放
在头文件Screen.h 中且跟在类Screen 的定义后面

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

只有被声明为const 的成员函数才能被一个const 类对象调用关键字const 被放在成员
函数的参数表和函数体之间对于在类体之外定义的const 成员函数我们必须在它的定义
和声明中同时指定关键字const 例如
class Screen {
public:
bool isEqual( char ch ) const;
// ...
private:
string::size_type _cursor;
string _screen;
// ...
};
bool Screen::isEqual( char ch ) const
{
return ch == _screen[_cursor];
}
把一个修改类数据成员的函数声明为const 是非法的例如在如下简化的Screen 定义

class Screen {
public:
int ok() const { return _cursor; }
void error( int ival ) const { _cursor = ival; }
// ...
private:
string::size_type _cursor;
// ...
};
ok()的定义是一个有效的const 成员函数定义因为它没有改变_cursor 的值但是error()
的定义修改了_cursor 的值因此它不能被声明为一个const 成员函数

 

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

const 成员函数可以被相同参数表的非const 成员函数重载例如
class Screen {
public:
char get(int x, int y);
char get(int x, int y) const;
// ...
};
在这种情况下类对象的常量性决定了调用哪个函数
int main() {
const Screen cs;
Screen s;
char ch = cs.get(0,0); // 调用 const 成员
ch = s.get(0,0); // 调用非 const 成员
}

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

对于一个volatile 类对象只有volatile
成员函数构造函数和析构函数可以被调用
class Screen {
public:
char poll() volatile;

};
char Screen::poll() volatile { ... }

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

为了允许修改一个类的数据成员即使它是一个const 对象的数据成员我们也可以把
该数据成员声明为mutable 易变的mutable 数据成员永远不会是const 成员即使它是
一个const 对象的数据成员mutable 成员总可以被更新即使是在一个const 成员函数中
为把一个成员声明为mutable 数据成员我们必须把关键字mutable 放在类成员表中的数据成
员声明之前
class Screen {
public:
// 成员函数
private:
string _screen;
mutable string::size_type _cursor; // mutable 成员
short _height;
short _width;
};
现在任何const 成员函数都可以修改_cursor 我们可以把成员函数move()声明为const

即使move()修改了数据成员_cursor 也不会有编译错误产生
// move() 是一个 const 成员函数
inline void Screen::move( int r, int c ) const
{
// ...
// ok: const 成员函数可以修改 mutable 成员
_cursor = row + c - 1;
// ...
}

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

在成员函数中this 指针的用处不全是返回该成员函数被应用的对象在13.3 节介绍成
员函数copy()时我们看到了this 指针的另一种用法
void Screen::copy( const Screen& sobj )
{
// 如果 Screen 对象与 sobj 是同一个对象
// 无需拷贝
if ( this != &sobj )
{
// 把 sobj 的值拷贝到 *this 中
}
}

如果sobj 指向的对象的地址与this 指针值相等
则sobj 和this 指向同一对象拷贝动作是不必要的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值