读书笔记-----C++ 0229

来源:互联网 发布:马士兵java视频过时吗 编辑:程序博客网 时间:2024/06/06 11:01

pass:

public继承意味着is-a,virtual函数意味着接口必须被继承,non-virtual函数意味着接口和实现都必须被继承。


public继承意味着is-a是以C++进行对象编程最重要的一个规则,假设A为基类,B为派生类,在is-a关系中,每个B都是A,反之则不成立,可以用数学中的关系表达,就是B集合属于A集合。

派生类中的名称会掩盖基类中的名称(名称遮掩规则)

有三句话很重要:纯虚函数的目的是让派生类只继承接口,虚函数(非纯虚函数)的目的是让派生类继承该函数的接口和缺省实现,非虚函数的目的是令派生类继承函数的接口及一份强制性实现。


使用公有继承时,类可以继承接口,可能继承实现(基类的纯虚函数提供接口,但不提供实现)。获得接口的是is-a关系的组成部分。而使用组合,类可以获得实现,但不能获得接口。不继承接口是has-a关系的组成部分


除非有好的理由允许构造函数被使用于隐式类型转换,否则把它声明为explicit会更好,被声明为explicit类型的构造函数禁止编译器执行非预期的类型转换。

       在传递用户自定义类型时,按引用传递比按值传递要好,传递内置类型(C-like)时和使用STL的迭代器和函数对象时,按值传递比较好。

       在程序中尽量不要有带有不明确行为的代码。

       在《Effective C++》一书中,将C++分为四个次语言组合成的高级语言是一个很好的划分办法,有助于对C++的理解,这四个次语言如下:

       1C,包括区块、语句、预处理器、内置数据类型、数组、指针等;

2Object-Oriented C++,也就是C with classes,包括class、封装、继承、多态、虚函数等;

       3Template C++,这是C++泛型编程部分,Template带来了TMP(模板元编程)这一崭新的编程范型。

       4STL。

 

C++中尽量以const、enum、inline替换#define,因为#define不被视为语言的一部分,所以可能会引起一些难以预料的问题,以#define定义的常量可能不会被编译器看到,而const常量作为一个语言常量是肯定会被编译器看到的,用const定义常量能产生更少的码。#define不能提供任何封装性,但是const成员变量可以被封装的。

const int LEN =5;

const char *const pa = “hello”;

对于单纯常量最好用const对象或enums替换#defines。

对于形似函数的宏最好用inline函数替换#defines。

下面两种表示方法的意义相同:

viod f1(constWidget * pw);

void f2(Widgetconst *pw);


原创粉丝点击