前言
在《const关键字到底该怎么用》一文中介绍了c语言中的const关键字,本文说说c++中的const关键字,它的大部分特点和c语言中的类似,所以本文主要针对不同之处。
修饰普通变量--只读
在c语言,虽然表面是不允许被修改,但是看下面的代码:
#include intmain(void) { constinta=10; int*p=&a; *p=11; printf(a=%d\n,a); return0; } 它的输出结果是a=11 所以c语言里,表面上它是只读的,然而你违规操作仍然能改变。但是,千万不要写这样的代码!!! 与c语言中const关键字不同的是,c++中使用const关键字定义的b变量的值在被改变时会被检测。 看一个例子就明白了:#include intmain() { constinta=10; int*p=&a; *p=11; return0; } 编译报错如下:main.cpp:infunction‘intmain()’: main.cpp:5:14:error:invalidconversionfrom‘constint*’to‘int*’[-fpermissive] int*p=&a; 再次强调:在实际中千万不要写这样的代码,这里只是为了说明问题。另外它们的作用也是一样的,声明一个只读变量,不希望被修改,一旦被修改,编译器将会报错。 但是你运行下面的代码,又会有惊喜:#include voidtest(constchar*str) { char*p=(char*)str; p[0]='2'; } intmain(void) { chara[]=12345; test(a); return0; }毕竟未定义行为常常有惊喜。 我们常常看到传递const char*参数,像这样:voidtest(constchar*str); 却似乎从来没有见到过const int作为参数的函数:voidtest(constintval); 为何?因为前者传递指针的副本,指针指向不会被改变,但可以改变指向的内容;但是int类型参数,它也是传递副本,但是永远不会被函数改变,自然也没有必要加const关键字。更多解释可以参考《传值和传指针》。 同样的,修饰函数返回值时,修饰内置类型与不加const修饰是一样的,但对于自定义类型,不能对返回值进行修改,即返回的是常量。
作用在成员函数-不改变成员变量
举个例子:
#include classtest { private: inta; public: voidprinta()const { a=10; } }; intmain() { testtest; test.printa(); return0; } 类test中有一个成员变量a,并且有一个成员函数printa,现在假设你的设计是printa函数不会改变任何成员变量,那么你可以在printa函数后加上const关键字,这样一旦函内部尝试修改成员变量,都会报错:main.cpp:inmemberfunction‘voidtest::printa()const’: main.cpp:9:13:error:assignmentofmember‘test::a’inread-onlyobject a=10; 正因如此,const修饰成员函数不与static关键字同用,因为static修饰的静态成员函数不能实例化,也就没有实例的成员变量一说,自然不存在修改成员变量。 即下面的声明是非法的:staticvoidprinta()const
修饰类成员变量--构造函数中初始化
与修饰普通变量不同的是,修饰类成员变量还可以在构造函数中初始化。如:
#include classtest { private: constinta; public: test(intval):a(val){} }; intmain() { testtest(1); return0; }
修饰引用
例如,有一个常量
constinta=10; 你不能再这样定义它的引用:int&ref=a; 而需要定义对常量的引用,即:constint&ref=a; 为什么呢?因为不能直接为a赋值,也不能间接赋值,所以自然不能定义普通引用去间接改变它。
总结
关于const关键字在c和c++中的区别,想必到这里你已经清楚了。const关键字通常能借助编译器帮助我们提前发现一些不易察觉的问题。 如果你对下面的问题还不清楚,建议阅读《const关键字到底该怎么用》 你能分清下面的声明区别吗?
constint*p; int*constp; intconst*constp;
Imagination与Ventana合作 共同开发基于RISC-V的CPU-GPU
诺基亚发布的新一代PSE-V芯片
plc梯形图转换为指令表的方法
kvm切换设备在交通运输运营管理控制室中的应用
Intel成都生产线收到2.5万颗BDW系列CPU紧急订单 客户备注将用于呼吸机
C++与C的const关键字有何差别?
小米本月底发布新机 很大可能是红米4
下一代旗舰处理器麒麟990完成首次流片
智路资本与ams共同打造MEMS传感器公司ScioSense
华为Nova2怎么样?华为Nova2评测:5英寸小屏颜值首选,华为Nova2活动降价200元
led显示屏用u盘怎么改字_led用u盘导入字幕步骤
工业数据传输中使用的模拟量和开关量分别是什么
自制简易MORSE练习器,morse Trainer
ATM机行业下一步将如何发展?
RS-485的手拉手连接方案
北京联通 华为 5G Capital发布会精彩看点
China ESG Alliance 正式成立 联动多方资源予力 ESG 发展
健康科技新潮流:OPPO Watch 4 Pro
Win2003服务器集群技术 (完整版)
电池技术——蓄电池的特性和试验2