【原】使用C++关键字const

总结一下C++中几个关键字的用法,只是总结,不做什么分析。我觉得要真正理解的话必须知道C++的内存模型。

被昨天的电话面试弄得好郁闷啊……抓紧时间学习!

据说看一个人代码中const用了多少就初步看出一个人的C++水平,所以我理解就是要尽量多用const。

 

1. 修饰常量

最基本的用法,用const修饰一个变量,表示这是一个常量,这种用法可以代替C语言里面的宏定义。注意要在声明时初始化,如果是类的数据成员,则在构造函数的初始化列表中初始化。

const int a=999;    //定义了常量a,代替宏定义
//const int b;        //错误,常量定义时要初始化
extern const int c;    //外部定义的常量不用初始化了
int const d=0;        //与const int等价,写法习惯不同而已
const long e=0;        //同理,把int换成char、long、类是一样的

class Cls
{
public:
    Cls(
int a,int b):_a(a)    //常数成员要在初始化列表初始化
    {
        _b
=b;
    }

private:
    
const int _a;
    
int _b;
}
;

 

2. 修饰引用,指针

对一个常量的引用或指针要用常指针,也就是不能修改所引用、指向的变量。如果不使用常引用、指针,则须用const_cast<>进行转换。指向字符char的常指针经常用来表示字符串,像windows中的LPCSTR就是const char *。

const int &g=a;            //a的内容不能改,所以g(a的引用)也是const
//int &h=a;            //错误
int &i=const_cast<int&>(a);    //使用const_cast<>()把常量转成非常量
int const &j=a;            //与const int &等价,写法习惯不同而已

const int *k=&a;        //a的内容不能改,所以k(a的指针)也是const
int const *l=&a;        //与const int *等价,写法习惯不同而已
//int *m=&a;            //错误
const char *n="string";        //字符串“string”内部字符不能改变了
char *o="string2";        //字符串“string2”可以修改

 

3. 修饰对象

如果修饰的是一个对象,则表示该对象的数据成员均为常量,并且只能调用该对象的常成员函数,这一点在后面解释。综合1、2、3条得出,const修饰符表示所修饰的内存区域被上了锁,不能修改。对一个对象的常引用经常用来函数传参,当函数参数为对象是,直接按值传参会调用对象拷贝构造函数,复制对象,对程序效率造成影响,所以一般按引用传参,为了不改变传入的参数,要加const表示是常引用。

const Cls f(1,2);    //这个f的_b也不可改变了

void func(const Cls& arg)
{
    
//这种传参方式代替直接按值传Cls
}

 

4. 另外一种const修饰指针的方法

也就是著名的const char *和char * const的区别的问题。const char *前面说过,意思是常指针,char*所指的内存区域不能被修改,用来表示字符串。而char * const的意思指针所指向的位置不能修改,也就是该指针不能指向其他内存区域了,这和引用很像,char * const相当于char &,所以常引用const char &相当于const char * const,也就是指针指向谁不可变,指针指向的内容也不可变。注意const是写在了*的前面还是后面,这是唯一区别,char const *的意思和const char *是一样的。

const char *n="string";        //字符串“string”内部字符不能改变了,但可以让n指向其他字符串
char *o="string2";        //字符串“string2”可以修改

char * const p=o;        //p不能指向其他字符串,但指向的内容可以更改,理解为p是o的引用
const char * const q=n;        //n是常字符串,所以要用常引用

 

5. 修饰成员函数

在一个类的成员函数的参数表后面加上const,表示这是一个常函数,这个函数不会修改该对象数据成员的内容,这个函数也不能调用普通的成员函数,只能调用常函数。其实,常函数是指隐式传入的this指针是个常指针。这种写法可以让编译器帮助我们避免一些错误发生。另外,一个被const修饰的对象,只能调用它的常函数。

class Cls
{
public:
    Cls(
int a,int b,const char* c):_a(a),_c(c)
    
{
        _b
=b;
    }

    
void foo()
    
{
        _b
=123;
    }

    
void foo2() const
    
{
        
//下面两句都会编译错误
        
//_b=234;
        
//foo();
    }

public:
    
const int _a;
    
int _b;
    
const char *_c;
}
;

const Cls f(1,2,"hello");    //这个f的_b不可改变了

void main()
{
    Cls cls(
2,3,"world");
    cls._b
=1;
    
//f._b=1;    //错误
    
//f.foo();    //错误,不能调用非const函数
}

 

 

const常见的用法就这么几种吧,还有的话请大家补充。

posted @ 2009-05-20 12:30  柒笑侠  阅读(702)  评论(0编辑  收藏  举报