C++关键字之const

const是一个C++语言的限定符,使用const在一定程度上可以提高程序的安全性和可靠性。

 

下面是const的11种常见用法:

 

1. 修饰常量

用const修饰的变量是不可变的。

const int x = 1;          //等价于int const x = 1;

 

2. 修饰指针

const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

 

int a = 1;

const int* p = &a;            // p指向的内容不能变

int const* p = &a;            // p指向的内容不能变

int* const p = &a;            // 指针本身p的值不能变,不能改变p的指向

const int* const p =&a;       // 指针p为常量,且p指向一个常量

int const* const p =&a;       // 同上

 

 

3. 修饰引用

int a = 1;

const int& b = a;

int const& b = a;

 

4. 修饰函数参数

被const修饰的函数参数,在函数内不可以改变其值。

void Func (const int a)

{

     a = 0; //编译报错

}

 

5. 修饰函数返回值

用const修饰函数返回值的含义和用const修饰普通变量以及指针的含义基本相同。

const int* func()   // 返回的指针所指向的内容不能修改

{

    // return p;

}

 

6. 修饰类成员变量

用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。

 

class A

{

public:

    A(int x) : a(x)

    {

    }

private:

    const int a;

};

 

7. 修饰类成员函数

用const修饰的类成员函数,在该函数体内不能改变该类对象的任何成员变量, 也不能调用类中任何非const成员函数。

class A

{

public:

    int& getValue() const

    {

        // a = 10; // 错误

        return a;

    }

 

private:

    int a;// 非const成员变量

};

 

8. 修饰类对象

用const修饰的类对象,该对象内的任何成员变量都不能被修改。

因此不能调用该对象的任何非const成员函数,因为对非const成员函数的调用可能会修改成员变量的值。

class A

{

 public:

    void funcA() {}

    void funcB() const {}

};

 

int main

{

    const A a;

    a.funcB();// 可以

    a.funcA(); // 错误

}

 

9. 在类内重载成员函数

class A

{

public:

    void func() {}

    void func() const {}   // 重载

};

 

10. const与宏定义的区别

const常量有数据类型,而宏常量没有数据类型。编译器对前者进行类型安全检查,对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

const常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。


11. const_cast

对于这种标准转换运算符的用法可以参考下这篇文章:

http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值