C++预备知识
一、简介
C++融合了3种不同的编程方式,C语言代表的过程性语言、C++在C语言基础上添加的类代表的面向对象语言、C++模板支持的泛型编程。
C++与C语言一样都是起源于贝尔实验室,于20世纪80年代被创造出来。
二、头文件
头文件类型 | 约定 | 示例 | 说明 |
---|---|---|---|
C++旧式风格 | 以.h结尾 | iostream.h | C++程序可以使用 |
C旧式风格 | 以.h结尾 | math.h | C、C++程序可以使用 |
C++新风格 | 没有扩展名 | iostream | C++程序可以1使用,使用namespace std |
转换后的C | 加上前缀c,没有扩展名 | cmatch | C++程序可以使用,可以使用而不是C的特性,如namespace std |
三、处理数据
面向对象编程(OOP)的本质是设计并扩展自己的数据类型。
宽字符类型
wchar_t bob = L'P';
wcout << L"tall" << endl;
char16_t 和 char32_t
char16_t ch1 = u'q';
char32_t ch2 = u'\U0000222B';
C++类型转换
int(a)
R"+* 字符串+*"
cout << R"+*("Who wouldn't?)",she whispere.)+*" << endl;
四、符合类型
结构体可以省略struct
struct inflatable
{
char name[20];
float volume;
double price;
};
inflatable hat;
结构体和共用体:
struct widget
{
char brand[200];
int type;
union id
{
long id_num;
char id_char[20];
}id_val;
};
...
widget prize;
...
if(prize.type == 1)
cin >> prize.id_val.id_num;
else
cin >> prize.id_val.id_char;
由于公用体是匿名的,因此id_num和id_char被视为prize的两个成员。他们的地址相同
struct widget
{
char brand[200];
int type;
union
{
long id_num;
char id_char[20];
}id_val;
};
...
widget prize;
...
if(prize.type == 1)
cin >> prize.id_num;
else
cin >> prize.id_char;
枚举类型
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
spectrum band;
band = spectrum(3);
枚举的取值范围:
上限:假设最大的值是101。在2的幂中,比这个数的的最小值是128,因此取值范围上限为:127;
下限:如果不小于0,则下限是0
如果最小值是-6,而比他小的2的幂是-8,因此下限为-7;
五、指针和自由空间
计算机程序在存储数据时必须跟踪的3种基本属性:信息存储在何处、存储的值为多少、存储的信息是什么类型。
在编译时给数组分配内存被称为静态联编。但使用new时,如果在运行阶段需要创建数组,则创建他,如果不需要则不创建。这被称为动态联编。
new和delete
- 不要使用delete来释放不是new分配的内存。
- 不要使用delete释放同一个内存块两次。
- 如果使用new[]为数组分配内存,应使用delete[]来释放。
- 如果使用new为一个专门的实体分配内存,应使用delete(没有方括号)来释放。
- 对空指针应用delete是安全的。
数组名和指针的区别
可以修改指针的值,但是能修改数组名的值,数组名是常量。
对数组名应用sizeof运算符得到的是数组长度,对指针应用sizeof得到的是指针的长度。
六、数组的地址
对数组名取地址时。数组名也不会被解释为其地址。数组名被解释为第一个元素的地址,而对对数组名取地址得到的时整个数组的地址
short tell[10];
cout << tell << endl; // displays &tell[0]
cout << &tell << endl; // displays address of whole array
从数字上说,这两个地址相同;但从概念上说,&tell[0](即tell)是一个2个字节的地址,而&tell是一个20字节的内存块的地址。因此,表达式tell+1将地址加2,而表达式&tell+1将地址加20。换句话说,tell是一个short指针(*short),而&tell是这样一个指针,即指向包含着20个元素的short数组(short(*)20)。
一般情况,如果给cout提供一个指针,将打印他的地址。但是如果指针的类型为char*,则cout将显示指向的字符串。如果想要显示字符串的地址,则必须见这种指针转换为另一种指针类型,如int*。