const用法

来源:互联网 发布:百变空间制作软件 编辑:程序博客网 时间:2024/06/06 18:18

简单的以char类型来进行解释。

首先看const char achar const a,这两个形式不一样,但是其结果是一样的——都是保证a的数值不被改变,所以在声明的时候需要对其进行赋初值。

下面分析稍微复杂一点的形式,const char* ptrchar const *ptrchar* const ptr,前面两种其实是一样的,都用于保证*ptr当中的数据不被改变,但是后者却是保证ptr的地址不被改变。为什么会有这种差异呢?我们都知道定义一个无符号数,是unsigned int但是有没有想过反过来也可以呢?其实这里是因为const需要从左到右找到一个与自己结合的类型,所以const char*char const*第一个找到的都是char因此const是保证*ptr不被改变,而char * const ptr第一个找到的似乎也是char,实际不然,如果把char当做一个类型给解释了,那么剩下来的*怎么解释呢?所以上面的char*当做一个整体解释。

接下来在复杂一点,const用于修饰函数的时候会出现什么样的结果呢?一个函数简单地可以分为三部分returntype funcnamearguments)也就是函数返回值,函数名称和括号内的参数。因为函数的返回值是一个类型,所以对于const放在返回值左右两边实际上和上面的分析是一样的。但是有一点需要注意,假设有下面的类别当中有如下的函数:

接下来是函数名funcname和括号之间的空隙之内也可以放const修饰,但是这个在VS2012下面会报错(不知道在其他的编译器下面会不会,const左边的是返回值和函数名,这一个哪一个被当做类型和const结合呢?)接下来是括号内用于修饰参数。有一个很常用的函数strcpy(char * dst, const char * src),在这个函数里面,元字符串当中的数据时被保护的。不过重点不在这里,而是在C++当中,有一个比较麻烦的问题。那就是编译器会自动给你加一些你不想要的代码。比如说给一个函数传递一个自定义的类别作为实参,编译器会在函数调用的时候另外加上一些构造函数并在函数结束的时候调用析构函数。假设我们用引用调用来传递函数,也就是讲func(class a)改变为func(class&),这样就可以避免调用构造函数和析构函数。但是也可能会引起不必要的改变class当中的值,所以就要用const修饰,也就是最终函数的样子为func(const class&)。当然当你需要利用引用返回结果的时候,你可以将const去掉,并且result func(class&)比class func1()调用更加高效,因为实际上后者在返回值的时候会调用拷贝构造函数,将局部的值返回给调用函数。所以class a;a=func1()会引起程序崩溃,因为调用了两次构造函数。Const修饰函数的最后的位置是括号的右边,这是一个比较特殊的用法,放在这里表明类别当中的所有数据成员都不能在这个函数当中被改变。

举例如下:

class a{public:const class a&operator =(class a& other){return other;}};int main(){class a a1,a2,a3;(a1=a2)=a3;return 0;}

上面这个程序就会报错,因为在首先进行(a1=a2)运算的时候返回一个临时值,这个值不知道是否属于const,所以编译器报错返回值改变了const性质。

所以在某些场合,非const数据可以赋值给const数据,但是反过来就不行了。

0 0
原创粉丝点击