关于c++中const的用法

来源:互联网 发布:my json editor 编辑:程序博客网 时间:2024/05/18 02:47

1.当然最常用的还是作为常量。

(1)const int*p的用法,表示指向的值得类型不变还是int型,但p的值可以变,可以这样理解“自以为指向const的指针”,可以将非const的对象赋值给他例如可以这样:

int i=3;

int j=4;

const int*p;

p=&i;

cout<<*p<<endl;

p=&j;

cout<<*p<<endl;

这要另一个单元的值是int类型就行,其值是可以改变的,我以为其值是不可以变得,但对当前的值是不能改变的,例如*p=3;是错误的。

(2)const指针,指指针不可以变,但它所指向的值是可以变得

如:int errNumb=0;

int *const curErr=&errNumb;

currErr=currErr;//error

*currErr=9;//ok

(3)指向const对象的const指针

const double pi=9.3;

const double *const p_ptr=&pi;

2.const能用做形参,表示传过来的对象不能改变,在程序中经常能用的到

应该将不需要修改的引用定义为const引用,非const引用形参在使用时不放变,这样的形参既不能用const对象,也不能用字面值或者产生右值的表达式实参初始化,加上速度更快,在不用改变实参的情况下应该用const的引用

3.有些类的成员函数是常函数,const可以用来做重载的标志符

只要不是static的成员函数,都隐含的有一个this指针,来引用调用它的对象,const成员函数的const隐含的改变了this形参的类型形式如下:const classname *const this;不能改变调用它的函数对象的数据成员,以前总是不知是怎么回事,现在总算是知道了

4.有的引用可以作为const类型的例如const int& p;此时可以将常量和非常量赋值给它,当将非常量赋值给它时,此时非常量也是不能改变的。此时的p可以用右值或者左值进行赋值,而对于int &p只能以此种类型的值进行赋值,而且不能用左值进行赋值。

5.const对象的动态数组

在程序的自由存储区创建内置类型的const对象时,必须为这个数组提供初始化,实现的唯一方法:

const int *p=new const int[100];//error

const int *p=new const int[100]();//ok

对于类类型必须有类的默认构造函数才行

const string *p=new const string[100];// ok

6.可以将函数的返回类型定义成const类型的引用表示,返回的是对象本身,而且这种值是不能改变的,返回的左值,所以可以给非const的返回值赋值,是在是惊讶

7.关于const在重载中的作用

对于非const的形参,其实等价的,只是复制实参的副本,并没有对实参产生实质的影响,然而对引用和指针,就不一样了,其中的const可以作为重载的条件例如以下的两个函数:

record lookup(account&);

record lookup(const account&);

当传递const对象时,只能用第二种形式,然而传递非const对象时理论上可以使用两种函数,但是选择的是第二种函数,第二种将会发生类型的转换,而非const是精确的匹配。对于指针式同样的道理

以下的函数的const不能作为函数重载的条件

f(int*);

f(int* const);

这与const变量和非const变量是同理,只是改变的是指针的副本

8.const对象定义在头文件中的一些解释

primer上面的p59,具体的还是看不懂,如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义,和其他的变量一样,在头文件中使用extern声明,以使多个文件共享,具体是什么原因,不是很懂

9.下面的不是太懂

typedef string *pstring;

const pstring cstr;

书上面的解释是typedef当成文本扩展了不是很懂,真是不懂???