www.adminn.cn
站长正能量分享网!

C+与C中的const关键字有何差别?

AD:阿里云服务器企业会员更优惠 腾讯云香港,韩国免备案服务器1.8折优惠

秩序美好2019-11-02

来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

前言

在《const关键字到底该怎么用》一文中介绍了C语言中的const关键字,本文说说C++中的const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。

修饰普通变量–只读

在C语言,虽然表面是不允许被修改,但是看下面的代码:

#include

intmain(void)

{

constinta =10;

int*p = &a;

*p =11;

printf(“a=%d\n”,a);

return;

}

它的输出结果是

a=11

所以C语言里,表面上它是只读的,然而你违规操作仍然能改变。但是,千万不要写这样的代码!!!

与C语言中const关键字不同的是,C++中使用const关键字定义的b变量的值在被改变时会被检测。

看一个例子就明白了:

#include

intmain()

{

constinta =10;

int*p = &a;

*p =11;

return;

}

编译报错如下:

main.cpp:Infunction‘intmain()’:

main.cpp:5:14:error: invalid conversion from ‘constint*’to‘int*’ [-fpermissive]

int*p = &a;

再次强调:在实际中千万不要写这样的代码,这里只是为了说明问题。另外它们的作用也是一样的,声明一个只读变量,不希望被修改,一旦被修改,编译器将会报错。

但是你运行下面的代码,又会有惊喜:

毕竟未定义行为常常有惊喜。

我们常常看到传递const char*参数,像这样:

voidtest(constchar* str);

却似乎从来没有见到过const int作为参数的函数:

voidtest(constintval);

为何?因为前者传递指针的副本,指针指向不会被改变,但可以改变指向的内容;但是int类型参数,它也是传递副本,但是永远不会被函数改变,自然也没有必要加const关键字。更多解释可以参考《传值和传指针》。

同样的,修饰函数返回值时,修饰内置类型与不加const修饰是一样的,但对于自定义类型,不能对返回值进行修改,即返回的是常量。

作用在成员函数-不改变成员变量

举个例子:

#include

classTest

{

private:

inta;

public:

voidprintA()const

{

a =10;

}

};

intmain()

{

Test test;

test.printA();

return;

}

类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修饰的静态成员函数不能实例化,也就没有实例的成员变量一说,自然不存在修改成员变量。

即下面的声明是非法的:

static voidprintA()const

修饰类成员变量–构造函数中初始化

与修饰普通变量不同的是,修饰类成员变量还可以在构造函数中初始化。如:

#include

classTest

{

private:

constinta;

public:

Test(intval):a(val){}

};

intmain()

{

Testtest(1);

return;

}

修饰引用

例如,有一个常量

constinta =10;

你不能再这样定义它的引用:

int&ref= a;

而需要定义对常量的引用,即:

constint&ref= a;

为什么呢?因为不能直接为a赋值,也不能间接赋值,所以自然不能定义普通引用去间接改变它。

总结

关于const关键字在C和C++中的区别,想必到这里你已经清楚了。const关键字通常能借助编译器帮助我们提前发现一些不易察觉的问题。

如果你对下面的问题还不清楚,建议阅读《const关键字到底该怎么用》

你能分清下面的声明区别吗?

constint*p;

int*constp;

intconst*constp;

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧END‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

模板优惠价: (点击购买)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《C+与C中的const关键字有何差别?》
文章链接:https://www.adminn.cn/news/779.html
本站资源模板仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。2021.5月起,网站调整,暂不再分享免费模板。谢谢理解

Adminn.Cn 站长分享圈

帝国CMS精品模板腾讯云优惠券,代金券

本站源码仅供本地环境下学习借鉴研究使用!

源码请勿用于任何涉灰站点!净化网络,站长更有责!

支付宝扫一扫打赏