第一章 对象导言
主要介绍了什么是C++语言、OOP的基本思想。
对于C++的基本内容给出了一些介绍,并建议对比C++、Java、Python语言,更好的理解面向对象的思想
这里提到了XP编程,尤其建议测试驱动开发与结对编程
另外,这里两次提到了重载,分别是Overriding & OverLoading
Overriding指子类对父类的成员函数的不同实现
Overloading指相同的函数名称,不同的参数
第二章 对象的创建与使用
C++语言主要的设计目的是:
辅助进行大型软件开发,追求运行速度快(因此 C++只进行静态类型检查)
声明(Declatation)与定义(Definition)的区别:
声明:告诉编译器一个标识符,“这个函数或变量他的模块像什么”
定义:告诉编译器,“在这里建立变量或函数”,它为名字分配存储空间
标准C++的include
#include <iostream>
由于不同的编译器厂商选用了不同的文件扩展名,不同OS对文件名的限制不一致,标准C++统一去掉了文件扩展名
注意:新的包含格式与老的效果不一样,使用.h的文件是老的、非模板化的版本,而没有.h的文件是新的模板化版本。如果在同一程序中混用这两种形式,可能会遇到问题。
注:可以使用perl或Python可自动完成为程序员库打包的一部分工作,可参考www.Perl.org或www.Python.org
名字空间: using namespace std;
所有标准C++库都封装在一个名字空间中,即std。 上面语句意味着打开std名字空间,使它的所有名字都可用
如果使用#include <xx.h>,编译器会自动添加using namespace std语句
Vector
vector是一个模板 (template),它可以有效地用于不同的类型。我们可以创建Shape的vector、CFile的vector、string的vector.用模板几乎可以创建任何事物的类
吧类型命输入到尖括号内,让编译器知道vector所用的类。 所以string的vector表示为 vector<string>,如果想在这个vector中加入其他类型,编译器会报错
第三章 C++中的C
C++的引用与指针仅仅是语法上的不同表达方法,这个有时候也会称为“语法糖”。在函数语言中常用到这个概念。
静态变量:
静态变量与普通变量的区别有两个主要方面:一是变量的初始化静态变量只会初始化一次,普通局部变量每次函数执行后都会初始化;二是变量的作用域不同,static变量限定了本文件或本函数才能访问。而对于头文件的static全局变量,是C++语法中不推荐的使用方法。
static对函数的修饰作用与变量相似,static修饰class,后面给出。
显示类型转换:
static_cast, const_cast, dynamic_case, reinterpret_cast
double dvar = 3.14159265;
long lvar = static_cast<long>(dvar);
make文件编写:
这块的东西较多,书上介绍的不多,网上有很多资料
第四章 数据抽象
C++的struct:
与C的语法不同,C++可以在struct内部定义函数,一个struct可以没有任何数据成员而存在函数,这个语法的实现就是class的基础。
为了解决访问struct的函数的功能,C++引入了::操作符。
C++编译器:
最早的C++编译器cfront 由AT&T开发,它输出的是C代码,然后再由C编译器编译。 所以,必然有方法用C语言描述C++语法。
头文件:
头文件中,不能使用 using directive指令,这会引起意外的关闭namespace
第五章 隐藏实现
友元:
友元是为了允许显示的不属于当前结构的一个函数或其它对象访问当前结构中的数据。
友元定义的要求:友元必须在一个结构内声明。如:(注意X和Y的声明顺序)
class & struct:
各方面都是一样的,除了class的成员默认是private的,struct成员默认是public的。
第六章 初始化与清楚
封装和访问控制在改进库的易用性与安全性方面取得了重大进展,安全性包括初始化和清楚两个方面。
构造函数:
当才C++编译器对对象分配内存的时候,悄悄地在对象的定义处插入了构造函数调用,传递到构造函数的第一个参数就是this指针,this指针指向一段没有初始化的地址,构造函数的作用就是初始化该内存块。
C++ 中,定义和初始化是集为一体的,不能只取其一。
构造函数和析构函数没有返回类型(与返回值是void的还不一样)
默认构造函数:
当且仅当,一个结构中(class or struct)没有构造函数时,编译器会自动创建一个,但是编译器创建的构造函数的作用仅仅时可以定义对象。一般我们还是要自己来定义构造函数。
析构函数:
析构函数不带任何参数
当对象超出其作用域时,编译器自动调用析构函数。注意:setjmp()和longjmp()构成的非局部跳转(nonlocal jump),可能导致析构函数不会执行。
其它:
require.h可用来检视程序员的错误,代替函数assert(),asert()对失败操作的输出不及require(),具体怎么用??
int a[5] = {1,2}; //第1、2个参数根据显示给出的定义,其余补零
int b[5]; //初始化情况不可预料