const 用法

一,修饰变量(定义常量)
const int n=5;
int const n=5;//与前面一种写法等价
  • 修饰的局部变量在初始化之后,变量的值不能被改变。
  • 声明同时给变量赋值。

#define和const有什么区别

  • const 定义的常数是变量是带类型的, #define 定义的只是个常数是不带类型的;
#define MAX 255 // 不带类型,在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换。

const float MAX = 255; // 带类型,存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝。
  • define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用;
  • define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误;
// define只是简单的字符串替换,在预处理的时候进行替换
#define N 2+3 
double a = N/2;  //预想的a的值是2.5,实际上a的值是3.5
  • define定义的常量是不可以用指针变量去指向的,用const定义的常量是可以用指针去指向该常量的地址的(C中的const类型可以用指针修改,并不是真正的const,但在c++由于有类型检查, 试图const int* 型赋给 int * 型编译器会报错);
  • define 不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大。 const 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝。
#define M 3   //宏常量

const int N=5;  // 此时并未将N放入内存中

int i=N;  //此时为N分配内存,以后不再分配!

int I=M;  //预编译期间进行宏替换,分配内存

int j=N;  //没有内存分配

int J=M;  //再进行宏替换,又一次分配内存!

二,常量指针与指针常量

(1)常量指针

·const int * n;
int const * n;//与前面一种写法等价
  1. 常量指针指向的变量不能通过常量指针改变,但是可以通过其他引用改变变量的值。指针本身是变量。常量指针指向变量的值不能改变,但是常量指针本身可以改变,指向其他变量地址。
int a = 1, b = 5;
const int* n = &a;
a = 2;//正确
*n = 3;//错误
n = &b; // 正确

(2)指针常量,是指指针本身是个常量,不能再指向其他变量地址。
指针常量指向的地址不能改变,但是地址中保存的数值是可以改变。

int *const n;
int a = 1; 
int* const n = &a; 
*n = 8;
int b = 2;
n = &b;//错误
const char* const pContent; // 指针不可变,指针指向的值不可变
二、const修饰函数的参数
void func(const char x) {
    //x不可以在内部进行赋值等操作.
    //无意义,因为x就为形参,不会影响实参
}
void func(const char* x); // 参数指针所指内容为常量不可变

void func(char* const x); // 参数指针本身为常量不可变
void func(const char& x); // 参数为引用,为了增加效率同时防止修改
三、用const修饰函数的返回值
  1. “值传递”加const修饰没有任何价值。

  2. ”址传递”加const修饰,函数返回值只能被赋给加const修饰的同类型指针,或者利用const_case转化为去const的常量。

    例如,如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

const char * GetString(void);

char *str = GetString(); // 错误
const char *str = GetString();
  1. “引用返回”,引用即为const指针,函数返回引用并加const限定后,函数返回的是地址与地址所存的值都被const修饰的指针,存于临时的外部存储单元中,

    const int& func();  //函数声明
    int b = func();                                    //正确,从外部存储单元中赋值给变量
    int& c = func();                                  //错误,试图在同一个地址中即存储变量又存储常量
    int& d = const_cast<int&>(func());    //正确,去const
    const int& e = func();                        //正确
    
四、const 成员函数

任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误。

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

参考:

[1]https://blog.csdn.net/SoYangA/article/details/80292025

[2]https://www.cnblogs.com/zhxmdefj/p/11524403.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值