c++里有关指针的内容中,const的位置对指针含义的影响。

具体问题如下:const double * pValue = &radius和double * const pValue= &radius的含义有何不同?

C++中const总结

一:对于基本声明
1.const int r=100;
//标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域
为此文件,编译器经过类型检查后直接用100在编译时替换.

2.extend const int r=100;
//将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行
初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.

3.const int r[]={1,2,3,4};
struct S {int a,b;};
const S s[]={(1,2),(3.4)};
//以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中
的值,例如:int temp[r[2]];这样的编译器会报告不能找到常量表达式

二:对于指针
1.const int *r=&x;
//声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何
地址的常量.

2.int const *r=&x;//与用法1完全等价,没有任何区别。

3.int * const r=&x;
//声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址
的内容可以修改.

4.const int * const r=&x;
//综合1,3用法,r是一个指向常量的常量型指针.

三:对于类型检查
可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个
指针来修改其对象的值,但是不可以把一个const对象赋值给一个非const指针,
因为这样可能会通过这个指针改变指向对象的值,但也存在使这种操作通过的合
法化写法,使用类型强制转换可以通过指针改变const对象:
const int r=100;
int *ptr=const_cast <int*> (&r);//C++标准,C语言使用:int* ptr =(int*)&r;

四:对于字符数组
如char * name = "china ";
这样的语句,在编译时是能够通过的,但是 "china "是常量字符数组,任何想修改
他的操作也能通过编译但会引起运行时错误,如果我们想修改字符数组的话就要
使用char name[]= "china ";这种形式.

五:对于函数
1.void Fuction1(const int r);
//此处为参数传递const值,意义是变量初值不能被函数改变

2.const int Fuction1(int);
//此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数
按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何
的const或非const类型变量,完全不需要加上这个const关键字.但这只对于内部
类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左
值使用),对于用户自定义类型,返回值是常量是非常重要的,见下面条款3

3.Class CX; //内部有构造函数,声明如CX(int r =0)
CX Fuction1 () { return CX(); }
const CX Fuction2 () { return CX(); }
如有上面的自定义类CX,和函数Fuction1()和Fuction2(),我们进行如下操作时:
Fuction1()=CX(1); //没有问题,可以作为左值调用
Fuction2()=CX(1); //编译错误,const返回值禁止作为左值调用.因为左值
把返回值作为变量会修改其返回值,const声明禁止这种修改.

4.函数中指针的const传递和返回
int F1 (const char * pstr);
//作为传递的时候使用const修饰可以保证不会通过这个指针来修改传递参数的
初值,这里在函数内部任何修改*pstr的企图都会引起编译错误.
const char* F2();
//意义是函数返回的指针指向的对象是一个const对象,它必须赋给一个同样是指
向const对象的指针.
const char* const F3();
//比上面多了一个const,这个const的意义只是在他被用作左值时有效,它表明这
个指针除了指向const对象外,它本身也不能被修改,所以就不能当作左值来处理.

5.函数中引用的const传递
void F1 (const X& px);
//这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁
止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本,
然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.

另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性,
且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const
传递能够捕捉到这个家伙.

六:对于类
1.首先,对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,
试图在构造函数体内进行初始化const成员变量会引起编译错误.初始化成员列表
形如:X::X(int ir):r(ir){} //假设r是类X的const成员变量

2.const成员函数.提到这个概念首先要谈到const对象,正象内置类型能够定义
const对象一样(const int r=10;),用户自定义类型也可以定义const对象
(const X px(10);),编译器要保证这个对象在其生命周期内不能够被改变.如果
你定义了这样的一个const对象,那么对于这个对象的一切非const成员函数的调
用,编译器为了保证对象的const特性,都会禁止并在编译期间报错.所以如果你想
让你的成员函数能够在const对象上进行操作的话,就要把这个函数声明为const
成员函数.
假如f()是类中的成员函数的话,它的声明形如:
int f()const;
//const放在函数的最后,编译器会对这个函数进行检查,在这个
函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法
注意:类的构造和析构函数都不能是const函数.

