1. C中的const
C中的常量总是占用存储,而且他的名字是全局符。C编译器不能把const看作编译期间的常量。
eg:
const int buffersize = 100;
char buffer[buffersize];
上述代码是错误的。
2. C++中的const
C++中的const默认为内部连接的。当定义一个const时,必须给他赋值,除非使用extern。
const int buffersize; //wrong
通常C++不为const创建存储空间,但是也有很多特殊情况。
2.1 常量与指针
A) 常量
eg:
const int i = 1; //推荐使用这个表示方式
int const i = 1; //两种表示方式表示同一个意思
B)指针
常量 [const 指针-- Think in C++中这么称呼]
(指针本身为const,即指针指向的内存位置为const,但是内存内容不是const)
eg:
int a, b;
int * const p = &a;
// p = &b; error!!!
C ) 常量指针 [指向const的指针
-- Think in C++中这么称呼
](指针指向的内存地址可变,但是指针指向的内容为const)
eg:
const int * p; //此处不需要初始化,因为p是一个变量,只是其指向的内存内容不能变化,即内存内容为const)
const int a = 1;
p = &a;
D ) 指向const内容的const指针(指针指向的内存地址为const,指针指向的内存内容也不能变)
eg:
const int a = 10, b = 20;
const int * const p = &a; // a的内容不可变。
//p = &b; error!!! p指向的内存地址也不可变。
2.2 常量与函数
A) 传递const值
void f1( const i){
i++; // ERROR !!!
}
此处相当于做了约定,变量初始值不会被函数f1()改变。由于参数是按值传递的,所以此处的约定对于函数调用者来说是隐式的。
B) 返回const值
const int g( );
这种使用方式对于C++内部定义类型而言没有任何意义,具体参见下面的例子。
int f3( ) { return 1; }
const int f4( ) {return 1;}
void main( )
{
{
const int j = f3( ); // it works!
int k = f4( ); // it works too!
}
但是对已自定义的用户类型而言,按值返回常量是很重要的。如果一个函数按值返回一个类对象为const时,这个函数的返回值不能使一个左值(即它他不能被赋值,也不能被修改)!
C ) 传递const指针
eg:
void f5( const int *p){
*p = 2; // Error!!! 试图修改p指针指向的内容
int a = *p;
}
2.3 const对象与成员函数
class X{
int a;
public:
X( int i ) ;
int f( )
const;
int g( );
}
X::X ( int i ) : a( i ) { }
X::f ( )
const { return a; }
X::g( ) { a++; return a; }
int main( ) {
X x1( 10 );
const X x2 ( 20 );
x1.f( );
x2.f( );
x1.g( );
//x2.g( ); //Error!!!
}
如果申明一个成员函数为const函数,代表该成员函数可以被const对象调用。
如果不做申明,则不能被const对象调用。
同时仅申明函数为const是不够的,还需要在定义中再次显式说明此成员函数为const。