const正确性

对于 const Fred * p来说, p是一个指针, 指向了一个 常量Fred. 假设Fred 类有一个叫做 inspect() 的 const 成员函数,那么写 p->inspect() 是可以的。但如果 Fred 类有一个非 const 成员函数 mutate() ,那么写 p->mutate() 就是个错误(编译器会捕获这种错误;不会在运行时测试;因此 const 不会降低运行速度)。

也就是说const对象只能调用const方法。

同理, const引用也是这样, 比如const Fred & x, x也只能调用const方法。

那什么是const成员函数。 就是这个函数只能访问 成员属性, 不能修改成员属性。

 class Fred {
 public:
   void inspect() const;   // 该成员保证不修改*this
   void mutate();          // 该成员可能会修改*this
 };

 void userCode(Fred& changeable, const Fred& unchangeable)
 {
   changeable.inspect();   // 正确:没有修改一个可修改对象
   changeable.mutate();    // 正确:修改一个可修改对象

   unchangeable.inspect(); // 正确:没有修改一个不可修改对象。
   unchangeable.mutate();  // 错误:试图修改一个不可修改对象。
 }

const方法可以有 const对象 和 非const 对象调用, 但是 const对象只能调用 const 方法。


const重载, 同名的const方法和非const方法是重载的, 比如

 class Fred { ... };

 class MyFredList {
 public:
   const Fred& operator[] (unsigned index) const;  ←下标运算符通常成对出现
   Fred&       operator[] (unsigned index);        ←下标运算符通常成对出现...
 };

同理, 对于参数来说, const参数和非const参数也不是同一个类型, 比如 const std::stringstd:string 就不是同一个类型


const Fred *p有什么含义, p是一个指针, 指向一个 const对象Fred, p只能调用 Fred 的 const 成员方法。同理

 const Fred* p  表明  p  指向一个  const  的  Fred  对象——  Fred  对象不能通过  p  修改。
  Fred* const p  表明  p  是一个指向  Fred  对象的  const  指针——可以通过  p  修改  Fred  对象,但不能修改  p  本身。
  cosnt Fred* const p  表明“  p  是一个指向  const Fred  对象的  const  指针”——不能修改  p  ,也不能通过  p  修改  Fred  对象。
18.6 “  const Fred& x  ”是什么意思?

mutable和 const_cast方法

如果 const 方法也想要改变成员属性, 这个属性必须是 mutable 的, 但是由于不是所有的编译器都支持mutable 这个关键字, 所以最好不要使用。

const_cast


const成员函数, 就是在参数列表之后增加一个const限定, 该成员函数可以由const对象和 非const对象调用,该成员函数确保不会修改成员属性。

const对象只能调用const成员函数, 不能调用非const成员函数。

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

推荐阅读更多精彩内容

  • 常引用(Const Reference) 引用可以被const修饰,这样就无法通过引用修改数据了,可以称为常引用。...
    吃掉夏天的怪物阅读 697评论 0 0
  • const即constant的缩写,意为持久不变的. 1.通过const修饰来定义常量 在常量定义前加const,...
    fly盛夏光年阅读 235评论 0 3
  • (1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值. 详细内容: 1、什么是const...
    幽鬼09阅读 707评论 0 4
  • 来说下c/c++中的const的用法。在英语中常数的一种表达是“中的const的”,在编程中可能是借用了这个单词(...
    Jack_Cui阅读 3,738评论 0 3
  • 继承 继承的方式有三种 公共继承 保护继承 私有继承 访问权限publicprotectedprivate对本类可...
    lieon阅读 1,147评论 0 1