如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。

char greeting[] = " hello";

char* p = greeting;  //non-const pointer,non-const data

const char* p = greeting;  //non-const pointer,const data  声明p为一个指向常量的greeting的指针,p指向的对象不能被修改,但他可以指向任何地址的常量

char* const p = greeting; //const pointer,non-const data  声明p为一个常量指针,他指向greeting,p这个指针的指向不能被修改,但他指向的地址的内容可以修改。

const char* const p = greeting; //const pointer,const data

const std::vector<int>::iterator iter = vec.begin();//iter的作用像哥T* const

*iter = 10;  //没问题,改变iter所指物

++iter;//错误!iter是const

std::vector<int>::const_iterator cIter = vec.begin();  //cIter的作用像哥const T*

*iter = 10;  //错误!*cIter是const

++iter;//没问题,改变cIter

在函数名返回值前加const,表明返回的是常量,不可以修改。在类成员函数最后加const,表明它不改变对象的成员变量,也不能调用类中任何非const成员函数。

可以利用c++的一个与const相关的摆动场:mutable(可变的)。mutable释放掉non-static成员变量的bitwise constness(又称physical constness)约束。

在const和non-const成员函数中避免重复

class TextBlock

{

public:

...

const char& operator[] (std::size_t position) const

  {

    .....

    return text[position];

  }

  char& operator[] (std::size_t position)

  {

    return

      const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);

  }

...

};

将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)。(就是使用mutable释放bitwise constness)

当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

Effective C++ -----条款03:尽可能使用const的更多相关文章

  1. 《Effective C++》读书笔记 条款03 尽可能使用const 使代码更加健壮

    如果你对const足够了解,只需记住以下结论即可: 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施 ...

  2. 条款03 尽可能使用const

    一.概述 使用const约束对象:可以获得编译器的帮助(指出相关出错的地方) const与成员函数:const重载.转型.避免代码重复 二.细节 1. 为什么有些函数要返回const对象(看上去没必要 ...

  3. Effective C++ 条款三 尽可能使用const

    参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以 ...

  4. Effective C++ 条款03:尽可能使用const

    场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const ...

  5. Effective C++_笔记_条款03_尽可能使用const

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 关键字const多才多艺,语法变化多端.关于const的基本用法 ...

  6. 条款21: 尽可能使用const

    对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const,还有,两者都不指定为const: char *p = "hello"; ...

  7. effective c++(03)之const使用方法

    char greeting[] = "hello"; char* p = greeting; //non-const pointer,non-const data const ch ...

  8. 《Effective C++ 》学习笔记——条款03

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  9. Effective C++ 之 Item 3:尽可能使用 const

    Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...

随机推荐

  1. 机器学习的5种语言(选自info world)

    摘要:机器学习目前炙手可热,本文搜集了Java.Python以及go等编程语言中常见且实用的开源机器学习工具,对机器学习感兴趣的开发者或者准备和机器学习打交道的数据科学家们不能错过了 [编者按] 机器 ...

  2. 学习(主题或切入点)checklist1

    业务+技术+架构+运维+管理 技术学习:http://www.runoob.com/mongodb/mongodb-query.html 一.技术篇​补充学习列表 1,mongodb(o) 2,red ...

  3. ThinkPHP3.2.3 安装教程

    本文以  Windows  平台为例 安装前准备:Windows操作系统的电脑,php编程环境(配置好了Apache.MySql.php).推荐wampserver.               待安 ...

  4. Ubuntu 14 修改默认打开方式

    通过研究,有三种修改方式. 方式一: 修改路径:右上角“系统设置” -> 详细信息 -> 默认应用程序 但是,有个缺陷,可修改的项比较少. 方式二: 例如,修改pdf的打开方式,只要查看任 ...

  5. JQuery实战手风琴-遁地龙卷风

    (-1)写在前面 这个图片是我从网上下载的,向这位前辈致敬.图片资源在我的百度云盘里.http://pan.baidu.com/s/1nvfJHdZ 我用的是chrome49,JQuery3.0,案例 ...

  6. HDU 4791 Alice's Print Service(2013长沙区域赛现场赛A题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3.. ...

  7. BZOJ1367——[Baltic2004]sequence

    1.题目大意:给一个序列t,然后求一个序列z,使得$|z1-t1|+|z2-t2|+...+|zn-tn|$的值最小,我们只需要求出这个值就可以了,并且z序列是递增的 2.分析:这道题z序列是递增的, ...

  8. objc@interface的设计哲学与设计技巧

    blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...

  9. http基础实战

    1.需求 了解http的基础知识,能看懂chrome下网络的情况 2.前置知识 下面是tcp/ip协议的一些东西,今天就只用了解应用层的http就够了. 3.http是什么 我们在网上浏览网页,会发送 ...

  10. Opencv二值图像的分布直方图

    Mat img; ]; int main() { VideoCapture video(); if (!video.isOpened()) { ; } Mat img; Mat img1, img2, ...