标签:mgr 注意 用户 strong 对象 个数 定义类 方式 除了
一、在类中定义类型别名:
除了在类中定义数据和函数成员以外,类还可以自定义某种类型在类中的别名。类型别名也需要用访问说明符修饰。
如下所示:
1 class Screen{ 2 public: 3 //使用类型别名 4 typedef std::string::size_type pos; 5 //也可以使用别名声明 6 using pos = std::string::size_type; 7 };
定义类型的成员必须先定义才能使用,这与普通成员有所区别(原因后面再填坑),所以类型成员通常出现在类开始的地方。
在类内使用类型别名有什么好处呢? Screen的用户不知道Screen使用了什么类型来存储它的数据,所以通过把pos定义成public成员来隐藏Screen实现的细节。
二、将成员设置为inline函数
定义在类内部的函数自动成为inline的(注意是定义!!!)。我们最好在类的外部用inline说明符修饰函数,使它成为内联的。不过也可以在类的内部把inline作为声明的一部分显式的声明成员函数(不推荐)
三、可变数据成员(mutable data member)
有时我们希望修改类的某个数据成员,可以在变量声明前加入mutable关键字。一个可变数据成员永远不可能是const的,即使它是在一个consts对象内。因此一个const成员函数可以修改一个mutable成员的值。任何成员函数包括const函数在内的所有函数都可以修改它的值。
可变数据成员的作用是什么呢? 比如你让给一个const成员函数传入(const class object)此时你就不能更改class object的值,但是你恰巧需要一个变量是变动的,此时最能满足你的就是mutable data member。
class Screen{ public: void some_member() const; private: mutable size_t access_ctr; //即使在一个const对象内也能够被修改 }; void Screen::some_member() const { ++access_ctr; }
四、类数据成员的初始值:
当我们初始化类类型的成员时,需要为构造函数传递一符合成员类型的实参。最好的方式就是把这个默认值声明成一个类内初始值。
如下所示:
1 class Window_mgr{ 2 private: 3 std::vector<Screen> screens{Screen(24,80,‘ ‘)}; 4 5 };
标签:mgr 注意 用户 strong 对象 个数 定义类 方式 除了
原文地址:https://www.cnblogs.com/ccpang/p/11375036.html