const知识点总结

本文详细介绍了C++中const的用法,包括const与#define的区别、const修饰变量和指针的作用、const修饰函数返回值的场景,以及const修饰成员变量和成员函数的意义,强调了const在类型检查和保护不变性方面的重要性。

一.const修饰常量和defin定义常量的区别

用define定义常量,是没有类型检查的,只是define所定义的宏变量在预处理的时候进行替换,在需要使用的地方进行拷贝一份。const修饰变量有类型检查,需要一定的内存空间,存放在静态区。在程序运行过程中const定义的变量只有一份拷贝,而define宏常量却有多份拷贝,故而运行时宏定义消耗的内存要比const消耗的内存多。

总结如下:
define:
在预处理阶段进行替换
无类型,不进行类型安全检查,可能产生错误
不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大

const:
在编译时确定其值
编译时会进行类型检查
在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝

二、const修饰变量和指针

1、修饰普通变量,防止变脸被修改
const int a = 100;
2、修饰函数参数, 保护传参时参数不被修改
char *my_strcpy(char dst, const char *src);

以下这个函数会报错

void  print(const int &a)
{
   a = 100; 
   printf("%d\n", a);
}

下面这个函数不会报错

void print2(int &b)
{
   a = 100; 
   printf("%d\n", a);
}

如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护。

3、const修饰指针

a.修饰的的对象的值可变,指向的地址不可变

const int* val/int const* val;

b.修饰的的对象的值不可变,指向的地址可变

int* const val;

c.两者都不可变

const int* const val

三、const 修饰函数的返回值

1、指针传递

指针传递方式的函数返回值加const 修饰,那么函数返回值(指针)不能被修改。

const char * GetStr(void);
const char *str = GetStr(); //正确写法
2、值传递

函数返回值是“值传递”方式,函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
下面写法错误

int GetInt(void)
const int GetInt(void)//错误
3、引用传递

函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数

四、const修饰成员变量

和修饰普通变量一样

char *p = NULL;
int * a1 = &p;  
const int * a2 = &p;   
int * const a3 = &p;   
int const * const a4 = &p;  
const int * const a5 = &p;  

五、const修饰成员方法

class A
{
public:
    A(){}
    ~A(){} 
    void print();
    int GetNumber(void) const; 
private:
    int m_num;
    char *m_data;
};

int A::GetNumber(void) const  
{  
    ++ m_num; // 编译错误,企图修改数据成员m_num  
    print(); // 编译错误,企图调用非const 函数  
    return m_num;  
}  

总结,当const修饰成员函数时,不能去修改非const修饰的成员变量,不能调用非const修饰的成员方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

The_Web3_社区

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

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

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

打赏作者

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

抵扣说明:

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

余额充值