#include <iostream>
#include <string>
using namespace std;
// typedef 别名
// 类可以自定义某种类型的类中的别名
class Screen {
public:
// 隐藏Screen实现的细节,用户不知道Screen使用了一个string对象存放数据
typedef string::size_type pos;
Screen(string c) :
contents(c) {
}
Screen &move(int c);
// 重载函数
Screen &set(char);
Screen &set(pos, pos, char);
Screen &display(ostream &os);
private:
void do_display(ostream &os) const { os << contents; }
pos cursor = 0, height = 0, width = 0;
string contents;
};
//一般类的成员函数默认为内联函数,不需要显式声明
inline Screen &Screen::move(int c) {
cursor = c;
// 返回 *this 成员的函数
return *this;
}
Screen &Screen::set(char c) {
contents[cursor] = c;
// 将 this 对象作为左值返回
return *this;
}
Screen &Screen::display(ostream &os){
do_display(os);
// 将 this 对象作为左值返回
return *this;
}
int main() {
Screen mScreen("The program is running");
mScreen.move(21).set('!').display(cout); //从左到右依次执行
cout << endl;
return 0;
}
当我们set成员函数返回值调用set的对象的引用,返回引用的函数是左值的,意味着这些函数返回的是对象本身而不是副本,我们可以:
//将
mScreen.move(21).set('!').display(cout)//写成
mScreen.move(21);
mScreen.set('!');
mScreen.display(cout);
//这种形式
一个const成员函数如果以引用的形式返回*this,那么它的返回类型将是个常量引用。