c++中const是怎么使用的? c++中const&表示什么意思

c++\u4e2d const\u7684\u4f5c\u7528\u662f\u4ec0\u4e48

CONST\uff1a\u4e00\u4e2aC\u8bed\u8a00\u7684\u5173\u952e\u5b57

\u8fd9\u4e2a\u51fd\u6570\u53ef\u662f\u5f88\u6709\u610f\u601d\u554a
\u5168\u90e8\u7684\u5e94\u8be5\u662ftemplate inline T const & max( T const & a, T const & b )\u5427\uff01
\u9996\u5148\u8fd9\u662f\u4e00\u4e2a\u51fd\u6570\u6a21\u677f\uff0c\u4f5c\u7528\u662f\u6bd4\u8f83 T\u7c7b\u578b\u7684\u4e24\u4e2a\u53d8\u91cf a b,\u7684\u5927\u5c0f\uff01
inline \u8868\u793a\u8fd9\u662f\u4e00\u4e2a\u5185\u8054\u51fd\u6570\u4f5c\u7528\u4f60\u5c31\u81ea\u5df1\u67e5\u5427\uff01\u8fd9\u4e2a\u633a\u91cd\u8981\u7684\u54e6\uff01
\u6211\u91cd\u70b9\u8bf4\u540e\u9762\u7684const \u5148\u8981\u77e5\u9053\u88abconst\u4fee\u9970\u7684\u53d8\u91cf\u662f\u8868\u793a\u4e00\u4e2a\u5e38\u91cf\uff0c\u8fd9\u4e2a\u6570\u662f\u4e0d\u80fd\u88ab\u6539\u53d8\u7684\uff0c\u5426\u5219\u4f1a\u5f15\u8d77\u4e00\u4e2a\u7f16\u8bd1\u9519\u8bef

\u7b2c\u4e00\u4e2aconst \u8bf4\u660e\u8fd9\u4e2a\u51fd\u6570\u7684\u8fd4\u56de\u503c\u662f\u4e00\u4e2a\u4e0d\u80fd\u88ab\u6539\u53d8\u7684\u6570\uff0c\u800c\u90a3\u4e2a& \u662f\u8fd9\u4e2a\u6570\u7684\u5f15\u7528\uff08\u8fd9\u4e2a\u6982\u5ff5\u4e5f\u8981\u7279\u522b\u6ce8\u610f\u8d77\u6765\u54e6
\u6700\u540e\u4e24\u4e2aconst \u8868\u793a\u53c2\u6570 \u662fconst\u7684\u4e24\u4e2a\u5f15\u7528

\u8fd9\u6837\u505a\u5f88\u6709\u597d\u5904\u7684\uff0c\u7528\u5f15\u7528\u53ef\u4ee5\u51cf\u5c11\u6570\u503c\u4f20\u9012\u8fc7\u7a0b\u4e2d\u7684\u65f6\u95f4\uff0c\u800cconst\u5219\u4fdd\u8bc1\u8fd9\u4e2a\u4f20\u8fc7\u6765\u7684\u503c\u5728\u4f7f\u7528\u65f6\u4e0d\u88ab\u6539\u53d8\u3002

\u503c\u5f97\u601d\u8003\u54e6\uff01

用来修饰变量或函数(包括成员函数)及其参数:
(1)const修饰基本数据类型
(2)const应用到函数中
(3)const在类中的用法
(4)const修饰类对象,定义常量对象
一、const修饰基本数据类型
1.const修饰一般常量及数组
const int a=10; 等价的书写方式: int const a=10;
const int arr[3]={1,2,3}; int const arr[3]={1,2,3};

对于类似这些基本数据类型,修饰符const可以用在类型说明符前,也可以用在类型说明符后,其结果是一样的。在使用这些常量的时候,只要不改变这些常量的值便好。
2.const修饰指针变量*及引用变量&
介绍本部分内容之前,先说说指针和引用的一些基本知识。
指针(pointer)是用来指向实际内存地址的变量,一般来说,指针是整型,而且一般的大家会接受十六进制的输出格式。
引用(reference)是其相应变量的别名,用于向函数提供直接访问参数(而不是参数的副本)的途径,与指针相比,引用是一种受限制的指针类型,或者说是指针的一个子集,而从其功能上来看,似乎可以说引用是指针功能的一种高层实现。
关于运算符&和*:
在C++里,沿袭C中的语法,有两个一元运算符用于指针操作:&和*。按照本来的定义,&应当是取址符,*是指针符,也就是说, &用于返回变量的实际地址,*用于返回地址所指向的变量,他们应当互为逆运算。实际的情况也是如此。
在定义变量的引用的时候,&只是个定义引用的标志,不代表取地址。
***************************const修饰指针(*):*********************
const int* a = & [1] //非常量数据的常量指针 指针常量
int const *a = & [2] //非常量数据的常量指针 a is a pointer to the constant char variable

