个人的一些笔记,希望可以帮助你
const 的使用
const经常用来修饰一个值不能改变的量,安全,并且能消除存储操作
const的几种用法:
(1) 说明值常量
(2) 说明指针
(3) 说明函数参数及其返回值
(4) 说明类的常量和成员函数
const 说明值常量
值常量的说明一般放在头文件或者文件的开始部分,也可以放在类中进行说明
(1) 说明符号常量,表明符号代表的是一个常量,语法:
<类型>const<常量名>=<表达式>,<常量名>=<表达式>……
例如:double const PI=3.14; const double PI=3.14;
(2) 说明数组常量,语法格式:
<类型>const<数组名>[大小]={初值表};
const类型> <数组名>[大小]={初值表};
(3) 说明对象常量,语法格式:
<类名>const<对象名>;
const <类名> <对象名>;
(4) 说明引用常量
(5) const与C语言中的#define的差别
无参宏不是符号常量,没有数据类型,没有值,在内存中不分配地址。它在预处理时做宏替换,不可能做类型检查。
const定义的常量是符号常量,有数据类型,也有值,且其值不可改变,在内存中有地址,编译时做类型检查。
Const和指针
Const和指针的三种经典组合
(1) 指向常量的指针——const int *p;
(2) 常指针——char *const pc=’a’;
(3) 指向常量的常指针——const char *const pc=’a’
指向常量的指针(指针指向一个不可变量)
指针在指向有一个常量后,不能通过指针修改这个常量,但是可以指向一个新的常量,例如:
Const char *pc=”ABCD”;
Pc[3]=’a’;不合法,企图修改原来指向的常量
Pc=“WERT”;合法指向另外一个常量
常指针
要把指针变量中的值(也就是地址)声明为常量,采用以下语法:
<类那些>*const<指针名>[=<初值>;]
这样定义的指针变量中存放的指针是个常量,称为常指针。定义后,该指针指向固定的内存单元,不能再指向其他内存单元,通过它可以修改所指单元里存放的内容。例如:
Char *const pc=”ABCD”;
Pc[3]=’a’;合法,指针指向的对象可以修改
Pc=”QWER”;不可以,指针的指向不可以修改
指向常量的常指针
指针变量中存放的指针本身和指针所指向的对象都是不可以改变的。
例如:
Const char *const pc=”ASDF”;
Pc[3]=’a’;不合法,不能改变指针所指对象的值
Pc=”QWER”;不合法,不能改变指针的指向
Const说明函数参数和返回值
用const限定函数参数和返回值,是const最重要的用法。用const修饰函数参数意味着传过来的实参在函数中是不能被修改的。一般情况下不需要,但是在用指针和引用传值的场合,为避免实参被修改,就用const修饰,更安全。
修饰函数的返回值,意味着该返回值不能被修改。如果传值并返回地址,const将保证该地址上的内容不会被改变。这就意味着该函数不能作为左值使用,在这种情况下,const通常也是与引用和指针一起使用的。
类中的const
1. 常成员的函数
2. 常数据成员
3. 常对象
我来说一下,具体原因应该是这个,常变量在定义的时候必须初始化,所以当你在a.cpp中定义extern const double pi=3.14; b.pp中extern const double pi;可以通过编译运行。因为当编译系统发现a.cpp中的全局常变量时,就知道它pi是常量,而换过来的时候,在a.cpp中定义const double pi=3.14; b.pp中extern const double pi;编译系统在编译a.cpp是没有问题的,但到了b.cpp中就会发现,有一个外部常量是没有初始化的,而常量是不能在声明后再进行定义的,所以编译系统会认为找不到它的定义,所以就出错。
对于extern "C"主要是因为c和c++编译器不同,它们对相同的函数名编译后生成的相同的标示不同,故而在引用c的库文件时必须使用extern “C”告诉编译器,它是c的函数,按c的规则编译。通常我们使用的标准头文件已被处理过。 貌似没有用于常量的声明。
CONST:一个C语言的关键字
返回const,则调用时也必须声明为const,防止返回的指针内容被修改。
const是引用的关键词,其实应用和指针的作用是差不多的,但是它比指针运行简单些,可以用在简单的变量运算,比如int&x,&y;int t=x,x=y,y=t;用引用比指针简单