C++ Primer学习之(4)——数组和指针

来源:互联网 发布:淘宝如何设置运费险 编辑:程序博客网 时间:2024/05/22 19:52
第四章 数组和指针
P155:
现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。
注:这让目前尽量使用数组和指针,因为不熟很少碰vector和迭代器的我,情何以堪?!

注:读到目前为止,发现自己很多地方编码都是很不规范,或者低效的。思想上的差距是巨大的。

P163:
建议:尽量避免使用指针和数组
指针和数组容易产生不可预料的错误。
许多有用的程序都可不适用数组或指针实现,现代C++程序采用vector类型和迭代器取代一般的数组,采用string类型取代C风格字符串。

P171:
指针和引用的比较:
指针和引用的两个重要区别:
1. 引用总是指向某个对象:定义引用时没有初始化是错误的;
2. 赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而不是使引用去与另一个对象关联。引用易经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。
注:面试的时候经常出现这个问题,到目前为止还没有正确完整地回答出来过,答案了然,记一个。

P177:
1. 指向const的指针可以理解为“自以为指向const的指针”。
const double *cptr; // cptr may point to a double that is const
2. 与任何const量一样,const指针也必须在定义时初始化。
int errNum = 0;int *const curErr = &errNumb; // curErr is a constant pointer
3. 指向const对象的const指针,既不能修改指针所指向对象的值,也不允许修改该指针的指向。
4. 在typedef中使用指针往往会带来意外的结果:
typedef string *pstring;const pstring cstr;
请问cstr变量是什么类型?
声明const pstring时,const修饰的是pstring的类型,这是一个指针,因此这个定义等价于:
// cstr is a const pointer to stringstring *const cstr; //equivalent to const pstring cstr
注:又是一道面试题,const把我绕晕了。

P185:
永远不要忘记字符串结束符null
char ca[] = {'C', '+', '+'}; // not null-terminatedcout << strlen(ca) << endl; // disaster: ca isn't null-terminated
ca是一个没有null结束符的字符串数组,则计算的结果不可预料。标准库函数strlen总是假定其参数字符串以null字符串结束,当调用该标准库函数时,系统将会从实参ca指向的内存空间一直搜索结束符,知道恰好遇到null为止。
注:如果我早点认真读一遍primer,面试题就不会答得惨不忍睹了,还是太浮躁。

P187:
尽量使用标准库类型string
对大部分的应用而言,使用标准库类型string,除了增强安全性外,效率也提高了,因此应该尽量避免使用C风格字符串。

P189:
每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区。C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式实现相同的功能。

P191:
动态空间的释放
C++语言为指针提供delete[]表达式释放指针所指向的数组空间:
delete [] pia;
关键字delete和指针之间的空方括号对是必不可少的:它告诉编译器该指针指向的是自由存储区中的数组,而并非单个对象。
理论上,回收数组时缺少空方括号对,至少会导致运行时少释放内存空间,从而产生内存泄露。对于某些系统和元素类型,有可能会带来更严重的运行错误

P195:
string类提供了一个名为c_str的成员函数:
char *str = st2.c_str(); // almost ok, but not quit
c_str函数返回C风格字符串,字面意思是“返回C风格字符串的表示方法”,即返回字符字符数组首地址的指针,该数组以结束符null结束。
正确的初始化应为:
const char *str = st2.c_str(); // ok
c_str返回的数组并不保证一定是有效的,接下来对st2的操作有可能会改变st2的值,使刚才返回的数组失败
注:一直没有弄明白c_str和string之间的关系就开始使用,很可能会有隐含的问题,c_str返回const char*类型,只可读,不可改。

P197:
严格地说,C++中没有多维数组,通常所指的多维数组其实就是数组的数组:
// array of size 4, each element is an array of ints of size 4int ia[3][4];

P200:
某些低级任务必须使用指针和数组,但是由于使用指针和数组容易出错而且难以调试,应尽量避免使用。一般而言,应该优先使用标准库抽象类而少用语言内置的低级数组和指针。
注:低级任务...

第四章 数组和指针(完)
0 0
原创粉丝点击