本文参考《C++编程思想》第八章内容,看过这本书的,请无视以下内容。
在C++中,const一共有四个作用,分别用于值替代、指针、函数参数和返回以及类。
一 值替代
1.const最初的动机就是值替代,也就是说,以前在C语言里,值替代的典型用法是这样的:
#define BUFSIZE 100
现在可以用:
const int bufsize = 100;
这样替换的好处是可以进行类型检查,避免出现一些问题。
2.这样定义的const的值在编译期间就能确定,因此可以用于定义数组,比如:
char buf[bufsize];
3.const变量定义时必须初始化。应该这样:
const int a =100;
如果只是声明:
const int a;
会报错的,不信你试试?
4.原因是C++中const变量默认的是内部连接,也就是在变量所在文件内有效,相当于static的效果,因此在不同的文件中定义同名的const变量是没有任何问题的。但是如果多个文件要共用同一个const变量应该怎么办呢?在某一处定义并初始化,像这样:
extern cons tintx = 1;
并在其他文件里声明:
extern constint x;
所以,const变量在定义时就得初始化的原因就是:把定义和声明区别开。
二 指针
1.指向const的指针
const int * u; int const * u;
这两者的意思都是:u是一个int型指针,指向一个constint。也就是指向常量的指针。
2.const指针
int d = 1; int * const w =&d;
w为一个int型指针,指向一个int值,w指针本身不变。
Ps:为什么有两条语句,参照上文,const变量定义时需要初始化。
3.结合第一点和第二点,可以定义一个指针不变并且指针指向的值也不变的const量,怎么写呢,你猜?
4.可以将一个非const变量的地址赋给const指针,但不能将一个const值的地址赋给一个非const指针。
int d = 1; const int a = 1; const int * b =&d; //right int * c =&a; //wrong
三 函数参数和返回类型
1.const变量按值传递,则该值不能改变。
void f1(constint i) { i++; //wrong }
2.const量作为返回值时,没什么意义。因为起不到想要的效果,你可以试一下。
3.const指针作为函数参数的情况。这种情况比较复杂,只需要记住,对于用户自定义的数据类型,当用该类型的引用作为函数参数的时候,一定要加const。
四 类
1.const类型的成员变量及其初始化
class Integer { int i; public: Integer(int ii = 0) ; void print(); }; Integer::Integer(int ii = 0) : i(ii) {} void Integer::print() { cout << i << ' '; }
2.编译期间类里的常量。必须在定义的时候初始化。
class StringStack { static const int size = 100; const string* stack[size]; int index; public: StringStack(); void push(const string* s); const string* pop(); }; StringStack::StringStack() : index(0) { memset(stack,0,size * sizeof(string *)); } void StringStack::push(const string* s) { if(index < size) stack[index++] = s; } const string* StringStack::pop() { if(index > 0) { const string* rv = stack[--index]; stack[index] = 0; return rv; } return 0; }
3.const对象的概念是对象的数据成员在其生命周期内不被改变。因此,它只能调用const成员函数,不能调用非const成员函数,因为那有可能改变数据成员。
class Quoter { int lastquote; public: Quoter(); int lastQuote() const; }; Quoter::Quoter() { lastquote = -1; srand(time(0)); } int Quoter::lastQuote() const { return lastquote; }
原文地址:http://blog.csdn.net/bing_bing304/article/details/41379337