1.早捆绑(early binding)与晚捆绑(late binding)
- 早捆绑:编译器会对特定的函数名产生调用,而连接器将这个调用解析为要执行代码的绝对地址。在OOP中,直到程序运行时,编译器才能确定执行代码的地址。
2.vitual关键字
- vitual关键字表明它希望某个函数有晚捆绑的灵活性(并不需要懂得virtual使用的机制,但是没有它,我们就不能用C++进行面向对象的程序设计)。
- 默认成员函数不能动态捆绑,故需添加virtual关键字
3.创建和销毁对象
- 栈:C++把效率控制作为最重要的问题,为了最大化运行速度,通过将对象存放在栈(栈是内存中的一个区域,可以直接由微处理器存放数据)中或静态存储区域(内存固定块)中,存储和生命期可以在编写程序时确定。但这牺牲了灵活性。
- 堆:区域动态创建对象。new关键字在堆上生成,delete关键字在堆上释放。因为堆是在运行时动态管理,所以在堆上分配内存比在栈上创建存储的时间长得多(在栈上创建存储常常只是一条向下移动栈指针的微处理器指令,另外一条是移回指令)。
- 生命周期对比:在栈或静态存储上创建一个对象,编译器决定这个对象持续多长时间并能自动销毁它;在堆上创建对象,编译器则不知道它的生命周期
4.C++对C的改进
在C++中,程序员必须先声明函数,使编译器能检查它们的使用。预处理器也限制了值替换和宏,减少了查找错误的困难。
5.解释器与编译器
- 解释器将源代码转化成一些动作(它可由多组机器指令组成)并立即执行这些动作。
- 编译器直接把源代码转化成汇编语言或机器指令。为了提高编译速度,一些编译器采用了内存中编译。大多数编译器,编译时每一步都要读写文件。内存中编译器就是将编译器程序存放在RAM中。
6.声明与定义:
- external关键字:表示变量是在文件以外定义的,或在文件后面部分才定义
//Declaration & definition examples
extern int i ; // Declaration without definition
extern float f(float); // Function declaration
float b; // Declaration & definition
flaot f(float a) {
// Definition
return a + 1.0;
}
int i; // Definition
int h(int x) {
// Declaration & definition
return x + 1;
}
7.标准C++ include语句格式
- 去掉.h:#include <iostream.h> 可写为 ** #include< iostream>**
- 在文件名前加字母c:#include <stdio.h> 可写为 ** #include< cstdio>**
- 过去的 #include <iostream.h> 相当于
#include < iostream> using namespace std;
8.字符数组的拼接
C预处理器的一个重要功能是可以进行字符数组的拼接。如果两个加引号的字符数组邻接,并且它们直接没有标点,编译器就会把这些字符数组连接成单个字符数组。
cout >> "This is far too long to"
“single line but it can broken up with”
"arrays.\n"
补充:
- 字符串string类是设计来处理(并隐藏)对字符数组的初级操作
- 字符串的Initialization:1) string s1 = “Hello”; 2) string s2(“I am”);
- string具有动态性,不必担心string的内存分配
9.文件的读写:fstream & getline
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, const char * argv[]) {
ifstream in("test.cpp"); //Create a reading file object, and open it for reading
ofstream out("test2.cpp"); //Create a writing file object, and open it for writing
string s;
//getline(ifstream, stream)把一行读入到string对象中(以换行符结束)
while (getline(in, s)) {
//getline()并不读换行符\n
out << s << "\n"; // ..must add it back
}
}
注释: while(in >> word) // 每次取1个单词
10.vector类
- vector类是一个模板,可用于不同的类型。若定制只装string对象的vertor,则使用vector。
- 添加新元素:1) push_back():向容器尾部添加元素;2) push_front:向容器头部添加元素
- 获取元素:向数组一样使用(vector[i]) 【容器的长度:vector.size()】
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//使用vector容器存储并输出数据
int main(int argc, const char * argv[]) {
vector<int> v;
for(int i = 0; i < 10; i++)
v.push_back(i);
for(int i = 0; i < v.size(); i++)
cout << v[i] << ",";
cout << "\n" << endl;
}