类的基础知识点
Sales_data类
1 | #include<bits/stdc++.h> |
Screen类和Window_mgr类
1 | #include<bits/stdc++.h> |
1. Screen(char c): Screen(4,2,c) {}; 的写法
这其实也是构造函数,是委托构造函数,Screen(4,2,c)是受委托的函数。执行时,受委托的构造函数的初始值列表和函数体先执行,然后在执行委托者的函数体。
2. explicit Screen(char c): Screen(4,2,c) {}; 中的explicit
explicit 可以抑制构造函数定义的隐式转换。
1 | //如果去掉中的explicit,那么下面的代码是可以通过的 |
3. 为什么move,set,这些函数要左值返回?有什么好处?
左值返回意味着我们可以当做左侧运算对象。1
2
3// 如果不是左值返回,那么下面代码无法通过:
s.move(3 , 0).set('$');
//如果是左值返回,那么s.move(3 , 0)返回的是一个Screen对象的&,即还是返回了s,那么就可以调用set函数了。
4. 为什么display函数要定义两个?
因为display函数只是负责打印而没有修改的功能,所以我们希望display为const成员,所以this指针将是指向const的指针,所以display返回类型是const Screen &,注意const Screen &display(ostream &os) const 中const Screen &才是返回类型。1
2
3//如果display返回的是const Screen &,那么下边的代码无法通过编译:
s.display(cout).set('&');
//所以我们重载一个非const版本
5. 为什么要单独定义do_display这个函数?
这就是公共代码使用私有功能的函数
- 避免重复相同的代码
- 修改代码时更方便
- 不会带来额外开销,类内隐式被声明为inline函数
