C++中的const用法

来源:互联网 发布:法律是道德的底线知乎 编辑:程序博客网 时间:2024/05/20 16:43

本文参考《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;   //rightint * 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;}

0 0
原创粉丝点击