您的位置:首页 > 编程语言 > C语言/C++

c++中const小结

2016-03-22 22:19 381 查看
一、指针和const
可以用两种方式将const关键字用于指针:
①让指针指向一个常量对象,可以防止使用该指针修改所指向对象的值
eg.
int age = 39;
const int * pt = &age;//声明一个指向常量的指针pt
pt指向一个const int(这里是39),因此不能使用pt来修改age:
*pt = *pt+1;// wrong , 不能使用该指针(这里是pt)修改所指向对象(这里是age)的值!
cin>>*pt;//wrong,同上
注意:
a)pt的声明并不意味着它指向的值就是一个常量,此处age就不是一个常量,所以可以通过age变量来修改age的值。
age = 40;//right, 此时*pt = 40
b)不能通过pt修改变量的值,但是可以将新地址赋给pt
eg.
int sage = 80;
pt = &sage;
(1) 将常规变量的地址赋给常规指针:可以,并且很常见
eg.
int a= 10;
int *b = &a;
(2)将常规变量的地址赋给const 指针:可以,如上面的age的例子
(3)将const变量的地址赋给常规指针:不可以
eg.
const int age = 39;
int * p = &age;
由于p是常规指针,可以通过*p来修改age的值,这与age是const常量矛盾。
eg.
const
int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//由const数据组成的数组
……
int sum( int arr[], int n); //should
have been const int arr[]
……
int j = sum(months, 12);//wrong!months是常量地址,不能将其赋给非常量指针。
(4)将const变量的地址赋给const指针:可以,此时既不能通过指针来修改变量的值,也不能通过变量名来修改变量值。

②将指针本身声明为一个常量,可以防止改变该指针指向的位置(无法修改指针的值)
eg.
int sloth = 3;
const int *ps = &sloth;//不能通过ps
修改sloth的值,但是可以给sloth重新赋值
int * const finger = &sloth;//finger是一个指向int的const指针,

//可以通过finger修改sloth的值(*finger = 4),但是不能把别的地址赋给finger

二、类中的const
1.const修饰类中的数据成员
eg.
class
A
{……
const int size;
……
};
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。如

class A

{

const int size = 100; //错误

int array[size]; //错误,未知的size

}

const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现。如

class A

{…

enum {size1=100, size2 = 200 };

int array1[size1];

int array2[size2];

}

枚举常量不会占用对象的存储空间,他们在编译时被全部求值。但是枚举常量的隐含数据类型是整数,其最大值有限,且不能表示浮点数。
2.const修饰类成员函数

eg.
class A

{……

void fun() const ;
[b]
};
[/b]

定义时:
void A::fun() const {……}

(1)
const函数(fun())可以被const对象调用,但const成员函数中不能调用非const成员函数(因为可能会改变数据成员);

(2)const成员函数可以访问对象的const成员,别的函数不可以;
(3)非const对象可以访问const成员函数;
(4)一个没有被声明为const的成员函数不能被一个const对象调用.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: