读《effective C++》2

条款03:尽可能使用const(Use const whenever possible)



1.const == 奇妙的事

const的一件奇妙的事是,他允许你定义一个约束,(告诉编译器,这是一个“不该被改动的对象”),并且你这样做了之后编译器会协助你执行这条约束,使编译器成为你的助手。

这确实是一件奇妙的事,程序员其实就是在用特定的语言进行说话,而编译器就是你的翻译者,程序员和你的“翻译者”的密切配合才能出好的程序。

2.const语法变化多端(变量上的)

(1)语法

相信用过的人都见过和尝试过这些看着让人头疼的语法了吧。指针和引用都有不同的const语法

1 const int *p;       //
2 int const *p;      //前面两种形式不一样,但是是同一种。都是指针所指向的变量是修饰为常量
3 int *const p;          //const修饰的是指针变量本身,指针变量本身是常量
4 const int *const p;    //合以上两者

这里不得不提一下来自《C++ Templates》作者序的一个说法:

我们都知道int const *p与const int *p 是等同的
但是这里我们更趋向于int const *p

这里提出两点原因:

a.指针对问题“什么是恒定不变的?”   int const *p提供很容易理解的答案,“恒定不变的部分”是const限定符前面的int

int const *p   //恒定不变的是int (指针所指向整数的部分,整数类型是int)
int* const p   //恒定不变的是int*(指针变量本身,指针变量的类型是int*)

提供另外一种理解const指针的方法

b.设计到使用模板时一个常用的语法替换原则

typedef char* CHARS;
typedef CHARS const CPTR;  //指向char类型的常量指针(指针本身是不变)
//当我们用CHARS所代表的含义对它进行替换之后
typedef char* const CPTR//任然是char类型的常量指针

//但是当我们把const位置放在前面时,就不在实用了
typedef const CHARS CPTR;//指向char类型的常量指针
//替换之后
typedef const char* CPTR;// 指向常量的char类型的指针

(2)STL迭代器的const

迭代器是以指针为根据塑造出来的,所以迭代器的作用就像T*  指针。

所以声明迭代器为const就像声明指针为const一样(即声明一个T* const指针),迭代器不能指向不同的对象,所指向的对象的值可以改变

std::vector<int> vec;
...
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*
*cIter = 10;  //错误!!!cIter所指向的为const
++cIter;      //没问题。

迭代器的使用:const iterator iter;      const_iterator iter

(3)const用于函数的返回值和参数值

利用const本身的属性来解决一些不变问题。

3.const成员函数

(1)目的,是为了确认该成员函数可作用于const对象身上。

重要:a.const使你的class接口比较容易被理解,这样可以很清楚的知道哪个函数可以改动对象内容哪个不可以;这很重要

   b.它们使“操作const对象”成为可能。(很多时候以pass by reference-to-const方式传递对象),这样可以使const对象呗调用

时间: 2024-10-18 15:51:36

读《effective C++》2的相关文章

读Effective Objective C总结(二)

OC编译器的特性:在声明成员变量时,编译器会产生一个硬编码的偏移量,它表示变量距离存放该对象的内存区域的起始地址的长度.OC把这个偏移量作为类对象的一个特殊变量,在runtime时期查找,就总可以生成正确的偏移量. @property 属性:在没有进行任何手动操作的前提下,这个属性第一自动生成了getter和setter方法,同时生成了对应属性"_字段"的成员变量 @property中内存管理的语义: 4.关于使用点语法的原则:在初始化方法或者dealloc中,要用成员变量,不要用点语

读Effective Objective C总结(三)

在collection集合类中如NSSet中是不允许有相同的元素的,但是如果这样写: 这样就会第一个set的输出结果是两个相同的元素,第二个set的输出结果只有一个元素 类族模式:由于在OC中没有抽象基类,因此用工厂模式,比如我们可以用创建UIButton类似的方法:判断某个实例所属的类是否在类族之中,要用isKindOfClass不能用isMemeberOfClass,因为有些类会有内部类型 关联对象的使用,实际上就是在局部空间建立一个通道来共享某些类,如在UIAlert里面共享block 消

读Effective Objective C总结(一)

第一章 Objective C是一种基于消息结构的语言,在查找执行的方法和对象时是在运行时处理 对象的空间分配在堆空间,指向对象的指针分配在栈空间,基本数据类型和结构体也分配在栈空间 在引入头文件时,尽量使用@Class前向声明来提高编译效率 多使用字面量语法,但是在取下标的时候,要注意是否有意义 少使用#define预处理指令,若要在一个文件(当前单元)里使用静态常量,应该这样声明:static const NSTimeInterval kTime,但是这种方法并不能用OC的方法初始化,即必须

[C++11] Effective Modern C++ 读书笔记

本文记录了我读Effective Modern C++时自己的一些理解和心得. item1:模板类型推导 1)reference属性不能通过传值参数传入模板函数.这就意味着如果模板函数需要一个reference类型的参数,必须在模板声明中将其声明为reference,否则,即使使用一个reference类型的变量调用模板函数,类型推导的结果将不带reference属性. 2)constant和volatile属性也不能通过传值参数传入模板函数,但是可以通过reference参数传入这些属性. 3

Effective TCP/IP Programming读书笔记

TCP/IP深入思考 这是我读Effective TCP/IP Programming的 读书笔记和思考,以及做的一些实验.强烈建议后端工程师有空读一读这本书,有些细节的确是我们平时没有注意的,读了最好自己动手做一些实验加深理解. fin的含义 对端发送fin会导致read()返回,但send()照样可以发送,也就是单纯的fin其实相当于shutdown(SHUT_WR). 当对端应用程序崩溃后(未close),本段一直调用send(),对端会返回RST,此时read()会返回Connectio

effective java读书笔记1——创建和销毁对象

今天刚开始读effective java,中文版的读起来很拗口,但感觉收获很多. 另外,这本书的内容是针对Java 1.5和1.6的. 在这里整理一下第2章:创建和销毁对象 的内容. 第一条:考虑用静态工厂方法代替构造器 这一条针对的情景是要获得类的实例时.一般说来,想要获得类的实例,都是通过构造函数(书里叫做构造器). 最常见的构造函数是这样的,没有返回参数,名字和类名相同. public class A{ public A(int a){ //构造函数内容 ... } } 而所谓的静态工厂,

【Effective C++ 笔记】让自己习惯C++

最近在读 Effective C++,想要做点笔记,归类和书中的每个模块一样,但跟模块里的具体顺序可能不太一致.不会对书中每个细节都涉及,主要记下自己觉得重要的内容. What is C++? C++ 是一个多重范型编程语言( multiparadigm programming language),一个同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(genetic).元编程形式(metaprogramming)

windows类书的学习心得(转载)

原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,

TCP/IP之四书五经[转自2003.12程序员]

TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要.从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE.Java..NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度.但是,如果想要在这个领域达到融会贯通的地步,不打下坚实的基础是不可想象的.正如Richard Stevens在TCP/IP Illustrated中所说,在网络编程领域,开发者所遇到的实际问题中,大约

TCP/IP的经典网络编程

                                                                         TCP/IP网络编程之四书五经                                                                                                                             孟岩 TCP/IP协议是眼下广域网和局域网通用的网络协议.因此.基于TCP