const常用小结

来源:互联网 发布:迅雷校园招聘java笔试 编辑:程序博客网 时间:2024/06/08 15:42

在我们自己编程或或阅读他人代码时经常遇到const这个关键字,由于它的用法叫复杂,因而常常我们会被它弄晕,下面就自己的学习对它作一小结。

一 ,在C语言下的常见用法:

1.const定义一个常量,如:

const int a = 10;  // 正确  推荐一种

int const a = 10;  // 正确

用法:在定义常量时需要同时对该常量进行初始化,因为定义了常量之后就不能再改变了。如上面的a,在使用const修饰符限定之后,a就属于一个int型的常量,不能够在修改。那么自然下面的定义就是错误的:

const int a; 

 a = 10;    // error,不能这样定义一个常量

2,const定义一个常量指针,如:

int c = 5;

const int* b = &c;

用法:将const放在类型说明符的前面(注意,这时如果写int* const  b就错了,意义完全不一样)。这时b指向的数据是常量,不可以改变,如这时又写*b = 20;则是错误的,但如果这时又有一变量,int d = 5; b = &d;则是可以的,因为对于b来说,本身的地址是可以改变的。

3.const定义一个指针常量。如:

int a;

int* const b = &a;

用法:将const放在“类型*(如 char*)”的后面;在定义指针常量时,必须同时对指针常量赋值。以后常量指针就不能指向其他变量了。但其指向的内容是可以改变的。如:

char const ch[6] = "Hello";

char* const p = ch;

p = "beautiful"; // 错误,p属于一个指针型的常量,不能修改

*p = "beautiful"; // 正确,仅修改了起指向的内容

3.const 定义指向常量的指针常量,如:

const int a = 80; // 定义常量

const int* const p= &a; // p为常量指针常量,p指向常量a

用法:在 类型*(如:int*)前后均加const.在定义常量指针常量时,也必须对其进行初始化,常量指针保证了指向的数据不可以改变,指针值也不可以改变,即君不可修改。

总结:其实指针常量和常量指针的用法仅就以上的两点来说是逆向的,弄懂了其中的一种,另外一种完全可以反过来去理解了。                                                            

二 在C++中面向对象时的const

在我们进行对数据共享时,为了保证他不被修改,那么我们常使用const,吧相关的数据定义为常量,就是避免我们无意之中的误操作改变有关数据的状况。那么现在我们总结一下const的常用的几点用法。

1.常对象。一般形式为:

类名 const 对象名[(实参表列)] 或

const 类名 对象名[(实参表列)]

Time const t1(28, 63);  // t1为常对象

注意几点:

常对象的数据成员为常变量且必须要有初始化的值。因为为常变量,所以数据成员的值都不能够被修改。

常对象不能调用该对象的非cons 型的成员函数。如果要调用,必需将该成员函数什么为const.如

void getnum() const;   // 函数声明为const

这时该函数被称为常成员函数,就可以访问常对象了。但仍然不能够改变其内数据成员的值。

2.常对象成员(即声明类时将数据成员和成员函数声明为const)

①常数据成员

类似于常变量,如在类中声明常数据成员price如下:

const float price;

注意几点:

(1)只能通过构造函数的参数初始化列表多常数据成员进行初始化。

(2)声明为数据成员后其值在该对象中自始至终是不可变的。

②常成员函数

形式如:

void getprice() const:    // 注意const的位置在函数名和括号之后

注意几点:

(1)常成员函数只能引用本类的数据成员(包括const和非const的)及const对象的数据成员,不能修改他们。一般的成员函数

(2)一般成员函数不允许引用const对象的数据成员,也可以引用本类的数据成员(包括const和非const的),可以修改非const数据成员的值。

(3)常成员函数不能在内调用另一个非const成员函数。

3.指向对象的常指针

将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初值,不能改变,即指向始终不变。

一般形式:

类名* const 指针变量名 = 对象地址;

举例:

Time t1(12, 52), t2;     // 定义对象

Time* const ptrl = &tl;  // const位置在指针变量名前面,规定ptrl的值是常值

                         // 并指向对象tl|.此后不能再改变指向

ptrl = &t2;             // 错误,ptrl不能改变指向

几点注意:

(1)在定义指针变量时使之初始化。否则会出现错误。

(2)指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其所指向的对象(如tl)数据成员的值,

(3)如果想将一个指针变量固定地与一个对象相联系,可以将其指定为const型指针变量。这样可以防止误操作,增加安全性。

(4)常指针常作为函数的形参,意在不允许函数执行的过程中改变指针变量的值。   

4.指向常对象的指针变量  

一般形式:

const 类名 *指针变量名;

(1)如果一个对象已被声明为常对象,那么只能用指向常对象的指针变量指向它,而不能用一般(非const对象)指针变量去指向它。如:

const Time t1(10, 12);

Time* p1 = &t1;        // 非法   

const Time* p = &t1;   // 合法

(2)如果定义一个常对象指针指向一个非const对象,则指向的对象不能通过指针来改变。如:

Time t1(10, 12);

const Time *p = &t1;

t1.hour = 18        // 合法

(*p).hour = 18;     // 非法   

注意几点   

(1)指向常对象的指针最常用于函数形参,目的在于保护形参所指向的对象在函数执行的过程中不被修改。

(2)当希望调用函数是对象的值不被修改,就应当把形参对于为指向常对象的指针变量

5.常引用                                                                                              变量的引用就是变量的别名,变量名和引用名都同指一块内存空间。如果形参为变量的引用名,实参为变量名,则在调用函数时进行虚实结合,把实参的地址传给形参(引用名),如果不希望函数修改实参,则可以讲引用的变量声明为const(常引用) 如;

原来的:void fun(Time &t);

       void fun(const Time &t);  // 常引用

这样就在不能够改变他t的值,也就保证了其对应的实参的值不被修改。


在C++面向对象程序中,经常用常指针与常引用作函数参数,这样既能保证数据安全性,在调用时又不必建立实参的拷贝,而去我们在每次调用函数建立实参的拷贝时,都要调用复制构造函数,有时间上的开销,常指针和常引用作为函数参数,可以提高程序的运行效率。