这本书确实不错,非常推荐看一看。
第1章 预备知识
1. C++ 简史
Pascal语言是1968年推出的,C是1969年推出的。这两种语言都是结构化编程的典范。
2. C++与通用编程
3. C++起源
4. 可移植性与标准
第2章 开始学习C++
1. 变量声明
2. 使用库函数
头文件的作用是提供函数原型,这样程序就能够编译生成正确的目标文件,这样在链接的时候才有可能连接到正确的文件,但是有时链接器却无法找到正确的链接路径,这就需要给出具体的搜索路径了。
例如:在linux中,对于标准的输入输出函数是在libc.a库中,链接器会自动找到并链接,但是对于数学库它不是标准库组成部分,在libm.a链接的时候需要利用-lm指明
第4章 复合类型
1. 数组类型
2. 每次读入一行字符串
3. 指针与C++基本原理
面向对象编程与传统的过程编程的区别在于,OOP强调的是在运行阶段(而不是编译阶段)进行决策。运行阶段是指程序正在运行时,编译阶段指的是编译器将程序组合起来时。
int *pt;
pt=(int*)0xB8000000;
4. 栈,堆和内存泄露
第5章循环和关系表达式
1. 表达式
C++表达式是值或值与操作符的组合,每个C++表达式都有值。
2. C风格字符串的比较
第9章 内存模型和名称空间
1. 函数和链接性
2. 语言链接性
3. 匿名名字空间
C++比较推荐使用匿名名字空间来替代链接性为内部的静态变量。
C++标准不赞成在名称空间和全局作用域中使用关键字static。
第10章 对象和类
第11章 使用类
1. 类型转换
2. 在main函数之前调用bootstrap函数
第12章 类和动态分配
1. 隐式成员函数
2. 在构造函数中使用new操作符
3. 返回对对象的一些说明
4. 指针和对象小结
5. 布局new操作符(定位new表达式《C++primer》第三版)
通常,new负责在堆内存中找到一个能够满足要求的内存块。new操作符还有一种变体:placement new 操作符,它能让你指定要使用的内存的位置。 程序员可以使用这种特性来设置其内存管理规程或处理需要通过特定地址进行访问的硬件。要使placement new,首先需要包含头文件new。
用new 布局操作分配时都是从最开始地址分配的.如下:
int *p3=new (buffer) int[20];
此时p3的地址空间和p2的地址空间是一样的.不过可以通过改变初始的地址来改变分配空间地址 如:
int *p4=new (buffer+20*sizeof(int)) int[20];
此时p4的地址就和上面的不重叠了.
这儿需要注意的是delete可与常规new操作符配合使用,而不能与布局new操作符配合使用。所以不用delete释放p3或p4,而只需释放buffer的空间即可:如果buffer是在静态区申请的空间,那么不需要释放,程序自动释放,如果buffer是动态申请的空间,要使用delete释放即可。
这儿所使用的是内置类型,如果使用对象的时候又出现新的问题。因为对象牵扯到析构函数的调用的问题。
一般情况下,静态分配的对象,系统是自动调用析构函数,而对于建立在堆上的对象,系统是不自动调用析构函数的。常见的就是利用new来动态分配对象的时候,这种情况下在利用delete来释放内存空间的时候,析构函数会自动的被调用。一种罕见的例外是使用布局new的时候,需要我们显示的调用析构函数。
如:pc3->~JustTesting();
pc1->~JustTesting();
第13章类继承
1. 虚拟成员函数与动态联编
2. 虚函数注意事项
3. protected的使用:单例模式
4. 继承与动态内存分配
继承是怎样与动态内存分配进行互动的呢?例如,如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现呢?这个问题的答案取决于派生类的属性。如果派生类也使用动态内存分配,那么就需要学习几个新的小技巧。下面来看看这两种情况:
(1)派生类不使用new
派生类是否需要为显示定义析构函数,复制构造函数和赋值操作符呢?
不需要!
首先,来看是否需要析构函数,如果没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数。实际上,派生类的默认构造函数总是要执行一些操作:执行自身的代码后调用基类析构函数。因为我们假设派生类的成员不需要执行任何特殊操作,所以默认析构函数是合适的。
再看复制构造函数。默认复制构造函数执行成员复制,这对于动态内存分配来说是不合适的,但对于新的派生类的成员来说是合适的。因此只需要考虑继承的基类的对象。要知道,成员复制将根据数据类型采用相应的复制方式,因此复制类成员或继承的类组件时,则是使用该类的复制构造函数完成的。所以派生类的默认复制构造函数使用基类的显示复制构造函数来复制派生类对象的基类成员部分。因此,默认复制构造函数对于新的派生类而言是合适的。
对于赋值来说,同样道理。
(2).派生类使用new。
当基类和派生类都采用动态内存分配时,派生类的析构函数,复制构造函数以及赋值操作符都必须使用想用的基类方法来处理基类元素。这种要求是通过三种不同的方式来满足的。
- 对于析构函数,这是自动完成的;
- 对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的;如果不是这样做,将自动调用基类的默认构造函数。
- 对于复制操作符,这是通过使用作用域解析操作符显示的调用基类的赋值操作符来完成了。
5.C++类函数总结
第14章 C++中代码重用
1. 多重继承与虚基类
第15章 友元、异常和其他
1. 友元成员函数
这儿涉及到类的前向声明
2. 堆栈解退
3. RTTI运行时类型识别
第17章 输入、输出和文件
1. 读取字符和字符串
2. 二进制文件和文本文件