C++_const关键字

Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。

一、作用

1.可以保护被修饰的东西,增强程序的健壮性。

2.便于进行类型检查。const常量有数据类型,而宏常量没有数据类型。

3.为函数重载提供了一个参考。

4.可以节省空间,避免不必要的内存分配。const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

#define PI 3.14159         //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中
              ......
double i=Pi;   //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!

5.提高了效率。编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作。宏定义需要在编译期间读入内存。

二、const关键字使用场景

1.定义常量。

const修饰的类型为TYPE的变量value是不可变的。

 //效果一样
 TYPE const ValueName = value; 
 const TYPE ValueName = value;

2.指针使用const

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

(1)指针本身是常量不可变
     (char*) const pContent; 
     const (char*) pContent; 
(2)指针所指向的内容是常量不可变
     const (char) *pContent; 
     (char) const *pContent; 
(3)两者都不可变
     const char* const pContent; 

3.函数相关const

(1)const修饰函数参数

1、修饰指针,可以防止指针被修改
void test(const ClassA* a)
{
    ClassA** b = &a; //编译错误,不能对const指针取地址
    ClassA* c = a; //编译错误,不能将const指针转普通指针
    (*b) = new ClassA();
}
2、修饰普通类型,说明这个参数不应该被修改
void test(const int a)
{
        a++; //编译错误
        int* c= &a; //编译错误,不能取地址,否则就具备了改a的能力
        int b = a;  //不用强转也可以编译通过,但还是没能力改a的值        
}
3、修饰引用类型,参数的值不能被修改, 也就失去了引用类型的效果,但传递对象时,可以起到不copy对象的目的。
void test(const int& a)
{
    a = 2; //编译错误,不能修改const引用类型的值
}

(2)const修饰函数

class ClassA
{
public:
    int b;
    int test() const
    {
        b = 3; //编译错误,const修饰的函数不能修改类成员变量的值
        return b;
    }
}

(3)const 修饰函数返回值

使用不多,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。

4.类相关const

(1)const修饰成员变量
    const修饰类的成员变量,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。

class A
    { 
        …
        const int nValue;         //成员常量不能被修改
        …
        A(int x): nValue(x) { } ; //只能在初始化列表中赋值
     } 

(2)const修饰成员函数
    const修饰类的成员函数,则该成员函数不能修改类中任何成员变量和调用非const成员函数。一般写在函数的最后来修饰。

    const成员函数能够访问对象的const成员,而其他成员函数不可以。

class A
{ 
        …
      void function()const; //常成员函数, 它不改变对象的成员变量.                        

//也不能调用类中任何非const成员函数。
}

(3)const修饰类对象

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

const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。

三、将Const类型转化为非Const类型的方法

去常转换:const_cast <type_id>  (expression) 

四、总结

 new返回的指针必须是const类型的。

参考:https://blog.csdn.net/wfei101/article/details/80861553

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值