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 ...
随机推荐
- Course Schedule I & II
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- poj 1010
http://poj.org/problem?id=1010 题意:给你n种邮票的价值,到0结束,这些邮票价值有可能相同,但是形状是不同的. 还有给你m个收藏家所需要收藏的邮票的总价格.到0结束. 每 ...
- poj3341
AC自动机,用40^4 * 50 * 10的空间进行dp. 最大的难点在于hash. hash一个数列f,数列中的每一位都有一个上限g,即f[i]<=g[i]. 那么可以将该数列hash为这样一 ...
- perl运行其他程序的5种方法
1.使用system函数 运行成功,返回0,运行失败则返回非负整数 system("cmd"); 2.使用qx my $cmd1=qx/date/; 3.使用`` 与qx等效 4. ...
- VC++ LoadLibrary失败,错误126(找不到指定的模块)
在VS中调用一个资源模块dll,LoadLibrary返回值为NULL,没有加载成功.GetLastError后原因为"找不到指定的模块"!代码如下: HINSTANCE hIns ...
- codeforces 505A. Mr. Kitayuta's Gift 解题报告
题目链接:http://codeforces.com/problemset/problem/505/A 题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母 ...
- linux查看系统版本和系统位数
1. uname -a you will view kernel name.network node hostname.kernel release.kernel version.machine h ...
- IOS - 响应者链条
简单来说就是:一级一级的找到响应的视图,如果没有就传给UIWindow实例和UIApplication实例,要是他们也处理不了,就丢弃这次事件... 对于IOS设备用户来说,他们操作设备的方式主要有三 ...
- Jquery 点击按钮将其背景图换成另一张,再次点击恢复默认图片
这是Jquery代码: $(function () { $("#h1").toggle(function () { $("#h1").css("bac ...
- php策略模式的研究
<?php abstract class Moshi{ private $num; public $price; const Ted=1; const Sed=2 ...