1、string和字面值混着一条语句使用时 必须确保每个+的两侧运算对象至少有一个是string (p81)
string s7=(“Hello”+",")+s2; //错误
2、getline(s1,s2) 把s1取一行赋给s2,返回s1
3、C++11范围for语句:
对于str中的每个字符 for(auto c:str)
4、p163 在switch语句内定义一个变量的时候有三种情况:
(1)可在default中定义
(2)可在最后一个case中定义
(3)在不属于最后一个的case中定义变量,必须引入块语句。
原因:如果执行到非最后一个的case语句 就默认上面定义变量的case语句定义成功(其在于同一个作用域内)。
- case true:
string file_name;//错误 控制流绕过一个隐式初始化
int jval=0;//错误 控制流绕过一个显式初始化
int jval;//正确 没有初始化
5、取余结果的符号取决于前者
eg:m%(-n)=m%n
6、vector
因为引用不是对象 故不存在包含引用的vector
把控制变量i定义成引用类型 这样就能通过i给v的元素赋值
for(auto &i:v){
i*=i;
}
- 不能以下标形式添加元素
for(decltype(ivec.size()) ix=0;ix!=10;++ix){
ivec[ix]=ix;//错误!;ivec不包含任何元素。
}
//正确的方法应该使用push_back
for(decltype(ivec.size()) ix=0;ix!=10;++ix){
ivec.push_back(ix);
- 但凡是使用的迭代器的循环体,都不要向所属的容器添加元素。(push_back)
7、constexpr把它所定义的对象置为了顶层const
8、int *(&arry)[10]=ptrs;
arry是一个含有10个int型指针的数组的引用。
不能将数组给其他数组赋值或作为初始值。
9、标准库函数begin和end
正确的使用形式是将数组作为它们的参数
尾后指针不能执行解引用和递增操作
10、两个指针相减结果类型是ptrdiff_t的标准库类型和size_t类似,也是一种定义在cstddef头文件中的机器相关的类型,但因为差值可能为负值 故其是一种带符号类型
11、* (ia+4)不等于*ia+4 但由于后置递增运算符的优先级高于解引用运算符故 *pbeg++= *(pbeg++)
12、内置的下标运算可以处理负值
13、C风格字符串
- 比较字符串
运用<>=比较字符串时 string正常的进行比较
而c风格字符串则进行地址比较
想比较需使用strcmp
cstring是c语言头文件string.h的cpp版本 可用于操作c风格字符串
任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代
14、使用数组初始化vector对象
不允许使用一个数组来给另一个内置类型的数组赋初值
也不允许使用vector对象初始化数组
但可以使用数组初始化vector
实现这一目的,只需要指明拷贝区域的首元素地址和尾后地址
int int_arr[6]={0,1,2,3,4,5};
vector<int> (begin(int_arr),end(int_arr));
15、用for语句处理多维数组
- 因为要改变数组元素的值,所以我们选用引用类型作为循环控制变量
但为了避免数组被自动转为指针 除了最内层的循环外 其他循环的控制变量都应该是引用类型。
size_t cnt=0;
for(auto &row:ia){
for(auto %col:row){
col=cnt;
++cnt;
}
}
- 随着cpp11新标准的提出
- 通过使用auto或decltype就能够尽可能避免在数组前面加一个指针类型了!!!
&arr 239212 // &arr+1 会加一个数组大小的地址
arr 239212
&arr[0]] 239212 //begin(*p)注解
int arr[3][6]=blablaaaaaa;
for(auto p=begin(arr);p!=end(arr);++p)//p指向arr的第一个数组
for(auto q=begin(*p);q!=end(*p);++q)//q指向内层数组的首元素
16、if(i<j<k)的意思是i与j比大小然后返回布尔值
真实的意思你应该使用if(i<j&&j<k)
17、运算对象可按任意方向求值
- *beg=toupper( * beg++);//错误:该赋值语句未定义 它可能先求左or右
应该把自增放入for语句内
for(auto it=s.begin();i<s.end()&&!isspace( * it);++it)
*it=toupper(*it);//isspace 判断字符是否为空白字符
18、条件运算符的优先级非常低 记得加括号
- cout<<((grade<60)?“fail”:“pass”)
cout<<(grade<60)?“fail”:“pass”//输出0或者1
19、sizeof
- 对引用类型执行sizeof运算得到被引用的对象所占空间大小
指针得指针本身 解引用得指针所指向对象的大小 指针不需有效
20、显示转换
- static_cast dynamic-cast const_cast reinterpret_cast
任何具有明确定义的类型转换 只要不包好底层const 都可以使用static——cast
eg:double slope=static_cast(j)/i;
还可用于找回void*指针
const_cast只改变运算对象的底层const(只改变常量属性)
reinterpret的效果和旧式的强制类型转换一样
21、case的标签必须是整型常量表达式
string a;等于string a=null;