3.建立了一个const成员函数,但仍然想用这个函数改变对象内部的数据.这样的
一个要求也会经常遇到,尤其是在一个苛刻的面试考官那里.首先我们要弄清楚考
官的要求,因为有两种方法可以实现,如果要求不改变原来类的任何东西,只让你从
当前这个const成员函数入手,那么你只有使用前面提到的类型强制转换方法.实例
如下:
//假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函
数f()来对这个r进行++r操作,代码如下:
void X::f()const
{const_cast <X*> (this)-> ++r; } //通过this指针进行类型强制转换实现
另外一种方法就是使用关键字:mutable.
如果你的成员变量在定义时是这个样子的:mutable int r;
那么它就告诉编译器这个成员变量可以通过const成员函数改变.编译器就不会再
理会对他的检查了
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-11-11
前一个是指针常量 就是说radius值是不能变的 但pValue 是可以变的 可以指向其他地址 后一个是常量指针,就是说pValue只能指向radius的地址,不能变了 但可以改变radius的值
第2个回答  2007-11-11
const在*号前面的,该指针指向的数据是"const",不能通过指针修改指针指向数据的值,例
*pValue=0是非法的。
const在*号后面的,该指针是const,指针的值不能被改变,例pvalue = &else是非法的。

C++中const关键字的作用有哪些?
在C++中,const关键字有以下作用:1.声明常量:const关键字可以用来声明常量,这意味着一旦赋值后就不能再改变它的值。2.修饰函数参数:const关键字可以用来修饰函数参数,表示该参数是只读的,不能被修改。3.修饰指针:const关键字可以用来修饰指针,表示该指针所指向的内容是只读的,不能被修改。4.修饰...

const在c++中的作用
(1)指向常量的指针:所指内容为常量,指针为变量(const放在内容类型前)例如:constchar*p=“good”;\/\/const在char之前,表示指针指向的字符为常量,*(p+2)=‘l’;\/\/错误,所指对象为常量,p=“very”;\/\/正确,指针为变量(2)指针常量:指针为常量,指向内容为变量(const放在指针前)例如:char...

C++在函数声明时,后面跟个const是什么意思?
const关键字在指针和引用中,强调了它们对目标对象的保护作用,尽量使用const指针可以提高代码的可维护性。总的来说,const在C++中的使用不仅是对函数行为的约束,也是一种编程习惯,它在保证代码安全性和可读性方面起到了关键作用。

C++中运算符重载问题,分别说明下面const的作用以及为什么要用引用_百 ...
函数中使用CONST(1)const修饰函数参数 a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)void function(const int Var); b.参数指针所指内容为常量不可变void function(const char* Var); c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)void function(char* const Var...

c++做程序时,关键词const的修饰对象和引用位置好像很混乱哦?
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题...

c++中const的作用是什么?
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;(3)在一个函数声明中,const可以修饰形参,表明它是一个输入...

C++中const关键字作用有哪些
const int Max=100; int Array[Max];(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如:void f(const int i) { ...}编译器就会知道i是一个常量,不允许修改; (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。(4)可以保护被修饰的东西,...

C++中const在函数名前面和函数后面的区别
)看作成一个变量,即指针内容不可变。c.int* const fun3() \/\/调用时int * const pValue = fun2();\/\/我们可以把fun2()看作成一个变量,即指针本身不可变。但是在类里面修饰成员函数时可以放到后面,表示长成员函数 void function()const; \/\/常成员函数,它不改变对象的成员变量....

C语言const关键字的用法
int * const p1,p2; \/\/p1指针不可改变,但所指地址的内容可变 在指针使用中,const关键字的放置位置决定了其对指针和指针所指向内容的约束程度。简而言之,“左定值,右定指向”,即const在*的左边时,指针指向的变量值不可直接通过指针改变(可通过其他方式改变);反之,const在*的右边时,指针的...

C++指针常量的问题
C++中,const关键字被用于表示常量。常量与变量的区别在于,常量在定义后不能被随意更改,而变量则可以。当你声明了一个常量,如const pi = 3.14;,这意味着pi这个值在程序执行过程中保持不变。这样做能为后续代码提供便利,如需要使用这个固定值。假设后续你发现需要将pi的值精确到更多位,比如3....

相似回答