如果关键字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. autopep8

    修正python pep8的警告挺无趣的, 用了 autopep8 感觉比较爽. 记录如下. ----------------pep8检查----------------平时我用pydev做pep8检 ...

  2. 2015年12月12 Node.js实战(一)使用Express+MongoDB搭建多人博客

    序,Node是基于V8引擎的服务器端脚本语言. 基础准备 Node.js: Express:本文用的是3.21.2版本,目前最新版本为4.13.3,Express4和Express3还是有较大区别,可 ...

  3. jquery Ajax跨域调用WebServices方法

    由于公司需要开发一个手机页面,想提供给同事直接在手机上可以查询SAP资料.数据需要使用js调用webserver来获取. 因为初次使用Jquery调用Webserver,所以期间并不顺利.测试调用We ...

  4. activiti数据库表结构全貌解析

    http://www.jianshu.com/p/e6971e8a8dad 下面本人介绍一些activiti这款开源流程设计引擎的数据库表结构,首先阐述:我们刚开始接触或者使用一个新的东西(技术)时我 ...

  5. PHP 如何显示大数字,防止显示为 科学计数法 形式

    PHP 数字超过一定长度时,会自动转换为 科学计数法 的形式,如 1.2345678912346E+16: 如何 避免转换,让它原样展示呢? 不过,可以用PHP函数 number_format() 来 ...

  6. 使用APPCAN开发移动应用APP心得

    要想使用APPCAN开发移动应用,首先要弄明白什么是APPCAN,APPCAN都具有哪些功能. 1.什么是APPCAN? APPCAN是正益无线公司开发的一套Hybrid混合应用开发平台(AppCan ...

  7. asp.net读写配置文件方法

    方法1: System.Collections.Specialized.NameValueCollection nvc = (System.Collections.Specialized.NameVa ...

  8. 给groupBox添加滚动条

    public Form3() { InitializeComponent(); foreach (Control gbox in groupBox1.Controls) { if (gbox is V ...

  9. phpcms如何判断用户是否登录

    首先要获取userid  <?php         $userid= param::get_cookie('_userid'); ?> 然后再判断是否为空 {if $userid}    ...

  10. OpenCv椭圆皮肤模型

    Mat input_image; Mat output_mask; Mat output_image; void main() { VideoCapture cam(); if (!cam.isOpe ...