const 关键字的总结

1、const 修饰的变量不管是指针还是非指针,均需要在声明时初始化(类的const成员变量必须在构造函数初始化列表中初始化),并且不可第二次赋值

2、const  TYPE  t_test <==>TYPE  const  t_test        均表示t_test为常量。

3、const  TYPE  * t_ptr<==>TYPE  const  *t_ptr        均表示t_ptr指针指向的内容不可变 。

4、TYPE*  const  t_ptr       表示 t_ptr指针本身不可变。

5、const TYPE  *const  t_ptr<==>TYPE  const  *const  t_ptr      均表示t_ptr指针本身和指向的内容都不可变。

      如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

      如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。[1]

6、const 修饰类的成员函数时,表示在函数体内不能修改成员变量的值,也不可调用会修改成员变量的其他成员函数,没有修改成员变量的值是可以调用的。const对象/对象指针/对象引用只可调用const函数,不可调用非const函数,哪怕这个函数没有修改成员变量。

      类的const变量必须在构造函数初始化列表中初始化,有且只有static const变量才可以在类中(声明时)初始化,仅仅是static不行。const和static关键字的顺序无关紧要。

7、当const修饰引用时,可以用类似的规则去记忆,但是会有不同。比如,引用只存在其"指向”的内容的变化,而不存在其本身可不可变的问题,指针的话,存在地址+1单位。关于引用的很好的一篇很好的分析博文[2]。

你会发现如下的Visual Studio 2010测试代码很奇怪,请仔细分析。

#include <iostream>
using namespace std ;

int main( int argc , char **argv )
{
	int i = 10 ;
	const int& iRC = i ;
	cout << i << " " << iRC << endl ;  // 10 10 
	i++ ;
	cout << i << " " << iRC << endl ;   // 11 11,this is a knowledge point I may ignore.
	//iRC++ ;  // error,but i++ can cause iRC++

	int j = 11 ;
	int& const jRC = j ;
	cout << j << " " << iRC << endl ;  // 11 11
	j++ ;
	cout << j << " " << iRC << endl ;  // 12 11
	jRC++ ;  // right
	cout << j << " " << iRC << endl ;  // 13 11


	const char sz_char[] = { 'a' , 'b' } ;
	//sz_char[0] = 'c' ;  // error,the content that sz_char points to cann't be changed
	//char *c_ptr = sz_char ;  //error,sz_char is const char pointer

	return 1;
}

运行结果:

下面这张图片大家可以无视,是本人下次编辑时的提示稿,和下面的链接引用,如果要深究const的种种使用情况,非一朝一夕能成也。



今天已经看了很多关于const的帖子了,这些需要休息下再看:常看常新,这么重要的知识点,不可能一次就全吃透,更需要平时多用。

http://stackoverflow.com/questions/5598703/c-const-usage-explanation

http://www.parashift.com/c++-faq-lite/const-correctness.html

http://www.parashift.com/c++-faq-lite/constptrptr-conversion.html

http://www.cprogramming.com/tutorial/const_correctness.html

http://blog.csdn.net/Eric_Jo/article/details/4138548



       神帖:StackOverFlow关于const的讨论

扩展博文:C语言各种奇葩声明的记忆规则

                    [2]An Insight to Reference in C++

相关博文:[1]http://blog.csdn.net/Eric_Jo/article/details/4138548

                     http://bbs.csdn.net/topics/310007610


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值