0.三种复合类型: 数组、结构、指针
1.数组被称为复合类型
数组声明应当指出三点:
a.存储在每个元素中的值的类型(typeName)
b.数组名(arrayName)
c.数组中的元素数(arraySize)
声明数组的通用格式:
typeName arrayName[arraySize]
2.让编译器确定数组大小
例如:
a. int things = sizeof things / sizeof (short)
b. int num[] = {1,2,3};
c. char str[] = "I hate C++11"
3.字符串输出的拼接
使用两对引号进行分行拼接
例如:
cout << "I'd give my right ar"
"m to be a great violinist"<<endl;
4.cin读取字符串规则
[普通的]cin使用空白符(空格、制表符、换行符)来确定字符串的结束位置
并且会自动在字符串结尾添加空字符,但是会把空白符遗留在缓冲区!
5.cin面向行的类成员函数
Ⅰ. getline()
该函数读取整行,以换行符来确定输入结尾
调用方法 cin.getline(),有两个参数,数组名,和最多读取的字符数(有回车直接停止)
例如:
cin.getline(Name,20);//最多会读取19个字符!最后一个自动加空白符
注:getline 会读取缓冲区换行符并丢弃,在字符串后加空白符
连续读取方法
例如: cin.getline(name1,Size1).getline(name2,Size2);//连接合并
Ⅱ. get()
带参数的get似getline,但是会留换行符在缓冲区
不带参数的get会读取下一个字符(包括换行)
连续读取方法
例如: cin.get(name,Size).get();//连接合并
6.string 类
使用string对象的方式与使用字符数组相似
string可以自动处理大小,0
例如: string str = "panther";
string strB; cin>>strB;
操作:
a. 赋值、拼接、附加 //对于C-风格需要用 strcpy() 和 strcat()函数
一个string对象可以直接赋值给另一个string对象
例如: str2 = str1;
可以用运算符 + 使得两个string对象合并
例如: str3 = str1 + str2;
可以附加到string对象的结尾
例如:str1 += str2;
b. string 类的其他操作
具有自动调整大小功能!
c.string 类I/O
要注意的是读取一行时,使用方法: getline(cin,strName); //涉及到更深的内容,本章未讲
7.结构体
a. C++允许typedef省略
例如:
struct inflatable
{
char name[20];
float volume;
double price;
std::string test;//可以使得string类成为成员
};
b. C++对结构体的初始化
例如:
inflatable guest =
{
"Glorious Gloria", //name value
1.88, //volume value
29.99 //price value
};
可写在同行 inflatable duck = {"Daphne",0.12,9.98};
补: C++11
I . 允许初始化时 = 缺省
inflatable duck {"Daphne",0.12,9.98};
II. 各个成员设置为0
inflatable mayor {};//inflatable mayor = {};
c. 结构体数组的初始化
例如:
inflatable guests[2] =
{
{ "Bambi",0.5,21.99},
{ "Tony",2000,562.5}
};
8.共用体(union)
能够同时存储不同的数据类型,但是只能同时存储其中的一种类型(某时刻只有一个合法的类型变量),句法与结构体相似,但含义不同
共用体的长度为其最大成员的长度
此处只总结一种常用的 匿名共用体
例如:
struct widget
{
char brand[20];
int type;
union (缺省A)
{
long id_num;
char id_char[20];
}(缺省B);
};
...
widget prize;
...
if(prize.type) cin >> prize.id_num; //使得无需经过变量名B
else cin >> prize.id_char;
9.枚举(enum)//只定义了赋值运算符
例如:
创建新类型: enum spectrum {red,orange,yellow,green};//red,orange..被称为符号常量,对应整数值0~3
可以显式的设置枚举量的值 enum Test {red = 2,orange = 4};
声明变量 : spectrum band;
赋值 : band = red;
band = orange + 1;//等价于 band = yellow
不合法的赋值: band = 0;//不合法
赋的值应该是符号常量
如果int值是有效的,可以通过强制转换来赋值给变量:
band = spectrum(2);
10.指针和自由存储空间(heap 堆)
a. cout显示地址时是16进制数
b. 用 new 来申请内存,返回的是地址
格式:
typeName * pointer_name = new typeName
c. 用 delete 来释放内存
格式:
delete pointer_name
d. 动态数组的创建与释放
格式:
typeName * pointer_name = new typeName[num_elements]
下面两组应当对应
int * pt = new int;
delete pt;
int Size; cin >> Size;
int * ps = new int [Size];
delete [] ps;//否则只是释放了指针指向的元素
注: 对动态数组的地址变化
例如: ps = ps + 1 ,那么 ps[0] 便为原来的 ps[1]
11.三种储存方式:
a.自动储存 auto
b.静态储存 static
c.动态储存 new 和 delete
12.数组的替代品
Ⅰ. 模板类 vector
格式:
vector<typeName> vt(n_elem)
Ⅱ. 模板类 array (C++11)
格式:
vector<typeName,n_elem> arr
注:都可用标准数组法来访问每个元素,其中array和数组一样存放在栈(stack)中,
而vector 存放在堆(heap)中
两中访问方式 vt[21] 等价于 vt.at(21) 但是使用成员函数at() 会花费更多的时间检测是否合法
vector 使用方法 http://blog.csdn.net/hnust_V/article/details/51917852
string 使用方法 http://blog.csdn.net/hnust_v/article/details/51916666