effective c++ 条款03 尽可能的使用const (const 的魅力)

刚进入IT程序员这一行有一年的时间了,现在是c++学了点皮毛,最近又想学习python,又想学习java,我否定了自己的想法,还是应该深入的学习c++的stl,以及boost,但摆在前面的还有设计模式,不说了还是塌下心来认真的读几本c++的经典才是最实在的,言归正传。

1.const的基本使用,修饰变量,修饰函数参数。

   1)修饰变量

char greeting[] = "Hello";
char name[] = "cxue";
char* const p = greeting;
p = name;  //不合法的,地址不能改变 
*p= 'x';      //合法的可以改变它的值   
char greeting[] = "Hello";
char name[] = "cxue";
const char* p = greeting;
p = name;  //合法的它的地址可以改变
*p= 'x';      //不合法的值是不可以改变的

2)修饰函数参数时

void display(const char* str)
{
 *str = 'x'; //不合法的,不能给*str赋值。
 cout << str <<endl;

}

 

void display(char* const str)
{
    *str = 'x';//这样确实合法的,在使用的时候要注意呀。 
    cout << str <<endl;

}

还有一点:

void display(const char*  str)
void display(char const *str) //这两个是等同的

const还可以修饰函数的返回值主要表现在运算符重载上,可以防止程序员意外修改。

class Num{...};
const Num operator*(const Num &lhs,const Num &rhs);

Num a, b, c,;
本意想写成:
if(a*b == c)
{};
却不小心写成了:
if(a*b = c)
{};

使用const可以有效的弥补了编译器不能察觉的错误。

 

2、const 在STL中的使用:

#include <iostream>
#include <vector>
//using namespace std;
int main()
{
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    const std::vector<int>::iterator it = vec.begin();
    it++;       //不合法的,it地址是个不能变的变量
    *it = 4;    //合法的

    std::vector<int>::const_iterator it = vec.begin();
    it++;        //合法的
    *it = 5     //不合法的,it为const_iterator类型,it指向的值是不能被改变的。

    
}

3.const 用作于成员函数
const实施于成员函数有两个重要的意义,第一:我们可以知道哪个成员函数可以改变对象里的内容,第二,使操作“const 对象”成为了可能。

还有一个容易被人们忽略的一点是两个成员数如果只是常量性不同,可以被重载。

看一下demo:

#include <iostream>
#include <vector>
//using namespace std;

class TextBox{

private:
    std::string text;
public:
    TextBox(std::string str):text(str){};
    ~TextBox(){};
    const char& operator[] (int position) const
    {
        std::cout << "const"<<std::endl;
        return text[position];
    };
    char& operator[] (int position)                 //注意返回的是char& ,返回char类型是不合法的,如果那样意味着我们将修改一个text[position]的副本。
    {
        std::cout << "non-const" <<std::endl;
        return text[position];
    };
};
int main()
{
    const TextBox box("hello,world");
    TextBox box2("cxue");
    std::cout<< box[0] << std::endl;
    std::cout<< box2[1] << std::endl;
    
    getchar();
    
}

运行结果如下:

 

4.一个与const相关的摆动场:mutable(可变)。

mutable可以理解为可以释放掉出non-static成员变量的bitwise constness的约束:

class CTextBlock{
public:
    int length()const;
private:
    char* pText;
    mutable int textLength;
    mutable bool lengthIsValid;
};
int CTextBlock::length()const
{
    if(!lengthIsValid)
    {
        textLength = std::strlen(pText);
        lengthIsValid = true;
    }
    return textLength;

}

 

posted @ 2013-04-25 16:31  onlycxue  阅读(399)  评论(0编辑  收藏  举报