Advance C++ -- const

这条博客基于Bo Qian的YouTube教学教程总结而成,大家可以在YouTube上找到该教程,这里做一个心得总结。

这部分,总结一下对const的认识:

学过C++的都知道,C++中的const用于修饰常量,也就意味着不可改变,你以为就是这么简单了,但是实际中const可以玩出很多花样:

1.  const int *m ,int* const m 和 int const *m

其实大家除了第一种写法外,很少用后面两种写法,但是这两种都是合法的C++语法,却和第一种写法有很大的不同。const int *m 表示const修饰m指针指向的int值,也就是该指针指向的int值不可改变。

int i = 9;
const int *m = &i;
//compile error
*m = 10;
// compile success
m++;

int* const m 表示m指针值为const,但是m指向的值不是,还是用代码做个演示

int i = 9;
int * const m = &i;
// compile error
m++;
// compile success
*m = 10;

int const *m看起来好像更加少遇到,其实和const int *m 是一个意思,有一个非常容易记住的规律,const在指针符号*之前,则表示该值为const,否则表示指针为const。

C++中有一个cast特性,表示类型的转换,当然,const也是可以进行cast away的,举个例子,我们定义了const修饰的int值,如果我们想要修改它,也不是没有办法,C++提供了const_cast<>来将变量的const属性去除。

int main(){
      const int i = 9;
      const_cast<int&>(i) = 10;
}

但是这种操作方式不被推荐,因为const变量定义的初衷就是不想改变它。而且这种操作也不安全,容易造成很多问题。

那么我们为什么要用const呢?

1. 在设计之初定义const变量,可以在程序开发的过程中避免错误的写入,举个例子,我们在Person对象中定义了人的ID,如果你不想让ID改变,就将其定义为const,这样,如果后续有其他的程序员试图改变该变量,就会报错,这样就很好的起到了保护变量的作用。

2. 读者在看到const修饰的变量时,就知道该变量是不可变,所以起到了self documenting的作用(意思就是代码即注释)。

3.  const变量的定义有利于compiler对程序进行优化,使代码更加紧凑或者是执行的效率更高。很容易理解,const在编译阶段compiler就已经知道,所以可以进行大胆的优化(因为一旦初始化后就不会改变)。

4. const在C++就是read-only memory,可以放到不可读的区域例如ROM中,其实作用和上一条说的差不多,有利于程序的编译运行。

下一篇将会介绍const修饰的function,结合C++中的OOP介绍const在成员函数修饰中的巨大作用。

时间: 2024-10-13 07:43:00

Advance C++ -- const的相关文章

C++ STL 迭代器方法 之 advance与prev 方法 浅析

[摘要] 迭代器是STL中重要的一支,prev和distance是其基本方法.distance方法十分简单,就不在此赘述,现主要对prev方法以及其相关方法--advance方法作简要介绍与使用说明,并在文末附上代码示例. [Advance 方法] Advance iterator Advances the iterator it by n element positions. If it is a random-access iterator, the function uses just o

const指南

基本词义  意思就就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用! 使用方法 const int a=1;//这里定义了一个int类型的const常数变量a; 但对于指针来说const仍然是起作用的,以下有两点要十分注意,因为下面的两个问题很容易混淆! 我们来看一个如下的例子: //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者 #include <iostream> using na

PHP 面向对象中常见关键字使用(final、static、const和instanceof)

PHP 面向对象中常见关键字的使用: 00x1.Final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用final标识的成员方法,在子类中不能覆盖. 总结:final表示为最终的意思,所以使用final关键字的类或者类中的成员方法是不能被更改的. 00x2.Static :static关键字将类中的成员属性或者成员方法标识为静态的,static标识的成员属性属于整个类,static成员总是唯一存在的,

const 放在函数后

const 放在函数后表示这个函数是常成员函数, 常成员函数是不能改变成员变量值的函数.const 限定符,它把一个对象转换成一个常量.举例:为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明:class Point{public:int GetX() const;int GetY() const;void SetPt (int, int);void OffsetPt (int, int);private:int xVal, yVal;};const成员函数

修改 const 的值之后的奇怪变化

1 #include <iostream> 2 3 int main(void) 4 { 5 const int a = 10; 6 int* p = (int*)&a; 7 *p = 20; 8 std::cout << a << "|" << &a << std::endl; 9 std::cout << *p << "|" << p <<

《const限定符的使用》

在程序中,对于数据,我们有一种数据希望给定了,就不会改变.书上常拿圆周率来举例! 我们把这类一开始就给定的数据,并且在程序运行过程中不改变的数据称为常量. 那么这里 也就说明了,如果要用const ,那么你要保证你那个数是个常量. 第一点:既然是不变,而我们又知道它的值,那么我们必须对他初始化.以后不能改变它! 第二点:常量在内存中有值,且伴随它所在的作用域存在,可以理解为大括号内. 第三点:const修饰什么,什么就是常量(下边将结合一些代码,给出几种常量类型) #include "stdaf

const总结

const const限定符将一个对象转换成一个常量,限定了其值不允许改变. 常变量 int const val=5;//两种方法都可以: const int val1=6;//因为常量在定义后不能改变,所以定义时必须初始化: 任何企图修改val和val1的操作都会引起编译错误: const引用 const应用是指向const对象的引用 不能将普通的引用绑定到const对象: const int r=10; const int &r1=r;//不能对r1赋值: int &r2=r;//错误

const的使用总结(转载)

C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的. 一.Const作用    如下表所示: No. 作用 说明 参考代码 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行

请问微信小程序let和var以及const有什么区别

在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文本查看 复制代码 ? 1 2 3 4 5 for(var i=0;i<=1000;i++){ var sum=0; sum+=i; } alert(sum); 声明在for循环内部的sum,跳出for循环一样可以使用,不会报错正常弹出结果 let:声明块级变量,即局部变量. 在上面的例子中,跳出fo