道路交通事故案例分析:const用法详解,如何修饰变量,返回值以及成员函数(转载)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 03:03:12

const关键字是用来修饰一个变量使其成为常量(constant)的。常量只能在定义时进行初始化,而此后对这个变量的任何改变都将是非法的。const关键字在就是为了保证了它修饰的对象不被修改。

对于指针来说,const关键字同样可以保证它修饰的对象不被修改,但是与一般的对象有所不同,const可以指定指针本身为常量,也可以指定指针所指的对象为常量,亦或兼而有之。咱们看看下面这个例子:

char* p = "Hello" //#1

char* const p = "Hello" //const修饰指针p,#2

const char* p = "Hello" //const修饰指针所指向的内存, #3

const char* const p = "Hello" //const同时修饰指针以及所指内存 #4

想理解上面的4个例子,最关键,是要理解const的作用对象是什么。

#1,无论修改p还是*p都没有问题;

#2,可以修改*p,但不能修改已经被定义为常量的p,这相当于一个引用;

#3,const修饰指针p所指向的内存,所以指针可以修改,而这块内存不能修改;

#4,这是一种极端情况,一般来说,在编程中很少用到,它就相当于一个const的引用。

const还在函数的声明中体现出强大的功能。它可以指定一个函数的返回值,或者函数的参数;而对于类的成员函数,const还可以修饰其访问权限。

我们来看一个简单的例子:

class my

{

public:

const int& get() const; // #5

int& get(); // #6

private:

int m_n;

};

int my::get() const

{

return m_n;

}

int& my::get()

{

return m_n;

}

我们看到在my这个类中,有两个几乎相同的函数,为什么这样的函数也可以重载呢?它们居然有用了相同的参数列表,不过此时的参数列表是空的。

不用害怕,有后缀const存在,可保无虞!

那么我们就来看看,这个const到底干了些什么勾当。

对于普通的成员函数来说,C++编译器在调用它们的时候,都会隐式的提供一个this指针,所以,其实我们刚刚看到的那两个函数的参数列表不是空的,只不过编译器在欺骗我们,当然,我们可不会上它的当。那么现在,我们如此理解它们:

const int& get(my* this) const; // #7

int& get(my* this); // #8

这依然使我们产生了一些视觉上的不快,虽然,它们不再使空参数列表,但是参数列表好像还是相同,显然,如果真是这样,真两个函数肯定是无法重载的,那么问题一定就在哪个const后缀上。

那么现在,我就可以回答大家的疑问:在成员函数的后缀加上const之后,将会导致这个函数的参数列表轻微的改变,被影响的参数就是那个鬼鬼祟祟的this指针,this指针将会被const重新修饰。从而那两个函数,我们就可以写成这样:

const int& get(const my* this); // #9

int& get(my* this); // #10

OK

小功告成,现在,立即重载!

好,那么,如何去区分这两个函数不同的调用呢?

其实,只要理解了以上的思想,这已经不存在障碍了,只要我们能够让一个对象成为const类型,那么它就会自动去选择被后缀const修饰过的重载函数。

我们在前面提到过const可以修饰函数的返回值?这是怎么回事呢?对一个返回值进行修饰?有意义吗?

当然,当然。其实,这不是一个语法上的问题,而是一个逻辑上的问题。我们还是使用那个万人迷例子吧:

class my_int

{

public:

my_int(int n)

{

m_n = n;

}

my_int& operator+(my_int a);

private:

int m_n;

}

my_int& operator+(my_int a)

{

m_n += a.m_n;

return *this;

}

现在,我们返回的是一个my_int对象的引用,如果,我们不限定它是一个const类型的话,将会允许下面的这种怪物出现:

my_int a(3), b(5), c(19);

(a += b) = c;

显然,这是不应该被允许的一种表达式,对一个结果进行赋值,是一种非常愚蠢和丑陋的行为,所以,我们要这样修改我们的operator+函数:

const my_int& operator+(my_int a);

OK,一切大功告成,打瞌睡和发呆是我的爱好!!