本文参考《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