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