effective C++笔记之条款20、21:避免public接口出现数据成员、尽可能使用const

来源:互联网 发布:华夏航空公司订票软件 编辑:程序博客网 时间:2024/06/06 03:17

条款20: 避免public接口出现数据成员

 

l        如果接口里存在数据成员,用户每次访问类的成员时候会想是该用括号还是不该用括号。如果每个成员都是函数,就不用多想了。

l        采用函数可以更精确地控制数据成员的访问权。如果使数据成员为public,每个人都可以对它读写;如果用函数来获取或设定它的值,就可以实现禁止访问、只读访问和读写访问、只写访问。

l        public中只存放成员函数可以实现功能分离。如果用函数来实现对数据成员的访问,以后就有可能用一段计算来取代这个数据成员,而使用这个类的用户却一无所知。

 

条款21: 尽可能使用const

此条款要好好看

l        使用const的好处在于它允许指定一种语义上的约束—某种对象不能被修改—编译器具体来实施这种约束。

l        const关键字在类的外面,它可以用于全局或名字空间常量,以及静态对象(某一文件或程序范围内的局部对象)。在类的内部,它可以用于静态和非静态成员。

l        const用在指针上:

const char * const p = “hello”;  //const指针,const数据

l        const强大的功能在于它在函数声明中的应用。在一个函数声明中,const可以指的是函数的返回值,某个参数的值;对于成员函数,还可以指的是整个函数。

1. 让函数返回一个常量值经常可以在不降低安全性和效率的情况下减少用户出错的几率。如用在重载乘法操作符上。

2. 关于const参数没有什么特别之处要强调—他们的运作和局部对象const对象一样。

3. const成员函数的目的当然是为了指明哪个成员函数可以在const对象上被调用。仅在const方面有不同的成员函数可以重载

 

l        C++对const成员函数问题的定义,const成员函数不被允许修改它所在对象的任何一个数据成员。

l        如果由于C++对const成员函数的定义而在成员函数内不能修该数据成员,有两种解决方法:

1.        使用关键字mutable,当对数据成员使用mutable时,他们可以在任何地方被修改,即使在const成员函数中。

2.        通过初始化一个局部变量指针,使之指向this所指的同一个对象来间接实现。然后通过该指针间接修改数据成员。

如:String * const localThis= const_cast<Sting * const>(this);

如果想在成员函数中通过转换消除const,最好确信你要转换的对象最初没有被定义为const,因为它会导致不确定的后果。        

l        类C的一个成员函数中,this指针就好像经过如下的声明:

C * const this;   //非const成员函数

const C * const this  //const成员函数

l        通过类型转换消除const即会有用又安全。比如将一个const对象传递到一个取非const参数,同时又知道参数不会在函数内部修改的情况下。如size_t strlen(char *s)的定义能确保在函数内部不会修改s所指的成员,所以可以将const char *类型转换为char *,再传入该函数。