我是靠谱客的博主 无私手套,最近开发中收集的这篇文章主要介绍[系统的学习][C++]备忘录一些需要注意的问题一些错误提示,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

特性

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*expr2expr1expr2的求值顺序无法得知
比如表达式if (ia[id++] < ia[id] )的行为没有明确定义
特别是在expr1expr2操作涉及并修改同一对象时,求解顺序相当重要

个人:以上(《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

堆损坏

  1. double free

SEH

  1. 栈溢出(递归调用)

最后

以上就是无私手套为你收集整理的[系统的学习][C++]备忘录一些需要注意的问题一些错误提示的全部内容,希望文章能够帮你解决[系统的学习][C++]备忘录一些需要注意的问题一些错误提示所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部