const传奇

2016-01-29 12:20 3 1 收藏

const传奇,const传奇

【 tulaoshi.com - C语言心得技巧 】

const传奇
原作:Rahul Singh 翻译:zhigang

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

[译者注]有些地方按原文解释不通,译者根据自己的理解作了适当修改。如有不妥之处,请告知coolgrass@sina.com或参考原文。
原文来自www.codeproject.com

简介
当我自己写程序需要用到const的时候,或者是读别人的代码碰到const的时候,我常常会停下来想一会儿。许多程序员从来不用const,理由是即使没用const他们也这么过来了。本文仅对const的用法稍作探讨,希望能够对提高软件的源代码质量有所帮助。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

常变量
变量用const修饰,其值不得被改变。任何改变此变量的代码都会产生编译错误。Const加在数据类型前后均可。
例如

void main(void){    const int i = 10;    //i,j都用作常变量    int const j = 20;    i = 15;            //错误,常变量不能改变    j = 25;            //错误,常变量不能改变}
常指针
Const跟指针一起使用的时候有两种方法。

const可用来限制指针不可变。也就是说指针指向的内存地址不可变,但可以随意改变该地址指向的内存的内容。

void main(void){    char* const str = "Hello, World";    //常指针,指向字符串    *str = ''M'';            //可以改变字符串内容    str = "Bye, World";        //错误,如能改变常指针指向的内存地址}
const也可用来限制指针指向的内存不可变,但指针指向的内存地址可变。
void main(void){    const char* str = "Hello, World";    //指针,指向字符串常量    *str = ''M'';        //错误,不能改变字符串内容    str = "Bye, World";    //修改指针使其指向另一个字符串    *str = ''M'';        //错误,仍不能改变字符串内容}
看完上面的两个例子,是不是糊涂了?告诉你一个诀窍,在第一个例子中,const用来修饰指针str,str不可变(也就是指向字符的常指针);第二个例子中,const用来修饰char*,字符串char*不可变(也就是指向字符串常量的指针)。

这两种方式可以组合起来使用,使指针和内存内容都不可变。

void main(void){    const char* const str = "Hello, World";        //指向字符串常量的常指针    *str = ''M'';            //错误,不能改变字符串内容    str = "Bye, World";        //错误,不能改变指针指向的地址}
Const和引用
引用实际上就是变量的别名,这里有几条规则:
声明变量时必须初始化
一经初始化,引用不能在指向其它变量。
任何对引用的改变都将改变原变量。
引用和变量本身指向同一内存地址。

下面的例子演示了以上的规则:

void main(void){    int i = 10;                    //i和j是int型变量    int j = 20;            int &r = i;                    //r 是变量i的引用    int &s;                        //错误,声明引用时必须初始化    i = 15;                        //i 和 r 都等于15    i++;                        //i 和 r都等于16    r = 18;                        //i 和r 都等于18    printf("Address of i=%u, Address of r=%u",&i,&r);    //内存地址相同    r = j;                        //i 和 r都等于20,但r不是j的引用    r++;                        //i 和 r 都等于21, j 仍等于20}
用const修饰引用,使应用不可修改,但这并不耽误引用反映任何对变量的修改。Const加在数据类型前后均可。
例如:
void main(void){    int i = 10;    int j = 100;    const int &r = i;    int const &s = j;    r = 20;          //错,不能改变内容    s = 50;          //错,不能改变内容    i = 15;          // i和r 都等于15    j = 25;          // j和s 都等于25}
Const和成员函数
声明成员函数时,末尾加const修饰,表示在成员函数内不得改变该对象的任何数据。这种模式常被用来表示对象数据只读的访问模式。例如:
class MyClass{    char *str ="Hello, World";    MyClass()    {        //void constructor    }        ~MyClass()    {        //destructor    }    char ValueAt(int pos) const    //const method is an accessor method    {        if(pos >= 12)               return 0;*str = ''M'';      //错误,不得修改该对象        return str[pos];    //return the value at position pos    }}
Const和重载
重载函数的时候也可以使用const,考虑下面的代码:
class MyClass{    char *str ="Hello, World";    MyClass()
                        

来源:https://www.tulaoshi.com/n/20160129/1485685.html

延伸阅读
问题 C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢? 本文将对这两个问题进行一些分析,简单解释const的含义以及实现机制。 问题分析 简单的说const在C语言中表示只读的变量,而在C++语言中表示常量。关于const在C与C++语言中的使用以及更多的区别,以后有时间另开一贴说明。 那么const究竟是如何实现的...
缺省情况下,C++ 以传值方式将对象传入或传出函数(这是一个从 C 继续来的特性)。除非你非凡指定其它方式,否则函数的参数就会以实际参数(actual argument)的拷贝进行初始化,而函数的调用者会收到函数返回值的一个拷贝。这个拷贝由对象的拷贝构造函数生成。这就使得传值(pass-by-value)成为一个代价不菲的操作。例如,考虑下面这个类...
《传奇霸业》巫妖王阿修罗神打法 新手速杀攻略 传奇霸业中我们打BOSS只要有战神相助的话,是比较有利的一般来说没有打不过的,但其中有两只是特别厉害滴那就是阿修罗神和巫妖王,他们的厉害之处就在于大范围的攻击技能,伤害是比较高的,一般来说我们的新手玩家在初期很难扛得住。那么在装备还不太好的情况下玩家要如何击杀这两个BOSS呢?...
《剑圣传奇》新手攻略 《剑圣传奇》感觉是一款完全可以爆掉《刀塔传奇》的手机游戏,玩法与画面只强不弱啊,好的,游戏马上就要进行公测了,小编这里也给大家送上这款游戏的新手攻略。 新人刚玩先去论坛领取个礼包,打开有紫英雄送! 当然前期先推图到20点领导力果断换紫英雄。...
《传奇米奇2:双重力量》试玩版图文攻略 迪士尼公司旗下工作室所制作的最正宗的米奇游戏,这是一款任天堂WIll上的动作游戏,将会在2012年11月18日登陆Xbox360平台上,近日官方放出了游戏的试玩版,玩家们可以下载体验一番,试玩版流程比较短,玩家们可以根据游戏的菜单、画面...

经验教程

415

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部