C++易错知识点归纳

  • 本文由于复试时的C++笔试而特意整理,知识点不求全,不求细,只整理出个人觉得易遗忘或者较重要的知识点。有不足之处,欢迎指出。图片来源:菜鸟教程。
  • 面向对象开发的四大特性:
    • 封装:类、函数。封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。
    • 抽象:将有关事物的共性归纳、集中的过程。面向对象程序设计中的抽象包括两个方面数据抽象和代码抽象。类。接口和实现分离。
    • 继承:继承所表达的是类之间的相关关系,这种关系使得某类对象可以继承另外一类对象的特征和能力。
    • 多态:指不同的对象收到相同的信息时执行不同的操作。两种多态性,即编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载(包括运算符重载)来实现的,运行时的多态性是通过虚函数来实现的。
  • 三字符组
    • 用于表示另一个字符的三个字符序列。以两个问号开始。(如:??:   =>   #)
  • 内置类型所占内存大小(单位:字节)
    • char             1
    • bool             1
    • int                4
    • short            2
    • long              8
    • float              4
    • double          8
    • long double 16
    • wchar_t      2/4
  • typedef:为一个已知类型取新名字
  • 枚举:派生数据类型,只有赋值运算符没有定义算术运算
    • enum 枚举名{标识符} 枚举变量
    • 标识符默认从0递增,可以自定义整型,自定义往后的继续依次递增
  • 变量命名:字母/下划线开头,可以有数字,不能有标点符号。大小写敏感。
  • 变量声明:未开辟空间。(extern实现,若在其后赋初始值便为定义。)
  • 变量定义:开辟空间
  • 局部变量:可定义与全局变量同名的变量
    • 局部变量被定义时,系统不会对其初始化。全局变量系统会自动初始化为0。
  • 整数常量:前缀0x十六进制、0八进制。后缀U无符号整数、L长整数。不区分大小写。
  • 浮点常量:指数形式e(10)的n次方。使用后缀f,须保证为浮点数(有小数或指数)。
  • 布尔常量:不应把true 当做1,false当做0。
  • 字符常量:前缀L(仅大写)时,须存至wchart_t类型中。
  • 转义序列码   
  •         \\       \
    • \xhh 一个或多个数字的十六进制数
    • \ooo一到三位的八进制
    • \v      垂直制表符
    • \t       水平制表符
    • \r       回车
    • \n      换行符
    • \f       换页符
    • \b      退格键
    • \a      警报铃声
    • \?      ?
    • \”       “
    • \’        ‘
  • 定义常量:
    • #define(预处理指令)    const(关键字)
      • define不会进行类型检查,const会,所以const安全点。
      • const可通过强制类型转化改变其值。define是真实的常量不可改。
      • define不可寻址,const在数据段或栈段中。
      • 宏不占内存,const是一个变量,占内存空间
  • 修饰符类型
    • unsigned之类的根据二进制翻译
    • const:程序执行期间不能被修改改变
    • volatile:修饰符volatile 告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率。
    • restrict:由restrict 修饰的指针是唯一一种访问它所指向的对象的方式。所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改。
  • C++存储类
    • auto 自动推导变量的类型,并不是真正的类型,不能使用一些以类型为操作数的操作符。
    • register:定义存储在寄存器中而不是RAM中的局部变量。不能取地址,但实际上由硬件实现决定是否存储在内存中。用于计数器等需要快速访问的变量
    • static:静态成员,本文件内,不需要在每次它进入离开作用域时进行创建和销毁。用于类数据成员时,会导致仅有一个该成员的副本被类的所有对象共享。
    • extern提供全局变量的引用,用来调用在其他文件定义过的变量。
    • mutable:易变的,用于在const成员函数类修改某个变量。
    • thread_local 创建线程时创建,线程销毁时销毁。
  • 位运算符
    • &与同时为真1
    • | 或有一个为真1
    • ^ 异或相同为0
    • ~取反0变1,1变0
    • >> 右移
  • 赋值运算符
    • a >>= 2  (a= a>>2) 同理得其他
  • 杂项运算符
    • sizeof(a) 返回变量的大小。单位:字节。
    • a? x:y, a为真值为x,否则为y。条件运算符
    • .   -> 成员运算符
    • ,逗号运算符,依次执行一系列运算。其表达式的值为列表中最后一个表达式的值
    • &取地址,*指向一个变量。
  • 运算符的优先级。从上到下,优先级递减
  • 循环控制语句
    • break 终止循环到下一句。continue跳过循环剩余部分,重新开始判断循环条件。
    • goto 不建议使用,较好的用法,打破多层嵌套循环,一次break不能达到效果。
  • lambda表达式  [ ] () -> return type { }  ,可方便的定义和创建匿名表达式
    • []捕获外部变量列表,值捕获,引用捕获,隐式捕获[=]传值,[&]传引用,根据函数代码推断需要捕获哪些变量
    • ()形参列表,不能有默认参数,不支持可变参数,多有参数必须有参数名。
  • 数学运算<cmath>
    • double cos(souble) 求余弦同理其他三角函数
    • double log(double) 自然对数
    • double pow(double x, double y); x的y次方
    • double hypot(double, double); 参数为一个直角三角形的两个直角边,返回斜边。
    • double sqrt(double); 平方根
    • int abs(int); 整数绝对值
    • double fabs(double); 十进制的绝对值
    • double floor(double); 小于等于传入参数的最大整数。
  • 随机数。用time函数获取系统时间的描述。伪随机数。<cstdlib><ctime>
    • 先设置种子,srand( (unsigned) time( NULL ) ); 再生成随机数int i = rand();
  • setw(number);格式化输出。<iomanip> ,std::setw.          setw(7)在第七格do。
  • 数组名即为指向第一个元素的地址。*(a+1)访问a[1]
  • C风格的字符串。char数组,最后有\0。 
  • c++风格的字符串。string 类类型。像操作内置类型一样操作=  + size()
  • 指针常量:指针本身为常量,所指地址为常量不能变。int * const p。
  • 常量指针:指向常量的指针。值不能变。const在*左边。
  • 私有成员:类内部和友元可访问。
  • 保护成员:类内部、友元和派生类可访问。
  • 继承的特点:private不能被派生类访问,protected可以
    • public继承:基类成员在派生的访问属性public, protected, private。
    • protected继承:基类成员在派生的访问属性protected, protected, private。
    • private继承:基类成员在派生的访问属性private, private, private。
  • 构造函数:不会返回任何类型,包括void。可带参数
  • 析构函数:不会返回任何类型,也不可带参数。
  • 友元函数:没有this指针。访问非静态成员时须以对象为参数。访问静态成员或全局变量时,不需要对象做参数。friend
  • 内联函数:编译时,将函数代码拷贝到原程序处。每次修改后,须重新编译所有客户端。类中定义的函数均为内联函数。内联会使代码更快,但会使代码膨胀。小的用。inline
  • this指针:每个对象都能通过this访问自己的指针。this指针是所有成员函数的隐含参数。
  • 类的静态成员:所有类的对象共享一个副本。不能在类定义时初始化静态成员,在外::。
  • 类的静态成员函数:无this 指针,只能访问静态成员。
  • 继承:派生类继承了所有的基类方法,除了基类的构造函数、析构函数、拷贝构造函数。基类的重载运算符。基类的友元函数。
  • 运算符重载:operator。不可重载的运算符(. .*  ->*   ::  sizeof  ?: #)
  • 输入/输出运算符重载:为了不用创建对象直接调用>> << ,需将重载函数设为友元。
  • 重载++:后缀++的重载函数列表多个(int)是为了和前缀++区分。
  • 静态多态:函数在编译期间设置好了。模板、函数重载。
  • 动态多态:根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。虚函数。virtual。
  • 纯虚函数:virtual int area()= 0;
  • 数据封装:数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。
  • 文件和流:ofstream,ifstream,fstream均为对象。其成员函数void open(文件名称和位置,mode)。mode:app 追加到末尾;ate定位到末尾;in 读取;out 写入;trunc 截断之前的内容,将长度设为0;可通过| 来结合多组模式。用完close掉。
  • 文件位置指针:istream:seekg ostream:seekp。
  • 异常处理
    • throw 抛出一个异常
    • catch 捕获异常
    • try 其中放置可能抛出异常的代码,try块中的代码被称为保护代码。与catch共用。
  • 模板:
    • template <typename T> T const & Max(T const&a, T const&b) { }
    • template <class T> class Stack {}
  • 预处理#:会转换为有引号引起来的。##:  x##y =>  xy
  • 预定义宏:_LINE_ 程序编译时包含当前行号。file 文件名。date 包含月/日/年。time h/m/s程序被编译的时间。
  • malloc/free new/delete 的异同
    • new是表达式,malloc是库函数
      • new表达式在开辟空间的同时可以初始化空间而malloc在开辟堆空间时,只申请空间不会初始化空间。
    • malloc返回类型为void*而new则会返回相应类型的指针。
  • 引用和指针的区别
    • 引用必须初始化
    • 引用的类型必须和其绑定的类型一致
    • 引用一旦绑定到某个变量就不能改变指向。
  • 函数重载
    • 函数名称必须相同
    • 参数列表必须不同(类型、个数、顺序)
    • 仅函数返回类型不同不构成函数重载。(可同可不同)
  • 函数重载通过名字改编实现。如果希望函数名字不被改编:extern “C”{}
  • 内存分布
    • 堆区:程序员分配
    • 栈区:编译器自动分配,存放函数参数、局部变量
    • 读写段(全局/静态区):编译时分配,全局变量、静态变量
    • 只读段:文字常量区、程序代码区
  • 单例设计模式
    • 构造函数私有化
    • 类中定义一个静态指针对象,在类外初始化为空
    • 定义一个返回值为类类型的静态成员函数,若指针为空初始化对象。
  • STL六大组件(容器、迭代器、适配器、算法库、函数对象、空间配置器)
    • 容器:序列式容器(vector  deque list)、关联式容器(红黑树set map)、非关联式容器(哈希unordered-set unordered-map)。
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值