吐血共享C++ primer(第四版)学习笔记 - 图文(2)

2019-08-30 22:05

数组长度固定,数组没有获取其大小的size操作。也不能添加元素。如果需要更改数组的大小,只能创建一个更大的新数组,然后把原来的数组的所有元素复制到新的数组空间中。 非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。 初始化数组:

Const unsigned array_size = 3;

Int ia[array_size] = {0, 1}; //维数大于列出的元素个数,剩下的为默认值0 Int ia[] = {1, 3, 5}; //显示初始化的数组也可以指定数组的维数

Const char ca3[5] = “hello”; //错误,使用一组字符字面值初始化字符数组时,要记得添加结束字符串的空字符,hello is 7 elements

一个数组不能使用另一个数组初始化,也不能将一个数组赋值给另一个数组。通过用for循环,可以实现把一个数组复制给另一个数组。

int ia[] = {1, 2, 3}; int ia2[](ia); //错误 const unsigned array_size = 3; int ia3[array_size]; ia3 = ia; //错误

数组元素也可以用下标操作符来访问,数组元素下标是从0开始的,数组下标类型是size_t。 int main() {

const size_t array_size = 10; int ia[array_size];

for (size_t ix = 0; ix != array_size; ++ix) { ia[ix] = ix ; cout << ia[ix] << endl; }

return 0; }

数组的遍历可以使用下标或者指针实现。对指针进行解引用操作时,可获得该指针所指对象的值,指针做自增操作时,则移动指针使其指向数组中的下一个元素。指针保存的是另一个对象的地址。

string s(“hello world”); string *sp = &s; //定义一个指向string类型的指针sp并初始化为指向string类型的对象s。

避免定义一个未初始化的指针,如果必须先定义指针,则将其初始化为0(初始化为null和0一样)。C++提供了一种特殊类型的指针类型 void*,它可以保存任何类型对象的地址。 (*)解引用操作将获取指针所指向的对象:

string s(“hello”); string *sp = &s; cout << *sp; //print hello *sp = “goodbye”; //contents of s now changed string s2 = “some”; sp = &s2; //sp now points to s2

引用和指针的区别:引用和指针都能间接地指向一个值,但是引用总是指向某个对象,定义引用时没有初始化是错误的,其次,给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定的对象。 int ival = 1024, iva2 = 2048; int * pi = &ival, *pi2 = &iva2;

pi = pi2; //pi now points to ival2

int &ri = iva1, &ri2 = ival2;

ri = r2; //此时iva1和iva2的值相等,都为iva2,但是引用不改变。 指向指针的指针: int ival = 1024;int *pi = &iva1; int **ppi = π 使用指针指向数组时,默认指向数组中的第一个元素:

int ia[] = {1, 3, 4, 5, 6}; int *ip = ia; //ip points to ia[0] ip = &ia[4]; //ip points to last element int main() {

int a1[] = {1, 2, 3, 4, 5, 6, 7}; }

int *ip = a1; //默认指向数组中的第一个元素 cout << *ip << endl; ip = &a1[4];

cout << *ip << endl; return 0;

通常,在指针上加上或者减去一个整型数值n等效于获得一个新指针,该新指针指向指针原来指向的元素之后或之前的第n个元素。 ip = ia; //ip points to ia[0] int *ip2 = ip + 4; //ip2 points to ia[4] c++支持对两个指针做减法操作:ptrdiff_t n = ip2 – ip; //结果为标准库类型的ptrdiff_t类型,可为负数

在指针上加一个整型数值,其结果仍然是指针,可以直接在这个结果上进行解引用操作,而不必先将其赋给一个新的指针:int last = *(ia + 4); //the value is i[4] 对指针进行下标操作: int main() {

int ia[] = {1, 3, 4, 5}; int i = ia[0]; int *p = &ia[2]; int j = p[1]; int k = p[-2];

cout << i <

计算数组的超末端指针的值: const size_t arr_size = 5;

int arr[arr_size] = {1, 2, 3, 4, 5};

int *p = arr; //arr[0] = 1 int *p2 = p + arr_size; 输出数组元素:

const size_t arr_size = 5;

int arr[arr_size] = {1, 2, 3, 4, 5};

