特性
RVO(类似构造函数)
lambda
RAII
模板
- 模板实参推导
默认类型与类型转换
用户定义字面量 (C++11 起) - cppreference.com
虚函数与成员函数调用行为与成员指针
new delete
数据结构
vector
deque
list
set
queue
stack
map
unordered_map
树
- 平衡二叉树
- 自平衡二叉树
- 红黑树
- B 树
图
- 有限状态机
算法
前序遍历、中序遍历、后序遍历
动态规划
回溯
类的缺省函数
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class Class { public: //缺省构造函数 Class(){} //拷贝构造函数 Class(const Class&){} //移动构造函数(C++11) Class(Class&&){} //移动赋值函数(C++11) Class& operator=(Class&&){} //析构函数 ~Class(){} //赋值运算符 Class&operator=(const Class&){} //取址运算符 Class*operator&(){} //取址运算符 const const Class*operator&()const{} };
一些需要注意的问题
标准库迭代器
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14#include<vector> #include<list> void main(){ vector<int> v = {1,2,3,4}; auto i = v.begin(); v.erase(i); cout << *i << endl; list<int> l = {1,2,3,4}; auto j = l.begin(); l.erase(j); //NOTE 这里的j已经失效,虽然输出了1 cout << *j << endl; }
复制代码
1
2
32 1 #这个输出看似正确,但没有意义
迭代器是否失效请看这里
使用时可以考虑erase函数的返回值 其为指向被删除元素的下一个元素的迭代器
对合法但无效的栈内存进行访问
将会产生未定义的结果
操作符的操作数的求值顺序
“除逻辑操作符,“?:”操作符,“,”操作符外,其他操作符并未指定其操作数的求值顺序”
———《C+P》
比如expr1*expr2
,expr1
与expr2
的求值顺序无法得知
比如表达式if (ia[id++] < ia[id] )
的行为没有明确定义
特别是在expr1
与expr2
操作涉及并修改同一对象时,求解顺序相当重要
个人:以上(《C+P》)的内容是我不经意间看见的,以前一直按照结合性方向使用上述类似表达式,比如自左向右结合就先计算左边,也没出现过严重问题,在这里记录以防不测。
貌似新标准有规定这些顺序,我个人编程是按结合顺序来确定求值顺序的,如果不能确定顺序,就分开写。
数组变量的使用
除&
与sizeof
,对数组变量的使用将使数组变量提升为成员指针
例如:
复制代码
1
2
3
4
5//10被忽略,即arr的类型被视为int * void foo(int arr[10]); //arr_p被视为指向大小为10的数组的指针 void foo(int(*arr_p)[10]);
一些错误
转换存在,但无法访问
继承缺少访问限制符
复制代码
1
2
3
4class A {} class B : A {} A *a = new B; // err
堆损坏
- double free
SEH
- 栈溢出(递归调用)
最后
以上就是无私手套最近收集整理的关于[系统的学习][C++]备忘录一些需要注意的问题一些错误提示的全部内容,更多相关[系统内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复