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 = 1;
    while ((number /= 10) != 0) ++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 = 0, 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(28);                         //根据 int 28 建立一个B,函数的 bool 参数缺省为 true 

doSomething(28);                     //错误!doSomething应该接受一个B而非一个int,而int至B之间并没有隐式转换

doSomething(B(28));                  //使用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

时间: 2024-07-31 16:47:34

Effective C++ 之 0 导读(Introduction)的相关文章

Effective Objective-C 2.0重读笔记---1

上次看这本书的时候匆匆走了一遍,最近不太忙,重温了一遍,把笔记写出来~.. 有兴趣的可以去买一本,感觉这本书还是挺不错的 由于大部分是在坐车的时候用手机写的,所以代码很少,图也很少 1. 尽量使用向前声明,延后引入头文件的时间,这样可以减少编译时间2. 使用arraywithobjects:....如果遇到为空的变量,就会自动终止,后面的变量便会添加不上,切不会报错,会造成数据不一致问题,所以尽量使用字面量语法创建相关对象,减少出错且减少代码量3. 使用字面量创建的对象都是不可变的,如果要获得可

编写高质量的iOS代码--Effective Objective-C 2.0 读书笔记

编写高质量的iOS代码--Effective Objective-C 2.0 读书笔记 这本书年初刷完,感觉不错,介绍了很多小点,都是平日不怎么关注的. 第1章 熟悉Objective-C 这章没什么好介绍 第1条:了解Objective-C语言的起源 第2条:在类的头文件中尽量少引入其他头文件 第3条:多用字面量语法,少用与之等价的方法 第4条:多用类型常量,少用#define预处理指令 要理解为啥要少用#define预处理指令. 然后具体用哪个, 自己定吧 第5条:用枚举表示状态.选项.状态

Effective Objective-C 2.0 笔记三(Literal Syntax简写语法)

当使用Objective-C的时候,你总会遇到Foundation 框架中的一些类,这些类包括NSString,NSNumber,NSArray和NSDictionary,这些数据结构都是自解释的. Objective-C以简明详细的语法而著名,自从oc1.0有一个简单的方式定义一个NSString变量,我们可以这样声明一个字符串变量 NSString *[email protected]"Hello Lves"; 没有这种语法之前,我们创建一个字符串变量需要先alloc然后init.

《Effective Objective-C 2.0》—(第1-5条)—熟悉Objective-C

Objective-C通过一套全新的语法,在C语言基础上添加了面向对象特性.OC的语法中频繁使用中括号([  ]),而且不吝于写出极长的方法名,这通常令许多人觉得此语言较为冗长.这是这样写出来的代码非常易读,只是C++和Java程序员不太适应. OC语言学起来很快,但有很多微妙细节需要注意,而且还有许多容易为人所忽略的特性.另一方面,有些开发者并未完全理解或是容易滥用某些特性,导致写出来的代码难以维护,难以调试.本章讲解基础知识,后续各章语言及其相关架构的各个特定话题. 第1条:了解OC语言的起

《Effective Objective-C 2.0》—(第6-10条)—对象、属性、equalToString、关联对象

用OC等面向对象语言编程时,"对象"(object)就是"基本构造单元"(building block),开发者可以通过对象来存储并传递数据.在对象之间传递数据并执行任务的过程就叫做"消息传递"(Messaing). 当应用程序运行起来以后,为其提供相关支持的代码叫做"Objective-C运行期环境"(Objevtive-C runtime),它提供了一些使得对象之间能够传递消息的重要函数,并且包含创建类实例所用的全部逻辑.

《Effective Objective-C 2.0》—(第11-14条)—运行时动态绑定、objc_msgSend、消息转发机制

第11条:理解objc_msgSend的作用 在对象上调用方法是OC中经常使用的功能.用OC术语来说这叫做:"传递消息"(pass a message).消息有"名称"(name)或者"选择子"(selector),可以接收参数,而且可能还有返回值. 由于OC是C的超集,所以最好理解C语言的函数调用方式.C语言使用"静态绑定",就是说在编译期就能决定运行时所应调用的函数.以下列代码为例: #import <stdio.h

《Effective Objective-C 2.0》—(第15-22条)—接口与API设计、深拷贝、浅拷贝

第15条:用前缀避免命名空间冲突 Objective-C没有其他语言内置的命名空间(namespace)机制.如果发生命名冲突程序连接时候,出现以下错误: duplicate symbol _OBJC_METACLASS_$_EOCTheClass in: build/something.o build/something_else.o duplicate symbol _OBJC_CLASS_$_EOCTheClass in: build/something.o build/something

《Effective Objective-C 2.0》—(第23-28条)—类别、协议,代理,匿名对象、delegate

第23条:通过委托与数据源协议进行对象间通信 对象之间经常需要相互通信,而通信方式有很多.OC开发者广泛使用一种名叫"委托模式"(Delegate Pattern)的编程设计模式来实现对象间的通信,该模式的主旨是:定义一套接口,某对象若想接收另一个对象的委托,则需遵从此接口,以便称为"委托对象"(delegate).而这"另一个对象"则可以给其委托对象回传一些信息,也可以在发生相关联时间时通知委托对象. 此模式可以将数据与业务逻辑解耦. 在Obj

Effective Objective-C 2.0重读笔记---2

1. 很多时候我们需要保证读写数据的安全性,这时候最好不要使用@synchronized同步块,因为同步块中的代码必须单独执行,这有可能会使当前的代码等许多无关的代码执行完毕才能继续执行,降低程序运行效率.此外还有NSLock ,NSRecursiveLock这些锁,但是这些锁也应该少用, 最好的办法就是用GCD队列保证数据的安全性,而且GCD基于XUN内核,提供了很多底层优化 dispatch_queue_t serialQ = dispatch_queue_create("testGCDQu