size_type //error
12.向vector添加元素
string word;
vector
text;
while(cin>>word){
text.push_back(word);
}
13.C++程序员习惯于优先选用!=而不是<来编写循环判断条件。(泛型编程)
14.迭代器(iterator)是一种检查容器内元素并遍历元素的数据类型。
现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素。
迭代器(iterator)和迭代器类型(例vector
::iterator)
由end操作返回的迭代器指向vector的“末端元素的下一个”(off-the-end iterator)。只是起一个哨兵(sentinel)的作用,表示我们已处理完vector中所有元素。
解引用操作符(*操作符)*iter = 0;
const_iterator
任何改变vector长度的操作都会使已存在的迭代器失效。
15.用string对象初始化bitset对象(从string对象读入位集的顺序是从右向左!)
数组和指针
1.设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。
2.数组缺点:长度固定;无size操作;不允许直接复制和赋值
但是还是要会~~
3.数组下标的正确类型:size_t
4.缓冲区溢出(buffer overflow)
5.理解指针声明语句时,请从右向左阅读。
6.如果必须分开定义指针和其所指向的对象,则将指针初始化为0.(NULL等效于0,是继承自C的预处理变量,位于cstdlib头文件中)
7.void*指针表面该指针与一地址相关,但不清楚存储在此地址上的对象的类型。只支持有限的操作:
与另一个指针进行比较;
向函数传递void*指针或从函数返回void*指针;
给另一个void*指针赋值。
8.指针和引用的比较
引用总是指向某个对象:定义引用时必须初始化(引用一经初始化,就始终指向同一个特定对象)。
赋值行为的差异:引用赋值修改的是该引用所关联的对象的值。
9.两个指针减法操作的结果是标准库类型ptrdiff_t的数据。在cstddef头文件中定义。
10.只要指针指向数组,就可以对它进行下标操作。
int *P = &ia[2];
int j = p[0];
int k = p[-2];
11.指向const对象的指针(理解为“自以为指向const的指针”),常用作函数的形参(以此来确保传递给函数的实际对象在函数中不因为形参而被修改)
可以将指向const对象的指针初始化为指向非const对象,但不可以让指向非const对象的指针指向const对象。
12.阅读const声明语句产生的部分问题,源于const限定符既可以放在类型前也可以放在类型后
例:指针和typedef
typedef string *pstring;
//all three decreations are the same type.they are all const pointers to string.
const pstring cstr1;
string *const cstr2;
pstring const cstr3;
13.C风格字符串(C-style character string)不能确切的归结为C语言的类型,也不能归结为C++语言的类型,
而是以空字符null结束的字符数组。
C++通过(const)char*类型的指针来操纵C风格字符串。(如果没有null结尾...)
const char *cp = "some value";
while(*cp){
//do something to *cp
cp++;
}永远不要忘记字符串结束符null
14.自由存储区(free store)或堆(heap):每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象。
C语言:malloc和free
C++语言:new和delete
15.动态数组
使用跟在数组长度后面的一对空圆括号,对数组元素做初始化。
int *pia = new int[10]; //array of 10 uninitialized ints
int *pia2 = new int[10](); //array of 10 int value-initialized to 0
调用new创建长度为0的数组是合法的(但不能被解引用)
char arr[0]; //error:can not define zero-length arrary
char *cp = new char[0]; //ok:but cp can not be dereferenced
动态空间的释放(内存泄露memory leak)delete[]
16.可以使用C风格字符串对string对象进行初始化或赋值。
需要借助c_str()来实现string对象对C风格字符串的初始化或赋值。
const char *str = st2.c_str();
17.指向多维数组的指针
int *ip[4];//array of pointers to int
int (*p)[4];//pointer to an array of 4 ints
用typedef简化指向多维数组的指针
表达式
1.C++提供了丰富的操作符,并定义操作数为内置类型时,这些操作符的含义。(操作符operator的含义,取决于操作数operand的类型)
unary operator、binary operator、ternary operator
要理解由多个操作符组成的表达式,必须先理解操作符的优先级(precedence)、结合性(associativity)和操作数的求值顺序(order of eva luation)。
precedence:例 低优先级的应用
int i;
while((i = get_value()) != 42){ //get_value() returns an int
//do something
}
associativity:(例:左结合cin>>a>>b 右结合int a=b=0)
order of eva luation:C++中规定了操作数计算顺序的操作符有&&、||、逗号运算符、条件运算符。例见3 short-circuit eva luation
2.操作符%(remainder / modulus)两个操作数为正正、负负、正负、负正时的结果。(后两种取决于机器)
3.短路求值(short-circuit eva luation):逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算其右操作数。只有在仅靠左操作数的值无法确定该表达式的结果时,才会求解其右操作数。
4.对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数。
<<补零,>>依据具体
5.复合赋值操作符(左操作数只计算了一次,而使用相似的长表达式时则计算了两次)
6.只有在必要时才使用后置操作符。(因为前置操作需要做的工作更少)
7.箭头操作符(->)C++为在点操作符后使用的解引用操作定义的同义词。
8.sizeof的一点点说明,注意理解。
将 sizeof 应用在表达式 expr 上,将获得该表达式的结果的