const的常见用法

来源:互联网 发布:oa办公系统java源代码 编辑:程序博客网 时间:2024/06/05 22:40

在我们学习C语言或者C++的时候const或许是其中一个容易混淆的知识点,那么今天就来总结一下const的一些用法。const 的用法主要是防止定义的对象被再次的修改,也就是const修饰的是一个常量而不是一个变量。那么既然是一个常量的话就需要对它进行初始化一个值。
下面就来介绍const的几种常见用法:
1、用于定义常量,定义之后的对象不能再被修改。
const int a = 100;
a = 10; //错误
const修饰的对象是一个常量,常量是不可以再被修改的。

2、类中使用const修饰的函数来防止修改非static类成员变量。

class fun{public:    int fun()const //加const进行修饰    {        a = 10; //不可以修改非static变量        b = 10; //可以修改    }private:    int a;    static int b;}

3、保护传参时的参数不被修改,使用引用或者地址传参给一个函数时,如果在函数内部参数被修改,那么外部传进来的参数也会发生改变,为了保护其不能被修改可以加const。
如果参数做输出用,无论是什么数据类型,无论是传指针还是传引用都不能加const,否则参数将失去输出功能。
const修饰输入参数:
如果传的参数是指针,加上const可以防止因为意外而修改指针起到保护的作用。下面是“const&”的用法:
1)对于非内部的数据类型的输入参数,将“值传递”改为“const引用传递”会提高效率。
2)对于内部数据类型的输入参数,不要将“值传递”改为“const引用”传递。否则,即达不到提高效率目的,又降低了函数的可理解性。

4、const修饰函数返回值。
如果以“指针传递”方式的函数返回值加上const修饰,那么返回的指针将不能被修改。该返回值只能赋给加const修饰的同类型的指针。
例如:
const char* GetString(void);
char* str = GetString(); // 错误
const char* str = GetString();
如果返回值不是内部数据类型,将A GetA(void)改写成const A GetA(void)能提高效率,但是一定要清楚函数是要返回一个对象的拷贝,还是要返回“别名”就可以啦。否则就会出错。
例:

class A{    A& operator=(conts A& other);//赋值函数};A a,b,c; //a、b、c是A的对象a = b = c;//正常的链式赋值(a = b)= c;//不正常的链式赋值,但是合法

如果将赋值函数的返回值加上const修饰,那么该返回值的形式不予许被改动。上例中,语句a = b = c任然正确,但(a = b) = c就是非法的。
5、const修饰成员函数。
关于const成员函数有几点规则:
a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数。
b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的。
c. const成员函数不可以修改对象的数据,不管对象是否具有const性质。它在编译时,以是否修改成员数据为依据,进行检查。

d. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的。
6、const修饰指针。
const int* p;(int const *p):是一指向整型常量的指针,因为const修饰的是*p,所以不能修改p所指向的值,但是可以修改指针p的值。
int* const p:是一个指向整型的常量指针,因为const修饰的是p,所以我们可以修改p所指向的值*p,但是不能修改p本身。
int const* const *p:因为两个const分别修饰了p所指向的值,和p的值,所以我们不能对这个表达式作出任何的修改。

注意:
用const声明常量时,一定要给常量初始化。

0 0
原创粉丝点击