c++中的const

const防止修饰对象被改变,可以修饰变量,参数,返回值,甚至函数体。const可以提高程序的健壮性

const修饰参数

const只能修饰输入参数

1、如果输入参数是指针型的,用const修饰可以防止指针被意外修改。

2、如果参数采用值传递的方式,无需const,因为函数自动产生临时变量复制该参数。

3、非内部数据类型的参数,需要临时对象复制参数,而临时对象的构造,析构,复制较为费时,因此建议采用前加const的引用方式传递非内部数据类型。而内部数据类型无需引用传递。


const修饰函数返回值

1、函数返回const指针,表示该指针不能被改动,只能把该指针赋给const修饰的同类型指针变量。

2、函数返回值为值传递,函数会把返回值赋给外部临时变量,用const无意义!不管是内部还是非内部数据类型。

3、函数采用引用方式返回的场合不多,只出现在类的赋值函数中,目的是为了实现链式表达。


函数名称+const

在类中,任何不修改数据成员的函数都应该声明为const类型,如果const成员函数修改了数据成员或者调用了其他函数修改数据成员,编译器都将报错!


const 修饰变量,表示该变量不能被修改。

1、const char *p 表示 指向的内容不能改变

2、char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变,必须被初始化

3、这种const指针是前两种的结合,使得指向的内容和地址都不能发生变化.

const double pi = 3.14159;

const double *const pi_ptr = π

4、const修饰类的变量,表示成员常量,不能被修改,同时它只能在初始化列表中赋值,不能在类声明中初始化const数据成员

 class A
    {
        const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员
        int array[SIZE];       // 错误,未知的SIZE
    };
    
    //const数据成员的初始化只能在类构造函数的初始化表中进行,例如
    class A
    {
        A(int size);       // 构造函数
        const int SIZE ;  
    };
    A::A(int size) : SIZE(size) // 构造函数的初始化表
    {
     
    }
    A  a(100);  // 对象 a 的SIZE值为100

5、const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样,该对象的任何非const成员函数都不能被调用

#include<iostream>

using namespace std;

class testconst{
private:
    int m;
public:
    testconst(int a){
        m=a;
    }
    void setvalue(int newvalue);
    void showvalue();
    void showvalue() const;// const 关键字可用于重载 
};

void testconst::setvalue(int newvalue){
    m=newvalue;
}

void testconst::showvalue(){
    cout<<" m is "<<m<<endl;
}

void testconst::showvalue() const{
    cout<<"const m is "<<m<<endl;
}

int main(){
    testconst t1(10);
    const testconst t2(100);
    t1.showvalue();
    t2.showvalue(); //常量对象调用的是常量方法 
    system("pause");
    return 0;
}

输出:

 m is 10

const m is 100


编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高

  1. 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;

  2. 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;

  3. 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;

  4. const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;

  5. 不要轻易的将函数的返回值类型定为const;

  6. 除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

  7. 任何不会修改数据成员的函数都应该声明为const 类型。


参考:http://blog.youkuaiyun.com/Eric_Jo/article/details/4138548


转载于:https://my.oschina.net/hnuweiwei/blog/233016

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值