【C++】C++学习笔记之三:const用法

1. const存在的意义

相当于C语言的宏定义。

定义一个常量,在所有需要使用这个常量的地方用字符代替数值,更容易理解其含义,当这个常量值不再适用时方便修改

变量值不可改变

可以警惕防止某些程序一不小心改变了不应该被改变的值

2. const变量

const变量一旦被创建就不能改变,所以const对象定义时必须初始化。
默认状态下,const对象仅在文件内有效,不同文件定义的同名const对象被认为是两个变量,如果想让多个文件的const对象保持一致,可以如下定义:

//在file_1.cpp中定义并初始化一个const对象:
extern const int bufsize=512;
//在file_1.h头文件中声明
extern const int bufsize;//声明,不用也不能初始化,别的地方使用bufsize只需要#include “file_1.h”

3. const参数

在函数的参数列表中单个参数前面加上“const”关键字,就把该参数变成了此函数的const参数。const类型的函数参数表示在函数体内部,该参数的数值不会被改变。
这里可能会有个疑问:const参数既然表示该参数的值在函数范围内不能被修改,那我们是否可以传入const指针类型的参数,不改变指针地址,只改变指针指向的内容呢。
下面就此疑问来做三个试验:

【实验一】:改变const 指针型参数所指向的内容

// 编写一个函数随机创建一个包含<size>个Date类型数据的数组
bool CreatePoints(const Date* darr, const int size){
    if(size < 0) return false;
    srand((int)time(0));
    for(int i = 0; i < size; ++i){
        darr[i].year = rand()%3000; //from 0 year to 2999 year
  ……
    }
    return true;
}
//在main函数中调用此函数创建十个Date型数据的数组
int main(int argc,char **argv){
    const Date * arrDate = new Date[10];
    CreatePoints(arrDate, 10);
    return 0;
}

编译后发现,编译器报如下错误
[图片]

由此得出结论:对于const指针型参数,指针所指向的内容会被当做 read-only处理而不能修改。

【实验二】:改变const指针型参数本身的地址

bool CreatePoints(const Date* darr, const int size){
    darr = NULL;
}
int main(int argc,char **argv){
    const Date * arrDate = new Date[10];
    CreatePoints(arrDate,10);
    return 0;
}

实验结果:编译通过,正常运行。

【实验三】:不可改变地址的const指针

把以上实验的CreatePoints函数的指针参数改成,<类型名> * const <指针>的形式,然后再在函数体里试图改变指针自身的值。

bool CreatePoints(Date* const darr, const int size){
    darr = NULL;
}

得到的结果是,编译报错:

clipboard_2.png

【结论】:

对于上面三个实验的结果这里又要回到【const变量】的话题,
(1) const+普通非指针型变量,有两种写法,其含义一样都是表示不可改变值的常量:

//以下两种写法是等价的,都是int型变量a是常量read-only的意思
const int a;
int const a;

(2)const+指针型变量,有三种写法:
前两种语句表达的意思相同,都是(*p)不可变,即指针p所指向的内容为const不可变;第三种写法意思是指针p本身是常量const的,也就是说,指针p的值(内存地址)是不可变的,而指针所指向的内容是可以变的


const int *p;//指针p所指向的内容不可以改变
int const *p;//指针p所指向的内容不可以改变
int * const p; //指针p自身的值不可以改变

4. const成员函数

const成员函数的一般形式是在函数的参数列表()后和函数体{ }之前加 const 关键字,表示该函数中不会改变类中的数据:

class complex{
public:
        double real() const  { return re; }
};

在类外的全局函数中使用const会报错

const成员函数是C++独有的const用法,其只能在类的成员函数中使用,如果在全局函数中使用会报编译错:
例如下面的代码:

bool isconst() const{ return true;}

编译后报错:


clipboard_3.png

漏写const的类成员函数可能会给使用者造成困扰

有些看似并无影响的类成员函数如果不加const是不是也可以呢?还是让代码来说话:

class complex{
    public:
        double real(){ return re; }
};
//调用
int main(){
    complex c1(2,1); 
    cout << c1.real() << endl; //正常使用,没有问题
    const complex c2(3.5);
    cout << c2.real() << endl; //报错,编译器理解为一个常量类实例试图调用自身可能会改变成员数据的成员函数
}

编译后第二个cout处出错:


clipboard_4.png

好的编码习惯:

最后值得注意的是:在编写函数代码时,首先应该考虑的就是是否可以使用const关键字:函数的参数是否将在函数体内被改变,不会改变就要加const显示标注;类内成员函数是否会改变类型中的数据,不会改变要加const显示标注该函数为const型成员函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容