C++ | const 用法整理

https://www.cnblogs.com/jiabei521/p/3335676.html

笔记:
1.  const修饰符可以把对象转变成常数对象,意思就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用!任何修改该变量的尝试都会导致编译错误。因为常量在定以后就不能被修改,所以定义时必须初始化。

2. 引用类型也得定义时就初始化。 

int a = 9;
int &b = a; //必须在定义的时候就初始化。
cout<<  b <<endl; //输出 9 
cout<< &b <<endl; //输出 a 的地址
cout<< &a <<endl; //输出 a 的地址

3. const、引用

int a = 9;
const int &b = a; //合法。
//-----------
const int a = 9;
const int &b = a; //合法。
//-----------
const int a = 9;
int &b = a; //非法。可以简单理解为类型不符。
int a = 9;
const int &b = 10;
//int &c = 11; // 非法。
cout<<  b <<endl; //输出 10
cout<< &b <<endl; //输出 0x66ff20。有一块内存地址存储了初始化时候的数字10. 0x66ff20首地址存储了一个int,但没有变量名。
cout<< &a <<endl; //输出 0x66ff24
const int &d = b;
cout<< &d <<endl; //输出 0x66ff20
cout<<  d <<endl; //输出 10

4. const 和 指针

const double 可以指向double和const double型,但不能通过这个指针改变double型数据的值(用double型指针指向它就可以改。)。const double型指针可以在程序中被赋值为其他的const double型地址。

const double * cptr;
const double a[10]={
	1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
cptr = a;
cout<<*cptr<<endl; // 输出 1
cptr = &(a[1]);
cout<<*cptr<<endl; // 输出 2
double b = 0;
cptr = &b;
cout<<*cptr<<endl; // 输出 0

 5. const 和 函数

a. 类中的const成员函数
任何不会修改数据成员的函数都应该声明为const类型
如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性;
只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。
例。 int Stack::getCount() const {return num;}
另 const对象默认调用重载中(若有)的常函数

b. const修饰函数参数 

总的来说,传递过来的参数在函数范围内不可改变。int GetNum(const int num);
参数指针所指内容为常量不可变 void function(const char * c);
参数指针本身为常量不可变 void function(char* const c);
参数为引用,为了增加效率同时防止修改 void function(const T& Var);【这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性, 且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙】

6. const 和 static
const 在超出作用于后释放内存,static不会。

7. 一个难点

int b = 99;
const int *a = &b; // 1
int const *a = &b; // 2
int* const a = &b; // 3
const int* const a = &b; // 4

解释:
(1)有一个int* 型变量被修饰了静态,不允许通过本指针改变指向的内容(int *a) 
(2)有一个指针 变量被修饰了静态,(且是指向int的),不允许通过本指针修改内容 (*a)
(3)有一个 变量 被修饰了静态,(且是int*型的),不允许修改指向地址(a) 
(4)指针的指向地址不允许修改, 指针内容不允许通过该指针修改 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值