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)的更多相关文章

  1. Effective Objective-C 2.0 学习记录

    由于最近入职,公司安排自由学习,于是有时间将Effective Objective-C 2.0一书学习了一遍.由于个人知识面较窄,对于书中有些内容无法理解透彻,现将所学所理解内容做一遍梳理,将个人认为 ...

  2. Effective Objective-C 2.0之Note.01

    1.在类的头文件中尽量少引入其他头文件 除非确有必要,否则不要引入头文件.一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件.这样做可以尽量降低类之间的耦合(co ...

  3. Effective Objective-C 2.0 Reading Notes

    1. Literal Syntax NSString *someString = @"Effective Objective-C 2.0"; NSNumber *someNumbe ...

  4. 《Effective Objective-C 2.0》 读后总结

    感觉自己最近提升很慢了.然后去找了一些面试题看看.发现自己自大了.在实际开发中,让我解决bug.编写功能,我有自信可以完成.但是对项目更深层的思考,我却没有.为了能进到自己的目标BAT.也为了让自己更 ...

  5. 《Effective Objective-C 2.0》摘要

    前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...

  6. More Effective C++ 条款0,1

    More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...

  7. 1、一、Introduction(入门): 0、Introduction to Android(引进到Android)

    一.Introduction(入门) 0.Introduction to Android(引进到Android) Android provides a rich application framewo ...

  8. Effective ObjectiveC 2.0 Note

    [Effective ObjectiveC 2.0 Note] 1.The memory for objects is always allocated in heap space and never ...

  9. Effective Objective-C 2.0

    Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 作者:Matt Galloway(英) 译者:爱飞翔 出版社:机械工业出版社 出版年:2014-01 ...

随机推荐

  1. POJ 1456(贪心)

    #include <string.h> #include <iostream> #include <queue> #include <stdio.h> ...

  2. Twisted安装

    Debian sudo apt-get install gcc python-dev && sudo pip install twisted CentOS sudo yum insta ...

  3. 常见计算机基础笔试题总结quickstart

    [本文链接] 1. 以下是一颗平衡二叉树,请画出插入键值3以后的这颗平衡二叉树. 分析:考察平衡二叉树的基本操作,插入3变成不平衡,需要节点5右旋一次,节点2左旋一次.. 2. 表达式X=A+(B*( ...

  4. 小项目特供 贪吃蛇游戏(基于C语言)

    C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...

  5. winform,wpf,winrt获取屏幕分辨率

    winform 当前的屏幕除任务栏外的工作域大小     this.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Widt ...

  6. 4.openstack之mitaka搭建glance镜像服务

    部署镜像服务 一:安装和配置服务 1.建库建用户 mysql -u root -p CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* T ...

  7. php 获取IP

    <?php echo 'your ip is :'; if (@$_SERVER["HTTP_X_FORWARDED_FOR"]) $ip = $_SERVER[" ...

  8. HDU 4862 Jump(最小K路径覆盖)

    输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...

  9. codeforces 492B. Vanya and Lanterns 解题报告

    题目链接:http://codeforces.com/problemset/problem/492/B #include <cstdio> #include <cstdlib> ...

  10. vs2010 快捷键大全

    vs2010 快捷键大全 VS2010版快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 ...