如果关键字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. 如何向git账号上提交代码

    官方说明:https://help.github.com/articles/generating-ssh-keys/ 1,为Github账户设置SSH key 文章地址:http://zuyunfei ...

  2. Linux服务器管理: 系统的进程管理后台进程的切换和相关命令

    1.把进程放入到后台: [root@localhost/]#tar -zcf etc.tar.gz /etc &           //这种方法是在后台运行的 [root@localhost ...

  3. php 选择排序法

    private function demo(array $arr = array()){ $len = count($arr); if ($len == 1) return $arr; else fo ...

  4. SqlServer 还原他服数据库只建立发布却删除不了

    本想做测试,从另一台服务器备份数据库还原到本机. 创建了一个发布,却删除不了,提示如下图: 参考论坛:http://bbs.csdn.net/topics/300046417 发现是数据库所有者问题, ...

  5. 清除浮动(clearfix hack)

    eg:

  6. iOS并发编程指南之同步

    1.gcd fmdb使用了gcd,它是通过 建立系列化的G-C-D队列 从多线程同时调用调用方法,GCD也会按它接收的块的顺序来执行. fmdb使用的是dispatch_sync,多线程调用a ser ...

  7. maven之clean、install命令

    1.进入到maven根目录,执行mvn compile命令会在根目录生成target文件(参照maven之helloworld案例),如下图: 2.执行mvn clean可将根目录下生成的target ...

  8. Javascript高级程序设计——在HTML中使用Javascript

    <script>元素 向HTML页面中插入Javascript的主要方法,就是使用<script>元素,<script>元素有六个属性: async:可选.表示应该 ...

  9. FZU2127

    FZU2127:养鸡场 Problem Description Jason买来了n米长的竹篱笆,打算将n米长的竹篱笆所实用来围成一个三角形的养鸡场.为方便起见.养鸡场三条边的长度都为正整数. 同一时候 ...

  10. CentOS6系升级Python2.7版本

    安装前准备 本实例以CentOS6.7为例 [root@E tools]# uname -r 2.6.32-431.23.3.el6.x86_64 [root@E tools]# uname -m x ...