int* const a = & [3] //常量数据的非常量指针指针常量 常量指针 a is a constant pointer to the (non-constant) char variable

const int* const a = & [4] //常量数据的常量指针
可以参考《Effective c++》Item21上的做法,
如果const位于星号*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操作,如不能*a = 3 ;
[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;
[4]为指针本身和指向的内容均为常量。
****************const修饰引用(&):***************************
int const &a=x;
const int &a=x;
int &const a=x;//这种方式定义是C、C++编译器未定义,虽然不会报错,但是该句效果和int &a一样。
这两种定义方式是等价的,此时的引用a不能被更新。如:a++ 这是错误的。
二、const应用到函数中
1.作为参数的const修饰符
2.作为函数返回值的const修饰符
其实,不论是参数还是返回值,道理都是一样的,参数传入时候和函数返回的时候,初始化const变量
1 修饰参数的const,如 void fun0(const A* a ); void fun1(const A& a);
调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,
则不能对传递进来的指针的内容 进行改变,保护了原指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行改变,
保护了原对象的属性。
[注意]:参数const通常用于参数为指针或引用的情况;
2 修饰返回值的const,如const A fun2( ); const A* fun3( );
这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
返回值用const修饰可以防止允许这样的操作发生:
Rational a,b;
Radional c;
(a*b) = c;
一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的时候。
类中的成员函数:A fun4()const; 其意义上是不能修改所在类的的任何变量。
三、类中定义常量(const的特殊用法)

在类中实现常量的定义大致有这么几种方式实现:
1.使用枚举类型
class test
{
enum { SIZE1 = 10, SIZE2 = 20}; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
2.使用const
不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。
class test
{
const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员
int array[SIZE]; // 错误,未知的SIZE
};
正确的使用const实现方法为:const数据成员的初始化只能在类构造函数的初始化表中进行。
注意:对const成员变量的初始化,不能在变量声明的地方,必须在类的构造函数的初始化列表中完成,即使是在构造函数内部赋值也是不行的。
具体原因请参见 【初始化列表和赋值的区别】
3.使用static const
通过结合静态变量来实现:

#include<iostream.h>
class Year
{
private:
int y;
public:
static int const Inity;
public:
Year()
{
y=Inity;
}
};
int const Year::Inity=1997;//静态变量的赋值方法,注意必须放在类外定义
void main()
{
cout<<Year.Inity<<endl;//注意调用方式,这里是用类名调用的。
}

到这里就把在类中定义常量的方法都陈列出来了。
四、const定义常量对象,以及常量对象的用法
class test
{
public:
test():x(1)
{
y=2;
}
~test()
{}
void set(int yy)
{
y=yy;
}
int getx() const
{
return x;
}
//protected:
const int x;
int y;
};
void main()
{
const test t;
t.set(33);//error
t.getx();
}
常量对象只能调用常量函数,别的成员函数都不能调用。
五、使用const的一些建议
<1>要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
<2> 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
<3> 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
<4> const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
<5>不要轻易的将函数的返回值类型定为const;
<6>除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

你好,首先你应当明白引用时C++区别于C的一点。但是在Lippleman的<深度探索C++的对象模型>中曾经指出,引用的实现说到底还是采用指针实现的,但是它比指针有自己的优势。然后再Lippleman的<C++primer>中他指出现代C++程序偏向于使用引用,而不是指针,但是并不是说指针不再使用。
C++中的const关键字是指出对象时一个常量,是不允许变动它在内存当中的值的。但是还有很多点是需要注意的。
1.指向const对象的指针 const double *ptr表明ptr指向一个double类型的对象,你可以赋值给ptr一个常量或者不是常量。比如:
double temp = 3.0;const double *ptr = &temp; //此时你不能通过ptr来更改temp的值,也就是说下面的语句是错误的:*ptr = 4.0;但是temp本身并不是const变量,下面的语句就是对的:temp = 4.0; //注意const对象一定要在对象的初始化时赋值.就是说下面的语句是错误的:
double temp = 3.0;const double* ptr; ptr = &temp; //error

2.const指针 ,和一般的const对象一样,说明指针本身是const,是不允许指向其他的对象的;比如下面的语句就是错的:
double temp = 3.0;double* const ptr = &temp; double err = 4.0;ptr = &err; //注意const对象的初始化时一定需要赋值.
但是你可以使用ptr来更改temp的值,就是说下面的语句是对的:*ptr = 10.0;

对于你上面的例子中,首先你应该知道C++的标识符的命名本身就应该包含足够的信息,而不是随便的a,b,等没有用的名字。函数print()就是说该函数是用来打印的,并不会更改对象的内容,所以你将函数的形参设为const,是为了当你在函数的实现中一不小心更改了对象的内容,编译器会及时的报错,从而能避免以后不需要的麻烦。
在标准的C中,函数形参的const说明是会被编译器直接忽略的就是说你写成const,但是你还是可以在函数的实现中更改对象的内容,但是你的const说明符告诉函数的使用者该专递给函数一个const对象,但是编译器并不负责对你的更改操作给出error提示的.在C++中,确实会给出提示的。
所以当你的函数并不会改变对象的内容时,将其定义为const对象回事很好的编程习惯的。

在你觉得变量内容不应该被改变的地方用const修饰 这样编译器会提醒你如果发现有些地方可能会造成改变

如果不希望函数调用的时候改变传入形参的值,就用const修饰,即上述的规范格式,否则形参别用const修饰。
可参考如下链接:http://www.cppblog.com/yishanhante/articles/21322.html?opt=admin

首先是const的用处,它可以用来修饰一个变量或者类的成员函数, 修饰变量时表示变量是不可修改的,修饰类的成员函数时,表示调用这个函数,不会修改类的内部成员


指针和 const 指针的功能区别: const指针表示指针指向的对象是不可修改的, 而普通指针可以,

另外,普通的指针可以当做const指针的来用,如下:

假设现在有两个指针 Tdate *p1,  const Tdata *p2

第一个函数定义为 someFunc(T *) , 那么 someFunc(p1)是可以的,someFunc(p2)是不行的,因为const指针不能转换成非const指针

第二个函数定义为someFunc(const T *) 那么someFunc(p1)和someFunc(p2)都是可以的,p1可以当做const T *来用


someFunc2的解释

假设现有对象 Tdata t;

someFunc2(Tdata re),形参是一个对象,由于c/c++是传值调用,所以每次调用这个someFunc2(t)时,都会构造一个新的Tdata形参re,并把t的内容复制到re中去,这样是一种效率的浪费,解决办法就是改成指针someFunc2(Tdata *re) 或者引用 someFunc2(Tdata &re)


不使用普通引用而是是用const引用的好处在于:

  1. const引用使用要求比较低,  如前面所述, 普通引用和const引用都可以调用这个函数

  2. const明确告诉使用者,该函数不会修改re的内容,也就是t的内容,而使用非const引用会误导使用者以为该函数要修改t的内容



  • c璇█涓璫onst 鏄浠涔堟剰鎬,鎬庝箞鐢,浠涔堟椂鍊欑敤?
    绛旓細浠ヨ繖涓负渚const int i=100;杩欒〃绀篿鐨鍊间笉鑳借鏀瑰彉锛屼篃灏辨槸甯稿彉閲忥紝濡傛灉浣犲湪绋嬪簭涓啀缁檌璧嬪硷紝姣斿i=200;杩欏氨浼氭姤閿欍備篃鍙敤鍦ㄥ嚱鏁颁笂锛屾牸寮忥細int sort(int ,int) const{} 鐢ㄥ锛氳涓嶆兂鏀瑰彉鐨勫彉閲忎笉琚棤鎰忔垨鏈夋剰鐨勬敼鍙樸傘傘
  • c璇█涓璫onst銆乻tatic鍏抽敭瀛楃殑鐢ㄦ硶?
    绛旓細const鏄鎸囧父鏁帮紝杩欑鏁板瓨鏀惧湪rom涓紝涔熷氨鏄‖鐩閲锛屽彧鏈浣跨敤鐨鏃跺欐墠璇诲彇鍒板唴瀛樸俿tatic绫诲瀷鐨勬槸灞閮ㄩ潤鎬佹暟鎹紝棣栧厛浠栬偗瀹氭槸灞閮ㄥ彉閲忥紝浣嗘槸浠栫殑鐢熷瓨鏈熸槸鍏ㄥ眬鐨勩俢onst鏁颁笉鑳借淇敼锛屼篃涓嶈兘鏄眬閮ㄥ彉閲忋俿tatic涓鑸敤浜庡眬閮ㄥ彉閲忥紝浣嗘槸浠栧彲浠ヨ淇敼锛屽苟涓旈鍑哄紩鐢ㄤ粬鐨勫嚱鏁颁綋鍚庡彉閲忎緷鏃у瓨鍦紝鐩村埌涓嬩竴娆″紩鐢ㄦ椂...
  • c++瀹氫箟涓涓父閲忕殑鍏抽敭瀛
    绛旓細鍊煎緱娉ㄦ剰鐨勬槸锛屽畾涔夊彉閲忕殑鍚屾椂锛屽繀椤诲垵濮嬪寲銆傚畾涔夊舰寮忎篃鍙互鍐欐垚int const i=5锛屽悓鏍锋纭傛澶栵紝const淇グ鍙橀噺杩樿捣鍒颁簡鑺傜害绌洪棿鐨勭洰鐨勶紝閫氬父缂栬瘧鍣ㄥ苟涓嶇粰鏅歝onst鍙鍙橀噺鍒嗛厤绌洪棿锛岃屾槸灏嗗畠浠繚瀛樺埌绗﹀彿琛ㄤ腑锛屾棤闇璇诲啓鍐呭瓨鎿嶄綔锛岀▼搴忔墽琛屾晥鐜囦篃浼氭彁楂樸2銆 淇グ鏁扮粍 C璇█涓璫onst杩樺彲浠ヤ慨楗版暟缁勶紝涓句緥...
  • C璇█涓殑const鏄绁為瓟鎰忔?
    绛旓細CONST C涓瑿ONST鐨勪娇鐢锛const鏄涓涓狢璇█鐨勫叧閿瓧锛屽畠闄愬畾涓涓彉閲忎笉鍏佽琚敼鍙樸浣跨敤const鍦ㄤ竴瀹氱▼搴︿笂鍙互鎻愰珮绋嬪簭鐨勫仴澹э紝鍙﹀锛屽湪瑙傜湅鍒汉浠g爜鐨勬椂鍊欙紝娓呮櫚鐞嗚Вconst鎵璧风殑浣滅敤锛屽鐞嗚В瀵规柟鐨勭▼搴忎篃鏈変竴浜涘府鍔┿傝櫧鐒惰繖鍚捣鏉ュ緢绠鍗曪紝浣嗗疄闄呬笂锛宑onst鐨勪娇鐢ㄤ篃鏄痗璇█涓竴涓瘮杈冨井濡欑殑鍦版柟锛屽井濡欏湪浣...
  • 缂栫▼璇█涓璫onst鏄浠涔堟剰鎬,鐢ㄦ潵骞蹭粈涔堢殑,鎬庝箞鐢(璇硶),閫傜敤浜庡摢鍑...
    绛旓細鐩墠const鐢寰楁渶澶鐨鏄痗/c++璇█ 浠栫殑浣滅敤锛1.鍙互瀹氫箟const甯搁噺 2.const鍙互淇グ鍑芥暟鐨勫弬鏁帮紝杩斿洖鍊硷紝鐢氳嚦鍑芥暟鐨勫畾涔変綋銆傝const淇グ鐨勪笢瑗块兘鍙楀埌寮哄埗淇濇姢锛屽彲浠ラ闃叉剰澶栫殑鍙樺姩锛屼粠闈㈡彁楂樼▼搴忕殑鍋ュ.鎬с傛瘮濡傦細c璇█鏍囧噯搴撳嚱鏁皊trcpy 浠栫殑鍘熷瀷锛氬師鍨嬪0鏄庯細extern char *strcpy(char dest[],const char *...
  • c璇█涓殑const鐨鍖哄埆?
    绛旓細涓銆佸尯鍒涓嬶細1銆乮nt瀹氫箟鐨勯噺鏄彉閲忥紝瀹冪殑鍊煎彲浠ユ洿鏀癸紱鑰宑onst int 瀹氫箟鐨勬槸涓涓父閲忥紝瀹冪殑鍊间笉鍙互鏇存敼銆2銆乮nt鍦ㄥ畾涔夌殑鏃跺欙紝涓嶉渶瑕佸垵濮嬪寲锛岃宑onst int 鍦ㄥ畾涔夌殑鏃跺欏繀椤诲垵濮嬪寲锛涗簩銆const鐨浣滅敤锛氭妸瀵硅薄杞崲鎴愪竴涓父閲
  • c璇█閲宑onst int 鍜宨nt 鏈変粈涔堝尯鍒,const鐨勪綔鐢ㄦ槸浠涔堛
    绛旓細鍦ㄥ彇鎸囬拡鏂归潰锛const鏈夌暐澶嶆潅鐨涓滆タ锛屼絾鏄父瑙勭殑銆佸悎鐞嗙殑鎿嶄綔涓嶅簲璇ユ秹鍙婂埌锛屽洜涓篶onst int鏄敤鏉ヤ繚瀛樹竴浜涘叏灞甯搁噺鐨勶紝杩欎簺甯搁噺鍦ㄧ紪璇戞湡鍙互鏀癸紝鍦ㄨ繍琛屾湡涓嶈兘鏀广傚惉璧锋潵杩欏儚瀹忥紝鍏跺疄杩欑‘瀹炲氨鏄敤鏉ュ彇浠e畯鐨勶細 #define PI 3.14 const float Pi = 3.14; 濡傛灉浣犵殑浠g爜閲岀敤鍒颁簡100娆I锛堝畯锛夛紝浣犵殑...
  • c璇█涓璫onst 鏄浠涔堟剰鎬?
    绛旓細甯哥被鍨嬫槸鎸浣跨敤绫诲瀷淇グ绗const璇存槑鐨绫诲瀷锛屽父绫诲瀷鐨勫彉閲忔垨瀵硅薄鐨勫兼槸涓嶈兘琚洿鏂扮殑銆俢onst 鎺ㄥ嚭鐨勫垵濮嬬洰鐨勶紝姝f槸涓轰簡鍙栦唬棰勭紪璇戞寚浠わ紝娑堥櫎瀹冪殑缂虹偣锛屽悓鏃剁户鎵垮畠鐨勪紭鐐广備綔鐢:锛1锛夊彲浠ュ畾涔塩onst甯搁噺锛屽叿鏈変笉鍙彉鎬с備緥濡傦細const int Max=100; Max++浼氫骇鐢熼敊璇;锛2锛変究浜庤繘琛岀被鍨嬫鏌ワ紝浣跨紪璇戝櫒瀵瑰鐞...
  • C璇█涓璫onst鏈変粈涔堢敤閫
    绛旓細class A { ...void f(int i) {...} //涓涓嚱鏁 void f(int i) const {...} //涓婁竴涓嚱鏁鐨閲嶈浇 ...};锛6锛 鍙互鑺傜渷绌洪棿锛岄伩鍏嶄笉蹇呰鐨勫唴瀛樺垎閰嶃 渚嬪锛歞efine PI 3.14159 //甯搁噺瀹 const doulbe Pi=3.14159; //姝ゆ椂骞舵湭灏哖i鏀惧叆ROM涓 ...double i=Pi; //姝ゆ椂涓篜i鍒嗛厤...
  • C璇█涓 const鍙互鐩存帴淇グ鏁版嵁绫诲瀷鍚?
    绛旓細(5)淇グ甯稿紩鐢 浣跨敤const淇グ绗︿篃鍙互璇存槑寮曠敤,琚鏄鐨寮曠敤涓哄父寮曠敤,璇ュ紩鐢ㄦ墍寮曠敤鐨勫璞′笉鑳借鏇存柊銆傚叾瀹氫箟鏍煎紡濡備笅: const double & v; (6)淇グ鍑芥暟鐨勫父鍙傛暟 const淇グ绗︿篃鍙互淇グ鍑芥暟鐨勪紶閫掑弬鏁,鏍煎紡濡備笅: void Fun(const int Var); 鍛婅瘔缂栬瘧鍣╒ar鍦ㄥ嚱鏁颁綋涓殑鏃犳硶鏀瑰彉,浠庤岄槻姝簡浣跨敤鑰呯殑涓浜涙棤鎰忕殑鎴...
  • 扩展阅读:c++教程 ... c++中cin的用法 ... c++中<< ... c++中const用法 ... c++编程 ... const在c++中的意思 ... c++中cout的用法 ... c++中const啥意思 ... c++函数const ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网