Effective C++_笔记_条款00_基本术语
(整理自Effctive C++,转载请注明。整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/)
下面是每一位C++程序员都应该了解的C++词汇。
1 C++中 声明和定义 的区别
注意:关于声明和定义的区别,我查了一些资料,和本书也有不一致的地方。暂且按照本书,欢迎指正!。
所谓声明式(declaration)是指定某个东西的名称和类型,但略去细节。就是通知编译器这有一个与这个名字相关的东西,并且它是这个类型的。例如:
1: extern int x ; //对象(object)声明
2: std::size_t numDigits(int number) ; //函数声明
3: class Wjdget ; //类的声明
4: template<typename T>
5: class GraphNode ; //模版声明
1: int x ; //对象的定义
2:
3: std::size_t numDigits(int number) //函数的定义式
4: { //次函数返回的是整数数字的位数
5: std::size_t digitsSoFar = 1 ;
6:
7: while((number/=10)!=0) ++digitsSoFar ;
8: return digitsSoFar ;
9: }
10:
11: class Widget //class的定义式
12: {
13: public:
14: Widget() ;
15: ~Widget() ;
16: ...
17: };
18:
19: template<typename T> //模版的定义式
20: class GraphNode
21: {
22: public:
23: GraphNode() ;
24: ~GraphNode() ;
25: ...
26: };
2 关于构造函数
2.1 默认构造函数和explicit声明
对用户自定义的类型的对象而言,初始化由构造函数执行。default构造函数是一个可被调用而不带任何实参者。这样的构造函数要不没有参数,要不就是每个参数都有缺省值。构造函数被声明为explicit,这可以阻止它们被用来执行隐式的类型转换(implicit type conversions),但仍可被用来就行显示的类型转换(explicit type conversions) :
1: class B
2: {
3: public:
4: explicit B(int x = 0 , bool b = true ); //default构造函数
5: };
6:
7: void doSomething (B bObject) ; //函数,接受一个B类型的对象
8:
9: B bObject1 ; //一个类型为B的对象
10: doSomething (bObject1) ; //没问题,传递一个B类对象
11:
12: B bObject2(28) ; //没问题,根据int 28建立一个B类对象(bool参数缺省为true)
13:
14: doSomething (28) ; //错误!doSomething应该接受一个B类对象,而不是int,而int和B之间没有隐式的类型转换
15:
16: doSomething (B(28)) ; //没问题,使用B的构造函数将int显示转换为一个B类对象,从而调用合法
被声明为explicit的构造函数比no-explicit更受欢迎,因为它们禁止编译器执行非预期的类型转换。除非有非常明确的理由允许构造函数被用于隐式类型转换,否则应声明为explicit。
2.2 copy构造函数和copy赋值操作符
copy构造函数被用来“以同型对象初始化自我对象”,copy赋值操作符被用来“从另一个同型对象拷贝其值到自我对象”。例如:
1: class Widget
2: {
3: public:
4: Widget(); //default构造函数
5: Widget(const Widget& rhs ); //copy构造函数
6: Widget& operator= (const Widget& rhs); //copy赋值操作符
7: ...
8: };
9:
10: Widget w1 ; //调用default构造函数
11: Widget w2(w1); //调用copy构造函数
12: w1 = w2 ; //调用copy赋值操作符
13: Widget w3 = w2 ;//调用copy构造函数
copy构造函数和copy赋值操作符很容易区别:如果一个新对象被定义,一定会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义,就没有构造函数被调用,那么当然就是赋值操作被调用。
3 不明确行为
由于各种因素,有些C++的行为没有定义:你无法稳定预估运行期会发生什么事。看如下代码:
1: int* a ;
2: *a = 12 ;
这个声明创建了一个名叫a的指针变量,后面那条语句把12存储在a所指向的内存位置。我们在声明指针时没有给它初始化,所以我们无法预测12这个值会存储在什么地方。所以如果程序执行这个赋值操作,会发生什么情况呢?如果你运气好,a的初始值会是个非法地址,这样的赋值语句就会出错,从而终止程序;一个更为严重的情况是:这个指针偶尔可能包含了一个合法的地址。那么那个位置的值就会被修改,虽然你并无意去修改它。像这种类型的错误非常难以捕捉,因为引发错误的代码可能与原先用于操作那个值的代码完全不相关。所以,在对指针进行间接访问之前,必须对其进行初始化。同样的对NULL指针解引用,对数组越界操作,都会引发不明确行为。
Effective C++_笔记_条款00_基本术语的更多相关文章
- Effective C++_笔记_条款12_复制对象时勿忘其每一个成分
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 编译器会在必要时候为我们的classes创建copying函数, ...
- Effective C++_笔记_条款02_尽量以const、enum、inline替换#define
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#d ...
- Effective C++_笔记_条款01_视C++为一个语言联邦
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++的各种能力和特性使它成为一个无可匹敌的工具,但也可能引发某 ...
- Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define
1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...
- Effective C++_笔记_条款11_在operator=中处理“自我赋值”
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为什么会出现自我赋值呢?不明显的自我赋值,是“别名”带来的结果: ...
- Effective C++_笔记_条款09_绝不在构造和析构过程中调用virtual函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: ...
- Effective C++_笔记_条款08_别让异常逃离析构函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++并不禁止析构函数吐出异常,但它不鼓励你这样做.考虑如下代码 ...
- Effective C++_笔记_条款07_为多态基类声明virtual析构函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个规则只适用于polymorphic(带多态性质的)base ...
- Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ...
随机推荐
- Word中使用代码高亮插件
Word中使用代码高亮插件 1.下载并安装:SyntaxHighlighter4Word.zip 解压,然后双击bin\word2010\Kong.SyntaxHighlighter.Word2010 ...
- 由zImage生成uImage
一.手动使用mkimage命令 mkimage -A arm -O linux -T kernel -C none -a 30007fc0 -e 30007fc0 -n uImage -d /wo ...
- [Swust OJ 404]--最小代价树(动态规划)
题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Des ...
- Android模拟器启动异常
设置系统环境变量的 ANDROID_SDK_HOME为任意一个目录,我的目录:C:\android_avd, 关闭eclipse,然后重新启动eclipse, 删除之前创建的AVD, 然后重新创建,即 ...
- Java-Math
java.lang.Math类提供的方法都是static的,“静态引入 ”使得不必每次在调用类方法时都在方法前写上类名: import static java.lang.Mat ...
- ZOJ 3607 Lazier Salesgirl 贪心
这个题比上个题简单得多,也是超过W时间会睡着,睡着就再也不会卖了,顾客按时间顺序来的,但是可能有顾客同时到(同时到如果醒着就全卖了),并且每个人只买一块面包,也是求最大的W,使得卖出面包的平均价格最高 ...
- django ImageField用法
settings里的设置 PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname('__file__'))) MEDIA_ROOT = ...
- 海量数据处理算法—Bloom Filter
海量数据处理算法—Bloom Filter 1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bl ...
- im 编辑命令总结
一. VIM高亮 进入vim后,在普通模式下输入如下命令,开启php代码高亮显示 :syntax enable :source $VIMRUNTIME/syntax/php.vim 二. ...
- hdu 4885 TIANKENG’s travel(bfs)
题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...