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 ...
随机推荐
- Range Sum Query 2D - Mutable & Immutable
Range Sum Query 2D - Mutable Given a 2D matrix matrix, find the sum of the elements inside the recta ...
- poj 2403
http://poj.org/problem?id=2403 题意:就是给你m个单词,以及n段对话.每一个单词都有所对应的价值.求对话中的价值总和 题解:很简单,就是用单词和价值对应起来,然后再寻找就 ...
- mysql 安装和卸载
1.1 上次课内容回顾: MVC案例: * Servlet * 处理请求. * JSP * 显示数据 * JSTL+EL显示数据. * JavaBean * 封装和处理数据 * BeanUtils封装 ...
- 转一篇Xcode中利用target编译不同版本的文章
http://www.cocoachina.com/ios/20160331/15832.html 主要说的是,不用自己定义debug宏,而是在xcode的编译配置文件中,设定debug宏,这样,不用 ...
- ios 使用block中使用self可能产生的循环引用
在block中调用 self,那么就会引起循环引用问题,那么这是为什么呢? 为什么self会对block进行强引用呢???? 这里推荐一篇关于block的专业文章,http://blog.csdn.n ...
- SQL Server 2008登录错误:无法连接到(local)的解决方法
1.服务器类型我们选择了“数据库引擎”时,查找里面的可登录用户名是没有的,下边的服务器名称只显示为“(local)”,连“Windows 身份验证”都无法登录. 如果朋友们和我出错的问题是一样请看下面 ...
- 允许FTP用户登录并禁止Shell登录的方法
最近安装了vsftpd做FTP服务,发现系统用户的登录shell设置为/sbin/nologin,就无法使用FTP服务.网上资料说,vsftpd会为每个FTP登录用户去在/etc/shells中检查对 ...
- codeforces 449B Jzzhu and Cities (Dij+堆优化)
输入一个无向图<V,E> V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...
- Divide and conquer:Sumsets(POJ 2549)
数集 题目大意:给定一些数的集合,要你求出集合中满足a+b+c=d的最大的d(每个数只能用一次) 这题有两种解法, 第一种就是对分,把a+b的和先求出来,然后再枚举d-c,枚举的时候输入按照降序搜索就 ...
- Valentine's Day Round 1001.Ferries Wheel(hdu 5174)解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1] ...