for (int *pbegin = arr, int *pend= arr + arr_size; pbegin != pend; ++pbegin ) { cout << *pbegin <

指向const的指针可以理解为“自以为指向const的指针”。

const指针:本身的值不能修改,与任何const变量一样,const指针也必须在定义时初始化:int errUnm = 5; int *const curErr = &errUnm;

指针本身是const的事实并没有说明是否能使用该指针修改它所指向对象的值,指针所指对象的值能否修改完全取决于该对象的类型。 指向const对象的const指针: const double pi = 3.14159;

const double *const pi_ptr = π

//既不能修改pi_ptr所指向对象的值,也不能修改指针的指向

c语言使用标准库函数malloc和free在自由存储区中分配存储空间,而c++中则使用new和delete表达式实现!

动态分配数组时,只需要指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针:int *pia = new int[10];

动态数组初始化:int *pia2 = new int[10]();//只能初始化为元素类型的默认值,不能使用初始化列表为数组元素提供各不相同的初值。

const对象的动态数组(不能修改,故用处不大)必须要求初始化: const int *pia3 = new const int[100]; //错误 const int *pia3 = new const int[100](); //正确 空间的释放:delete [] pia3;

严格的说c++中没有多维数组,通常所说的多维数组其实是数组的数组。 多维数组初始化:

int ia[3][4] = { 等价于:

{0, 1, 2, 3}, int ia[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; {4, 5, 6, 7}, {8, 9, 10, 11} };

int ia[3][4] = {{0} , {4} , {5} };

多维数组的下标引用:见6多维数组下标引用

123和124没有作笔记(指针与多维数组和用typedef简化指向多维数组的指针)。 第五章 表达式 第六章 语句

每个switch语句必须有default,哪怕里面只有一个break,对于for循环,尽量不要再循环体内修改循环变量,防止循环失去控制。do{}while()和while()do{}这两个语句。因为这两种判断恰好相反,前者先执行后判断,后者先判断后执行。 try catch语法形式: try{ program-statements; //正常逻辑语句 }catch(exception-specifier){ //捕获的异常类型 //? //对异常的处理 }catch(exception-specifier) { //捕获的异常类型 //? //对异常的处理 }… try块后可以是一个或多个catch字句。每个catch子句包括三部分:关键字catch、圆括号里面的单个类型或者单个对象的声明(异常说明符)、花括号的语句块。(一般应用在调用已封装好的程序,前提封装的程序能够扔出异常。外面来捕获) a ) try中必须有throw,如果没有,后面的catch不会捕捉到错误信息。 第七章 函数

c++语言使用调用操作符即一对圆括号实现函数的调用。 函数必须指定返回类型。 使用引用形参:

void swap(int a1, int a2) { int temp = a1; a1 = a2; a2 = temp;

} //错误,不能交换值 void swap(int &a1, int &a2) { int temp = a1; a1 = a2;

a2 = temp;

} //正确,能交换值

将组织形参直接定义为指针要比使用数组语法定义更好。 第八章 标准IO库

输出缓冲区的刷新:使用endl操纵符,用于输出一个换行符并刷新缓冲区,使用flush,用于刷新流,但不在输出中添加任何字符,使用ends在缓冲区中插入空字符null,然后刷新它。如果需要刷新所有输出,最好使用unitbuf操纵符,这个操纵符在每次执行完写操作后都刷新流:cout << unitbuf << \等价于:

cout << \ nounitbuf操纵符将流恢复为使用正常的,由系统管理的缓冲区刷新方式。如果程序崩溃了,则不会刷新缓冲区。

流必须处于无错误状态,才能用于输入或输出,其中最简单的检查方法就是检查其真值: if (cin);

while (cin >> word)

iostream定义读写控制窗口的类型,fstream定义读写也命名文件的类型。,sstream定义的类型则用于读写存储在内存中的string对象。

流的状态由bad,fail,eof,good操作揭示,如果bad,fail,eof中的任意一个为true,则检查流本身将显示该流处于错误状态,如果这三个条件没有一个为true,则good操作将返回true。

clear和setstate操作用于改变条件成员的状态,clear操作将条件重设为有效状态,在流的使用出现了问题并作出补救后,如果我们希望把流重设为有效状态,则可以调用clear操作,使用setstate操作可打开某个指定的条件,用于表示某个问题的发生,除了添加的标记状态,setstate将保留其他已存在的状态变量不变。 int ival;

while (cin >> ival, !cin.eof()) { if (cin.bad())

throw runtime_error( “IO stream corrupted”) if (cin.fail()){

cerr << ”bad date, try again”; cin.clear(istream::failbit); continue; }

} //不断读入cin,直到到达文件结束符或者发生不可恢复的读取错误为止 rdstate成员函数返回一个iostate类型的值,该值对应于流当前的整个条件状态: istream::iostate old_state = cin.rdstate(); cin.clear();

process_input(); cin.clear(old_state);

fstream头文件定义了三种支持文件IO的类型:

ifstream:读取文件 ofstream:写文件的功能 fstream:读写同一个文件的功能 fstream类型除了继承下来的行为外 ,还定义了两个自己的新操作-----open和close 假设ifile和ofile是存储希望读写的文件名的string对象,则可以如下编写代码: ifstream infile (ifile.c_str()); ofstream outfile(ofile.c_str());

在使用fstream对象前,还必须使这些对象捆绑要读写的对象:


吐血共享C++ primer(第四版)学习笔记 - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:电子测量自测题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: