Effective C++ 之 0 导读(Introduction)
Effective C++
导读 (Introduction)
术语(terminology)
声明式 (declaration) 是告诉编译器某个东西的名称和类型(type),但略去细节。以下都是声明式:
extern int x; //对象(object)声明式
std::size_t numDigits(int number); //函数(function)声明式
class Weight; //类(class)声明式
template<typename T> //模板(template)声明式
每个函数的声明式揭示其签名式(signature),也就是参数和返回类型.一个函数的签名等同于该函数的类型.
定义式 (definition) 的任务是提供编译器一些声明式所遗漏的细节。对对象而言,定义式是编译器为此对象拨发内存的地点。对 function 或 function template 而言,定义式提供了代码本体。对 class 或 class template 而言,定义式列出它们的成员:
int x; //对象的定义式
std::size_t numDigits(int number) //函数的定义式
{ //此函数返回其参数的数字个数
std::size_t digitsSoFar = ;
while ((number /= ) != ) ++digitsSoFar;
return digitsSoFar;
}
calss Widget { //class的定义式
public:
Widget();
~Widget();
...
};
template<typename T> //template的定义式
初始化(Initialization)是“给予对象初值”的过程。对用户自定义类型的对象而言,初始化由构造函数执行。
default 构造函数是一个可被调用而不带任何实参者。这样的构造函数要不没有参数,要不就是每个参数都有缺省值:
class A {
public:
A(); //default构造函数
};
class B {
public:
explicit B(int x = , bool b = true); //default构造函数
};
class C {
public:
explicit C(int x); //不是default构造函数
};
上述的 class B 和 C 的构造函数都被声明为 explicit,这可阻止它们被用来执行隐式类型转换(implicit type conversions), 但它们仍可被用来进行显示类型转换(explicit type conversions):
void doSomething(B bObject); //函数,接受一个类型为B的对象 B bObj1; //一个类型为B的对象
doSomething(oObj1); //传递一个B给doSomething函数
B bObj2(); //根据 int 28 建立一个B,函数的 bool 参数缺省为 true doSomething(); //错误!doSomething应该接受一个B而非一个int,而int至B之间并没有隐式转换 doSomething(B()); //使用B构造函数将int显示转换(也就是转型,cast)为一个B以促成此一调用
被声明为 explicit 的构造函数通常比其 non-explicit 兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。
copy 构造函数被用来“以同型对象初始化自我对象”,copy assignment 操作符被用来“从另一个同型对象中拷贝其值到自我对象”:
calss Widget {
public:
Widget(); //default 构造函数
Widget(const Widget& rhs); //copy 构造函数
Widget& operator=(const Widget& rhs); //copy assignment 操作符
...
};
Widget w1; //调用 default 构造函数
Widget w2(w1); //调用 copy 构造函数
Widget w3 = w2; //调用 copy 构造函数 !
w1 = w2; //调用 copy assignment 操作符
区分“copy构造”和“copy赋值”:
如果一个新对象被定义,一定会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义,就不会有构造函数被调用,那便是赋值操作被调用。
命名习惯(Naming Conventions)
参数名 lhs (left-hand side) 和 rhs (right-hand side)用于二元操作符函数如 operator== 和 operator* 的参数名称.对于成员函数,左侧实参由 this 指针表现出来, 所以单独使用参数名称 rhs.
将”指向一个 T 型对象”的指针命名为pt, 意思是”pointer to T”. 如 pw = “ptr to Widget”. 而 rw 可以表示 reference to Widget.
关于线程(Threading Consideration)
TR1 和 Boost
Effective C++ 之 0 导读(Introduction)的更多相关文章
- Effective Objective-C 2.0 学习记录
由于最近入职,公司安排自由学习,于是有时间将Effective Objective-C 2.0一书学习了一遍.由于个人知识面较窄,对于书中有些内容无法理解透彻,现将所学所理解内容做一遍梳理,将个人认为 ...
- Effective Objective-C 2.0之Note.01
1.在类的头文件中尽量少引入其他头文件 除非确有必要,否则不要引入头文件.一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件.这样做可以尽量降低类之间的耦合(co ...
- Effective Objective-C 2.0 Reading Notes
1. Literal Syntax NSString *someString = @"Effective Objective-C 2.0"; NSNumber *someNumbe ...
- 《Effective Objective-C 2.0》 读后总结
感觉自己最近提升很慢了.然后去找了一些面试题看看.发现自己自大了.在实际开发中,让我解决bug.编写功能,我有自信可以完成.但是对项目更深层的思考,我却没有.为了能进到自己的目标BAT.也为了让自己更 ...
- 《Effective Objective-C 2.0》摘要
前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
- 1、一、Introduction(入门): 0、Introduction to Android(引进到Android)
一.Introduction(入门) 0.Introduction to Android(引进到Android) Android provides a rich application framewo ...
- Effective ObjectiveC 2.0 Note
[Effective ObjectiveC 2.0 Note] 1.The memory for objects is always allocated in heap space and never ...
- Effective Objective-C 2.0
Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 作者:Matt Galloway(英) 译者:爱飞翔 出版社:机械工业出版社 出版年:2014-01 ...
随机推荐
- 【GoLang】GoLang 的流程与函数
003.GO流程与函数 1 概述 1.1 Go中流程控制分三大类:条件判断,循环控制和无条件跳转 2 流程 2.1 if 2.1.1 if条件判断语句中不需要括号 2.1.2 条件判断语句里面允许声明 ...
- JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于Jav ...
- SQL查询表中的有那些索引
方法1. 使用系统表 -- 查询一个表中的索引及索引列 USE AdventureWorks2008 GO SELECT indexname = a.name , tablename = c. n ...
- FileUpload1上传控件
<asp:FileUpload ID="FileUpload1" runat="server" /> string fn = System.IO.P ...
- poj 1011
http://poj.org/problem?id=1011 这是一道POJ的搜索的题目,最开始确实难以理解,但做过一些搜索的题目后,也没那么难了. 大概题意就是,现在有N根木头,要拼成若干根木头,并 ...
- struts2 插件使用
1.引用这个jar包 2.http://localhost:8080/strute2demo/config-browser/actionNames.action
- poj1177
题意:在平面直角坐标系内给出一些与坐标轴平行的矩形,将这些矩形覆盖的区域求并集,然后问这个区域的周长是多少.(边与边重合的地方不计入周长) 分析:线段树.曾经做过类似的求矩形覆盖的总面积的题.这道题同 ...
- 13.SpringMVC和Spring集成(一) && 14.SpringMVC和Spring集成(二)
1.概念 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,Spring致力于J2EE应用的各层的解决方案,Spring是企业应用开发的“一站式”选择,并贯 ...
- eclipse添加字体
1.打开window—>Preferences—>General—>Appeatance—>Colors and Fonts—>Text Font—>Edit 2. ...
- ZOJ 3812 We Need Medicine(dp、背包、状态压缩、路径记录)
参考:http://blog.csdn.net/qian99/article/details/39138329 参考的链接里说明得很好,注释也很好...thanks for sharing 朴素的想法 ...