第二篇
基本语言 C++数据类型
1. 字节(byte)8位和字(word)32位——〉64位发展,依赖于机器(machine-dependent)
2. 类型抽象使我们能够对一个定长的位序列进行有意义的解释。
3. 字符型char 通常用来表示单个字符和小整数,它可以用一个机器字节来表示
int(一个机器字)short(半个机器字)long(一个或两个机器字)
float(一个字)double(两个字)long double(三个或四个字)
4. 文字常量是不可寻址的(nonaddressable)
8进制0前缀;16进制0x或0X
文字常量后加L或l,表long;加U或u,表无符号数——fFlL这四个后缀只用于十进制中
转义序列以反斜扛开头/
字符文字前加L,表宽字符文字,类型为wchar_t,用于支持如汉语日语这些语言的字符集合。如L’a’
字符串文字可以扩展到多行,在一行的最后加上一个反斜杠,表明字符串文字在下一行继续。前加L,表常量宽字符的数组。
没有任何修饰的3.14为double型,
3.14f
单精度浮点型,
3.14L
多精度浮点型
5. 变量:提供一个有名字的内存存储区,可以通过程序对其进行读、写和处理。
可寻址,有两个值与它关联
1)它的数据值,存储在某个内存地址中,对象的右值(rvalue),即被读取的值
2)它的地址值,存储数据值的那块内存的地址,变量的左值(lvalue),即位置值
变量的定义会引起相关内存的分配,一个对象只有一个位置,所以只能被定义一次,可以通过声明来使其他程序知道该对象的存在。
对象声明的作用是使程序知道该对象的类型和名字,由关键字extern及跟在后面的对象类型以及对象的名字构成。声明不是定义,不会引起内存分配。
C++关键字
6. 变量的两种初始化
1)显式是用赋值操作符
2)用括号。如 string project ( “Fantasia 2000” );
7. 指针的典型用法是构建一个链接的数据结构,例如树和链表,并管理在程序执行过程中动态分配的对象,以及作为函数参数类型,主要用来传递数组或大型的类对象。
8. 当指针持有0值时,表明它没有指向任何对象,或持有一个同类型的数据对象的地址。
int *pi = 0;//pi被初始化为没有指向任何对象
指针不能持有非地址值
指针不能被初始化或赋值为其他类型对象的地址值
9. 空(void *)类型指针,它可以被任何数据指针类型的地址值赋值(函数指针不行),不能操作空类型指针所指向的对象,只能传送该地址值或将它与其他地址值作比较。
10. 指针的算术运算(pointer arithmetic)。指针加2意味着给指针持有的地址值增加了该类型两个对象的长度。
11. 某些指针的使用准则:总是将指针初始化,不要无视编译器发出的错误信息或警告信息如“强制转换为指针变量(explicit casts to pointer variables)”等等
12. string类型能够自动将C风格的字符串转换成string对象
string s1;
const char *pc = “a character array”;
s1 = pc;
但是反向的转换不能自动执行。
begin()和end()操作返回指向string开始和结束处的迭代器(iterator,是指针的类抽象)
p82
13. const类型限定修饰符,能把一个对象转换成一个常量,在程序中任何改变这个值的企图都将导致编译错误,因为它被称为是只读的(read-only)
14. const double *cptr;
//cptr是一个指向double类型的const对象的指针(从右向左读“cptr是一个指向
//double类型的、被定义成const的对象的指针”)
//其中微妙在于cptr本身不是常量,我们可以重新赋值cptr,使其指向不同对象
//但不能修改cptr指向的对象。
//const对象的地址只能赋值给指向const对象的指针,但指向const对象的指针可以被
//赋以一个非const对象的地址。
15. 在实际程序中,指向const的指针常被用作函数的形式参数,它作为一个约定来保证:被传递给函数的实际对象在函数中不会被修改。
int strcmp( const char *str1, const char *str2 );
16. int errNumb = 0;
int *const curErr = &errNumb;
curErr是指向一个非const对象的const指针。(curErr是一个指向int类型对象的const指针)。这意味着不能赋给curErr其他的地址值,但可以修改curErr指向的值。
17. const double pi = 3.14159;
const double *const pi_ptr = π
指向const对象的const指针。pi_ptr指向的对象的值以及它的地址本身都不能改变。(pi_ptr是指向被定义为const的double类型对象的const指针)
18. 引用(reference)有时候又称为别名(alias),它可以用作对象的另一个名字。通过引用可以间接地操纵对象,使用方式类似于指针,但不需要指针的语法。实际应用中,引用主要被用作函数的形式参数——通常将类对象传递给一个函数。
引用必须被初始化
int ival = 1024;
int &refval = ival;
19. 指针引用
int &refVal1 = &ival;//错误,refVal1是int类型,不是int*
int *pi = &ival;
int *&refPtr = pi;//正确,refPtr是一个指向指针的引用,即int*
20. 引用的所有操作实际上都是应用在它所指的对象身上,包括取地址操作符。
int *pi = &refVal;//把refVal引用的变量ival的地址初始化pi
21. const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。
double dval = 3.14159;
//下面仅对于const引用才合法
const int &ir = 1024;
const int &ir2 = dval;
const double &dr = dval +10;
22. 引用必须总是指向一个对象,如果用一个引用给另一个引用赋值,那么改变的是被引用的对象而不是引用本身。
但是指针可以不指向任何对象,如int *pi = 0;//pi不指向任何对象。
23. 引用类型主要被用作函数的形式参数
bool get_next_value( int &next_value );//返回访问状态,将值放入参数。
Matrix operator+( const Matrix&, const Matrix& );//重载加法操作符
int ival;
while ( get_netx_value( ival ))…
//实际参数ival同形式参数next_value的绑定,等价于下面的独立对象的定义
//int &next_value = ival;
24. 布尔型对象可以被赋以文字值ture或false,虽然也被看作是一种整数类型的对象,但是它不能被声明为signed、unsigned、short或long。
当表达式需要一个算术值时,布尔对象和布尔文字都被隐式地提升成int:false为0,true为1。
如果有必要,算术值和指针值也能隐式地被转换成布尔类型的值,0或空指针被转换成false,所有其他值都被转换成true。
//返回出现次数
extern int find( const string& );
bool found = false;
if ( found = find( “rosebud” ))
//OK: found == true
//如找到返回该项的指针
extern int* find( int value );
if ( found = find( int value );
//ok: found == true
25. 枚举(enumeration)不但能定义整数常量,而且还能把它们组合成一个集合。
枚举成员(enumerator),代表了能用来初始化和赋值枚举类型变量的值的全集。
如果试图传递一个非枚举成员之外的值,就会产生编译错误。
可以定义枚举类型对象,它可以参与表达式运算,也可以被作为参数传递给函数。
不能打印枚举成员的实际枚举名,可以定义一个由枚举成员的值索引的字符串数组
不能使用枚举成员进行迭代。
26. 数组类型,是一个单一数据类型对象的集合。可以通过索引访问indexing(或下标访问subscripting),即通过它在数组中的位置对它进行访问。
数组定义由类型名、标识符和维数组成。维数必须是常量表达式,即必须能在编译时刻计算出它的值。即意味着非const的变量不能被用来指定数组的维数。
27. 字符数组可以用一个由逗号分开的字符文字列表初始化,花括号括起来,或者用字符串常量初始化。但两者不同,字符串常量包含一个额外的终止空字符。
28. 一个数组不能被另外一个数组初始化,也不能赋值给另外一个数组,而且C++不允许声明一个引用数组(即由引用组成的数组)
const int array_size = 3;
int ix, jx, kx;
int *iap[] = {&ix, &jk, &kx};//OK:类型为int *的指针数组
int &iar[] ={ix,jx,kx};//错误,不允许引用数组
29. 任意结果为整数值的表达式都可以用来索引数组
30. 多维数组,行(row),列(column)
ia[ ][ ]
ia[1,2]等价于ia[2](逗号表达式,值为2);等价于访问ia的第三行的第一个元素。与ia[1][2]不同。
31. 数组标识符代表数组中第一个元素的地址,它的类型是数组元素类型的指针,即int*
32. 泛型程序设计(generic programming),使用模板函数。下面举例说明
#include <iostream>
template <class elemType>
void print(elemType *pbegin, elemType *pend)
{
while ( pbegin != pend )
{
cout << *pbegin << ‘ ‘;
++pbegin;
}
}
int main()
{
int ia[9]={0,1,2,3,4,5,6,7,8};
double da[4]={3.17,6.28,12.56,25.12};
print(ia,ia+9);
print(da,da+4);
}
33. vector类为内置数组提供了一种替代表示。包含#include <vector>
数组习惯使用:vector<int> ivec(10);//定义了10个int型的vector
STL习惯使用:vector<int> text;//此时text是一个空的vector
我们向vector中插入元素,而不再是索引元素,以及向元素赋值。如push_back()操作就是在vector的后面插入一个元素。使用begin()和end()所返回的迭代器(iterator)对。
任何一个插入操作(push_back)都将增加vector的大小,而不是覆盖掉某个现有的元素。
vector<int>::iterator it = text.begin();
iterator是标准库中的类,具有指针功能。
*it;//对迭代器解引用,并访问其指向的实际对象。
++it;//向前移动迭代器it,使其指向下一个元素。
34. 复数(complex number)类。 #include<complex>
complex<double> purej(0,7);//0+7i
35. typedef机制提供一种通用的类型定义,可以用来为内置的或用户定义的数据类型引入助记符号。
typedef vector<int> vec_int;
typedef char *cstringl
extern const cstring cstr;
//该定义声明了一个指向字符的const指针,即 char *const cstr;
//const char *cstr;//即指向const字符的指针。
36. volatile限定修饰符。当一个对象的值可能会在编译器的控制或监测之外被改变时,例如一个被系统时钟更新的变量,则应该声明成volatile。因此,编译器的某些例行优化行为不能应用在已指定为volatile的对象上。
volatile Task *curr_task;//curr_task是一个指向volatile的Task类对象的指针。
37. pair类型也是标准库的一部分,可以在单个对象内部把相同类型或不同类型的两个值关联起来。#include <utility>
pair<string,string> author(“James”,”Joyce”);
创建了一个pair对象author,它包含两个字符串,分别被初始化。可以用成员访问符号(member access notation)访问pair中的单个元素,它们名字为first和second。
author.first == “James”;
38. 类机制支持新类型的设计。操作符重载(operator overloading)
一个类包括公有的(public)操作部分和私有的(private)数据部分。这些操作称为该类的成员函数(member function)或方法(method)。
39. 拷贝构造函数(copy constructor),使用另一个对象来初始化一个对象
string ( const string& );
40. 被重载的操作符采用下面的一般形式
return_type operator op ( parameter_list );
//此处operator是关键字,op是一个预定义的操作符
char& operator[] ( int );
//声明了一个下标操作符的重载实例,它带有一个int型的参数,返回指向char的引用。
41. 调用成员函数,针对对象的点成员访问符号;针对指针的箭头成员访问符号->
42. 在类定义之外定义的成员函数需要告诉编译器:名字、返回类型、参数表、所属类。
在类体外定义的内联成员函数,应该被包含在含有该类定义的头文件中。
43. 用new表达式动态的分配内存时,必须用delete表达式释放
如inline string::~string() { delete [] _string }
44. 在类成员函数中this指针被自动设置为指向左侧的类对象。