1

语法层面

static关键字的作用有哪些(修饰全局变量、修饰局部变量、修饰类的成员函数和数据成员)
(扩展:name的两个独立的性质:存储周期storage duration 和 链接性 linkage)
const关键字(修饰类型、修饰成员函数、修饰指针)

语义层面

指针和引用的区别是什么?
c++11加入的右值引用、移动语义、完美转发的含义

内存相关

2.1 new和malloc的区别,new做了什么
new operator、operator new、placement new三者的作用和区别
2.2 c++11内存管理,智能指针(shared_ptr、unique_ptr、enable_shared_from_this、weak_ptr)
2.3 程序的内存分配(和操作系统结合起来)

stl相关

3.1 vector
push_back的时间复杂度(均摊分析,扩容系数k情况下每个操作的均摊时间复杂度大概为k/k-1)
https://www.zhihu.com/questio... 关于扩容系数k的选择问题,为什么2比1.5要好一些。
push_back的强异常安全保证
迭代器失效问题

3.2 map、set 红黑树
3.3 unordered_map 哈希表

基于对象

初始化列表(必须使用:const成员、引用类型)
成员函数(const、virtual、pure vritual)
几个特别的成员函数(默认构造、拷贝、移动、析构)

面向对象

封装:访问控制关键字
继承:虚函数重写、override
多态:虚函数机制、类型转换操作符

重载、重写、隐藏的区别

多线程

锁、条件变量、线程、原子变量

友元相关

friend

类型转换

reinterpret_cast
  • 首先,reinterpret_cast不能去除const or volatile;
  • 指针类型可以转换到足以容纳它所有数据的整形类型(比如说std::uintptr_t)
  • 整形或者enum类型的值可以转换为指针类型,指针类型的值转换到大小合适的整形再转换回同一个指针类型,确保值不改变,否则的话转换后的值不能安全解引用(相反方向的转换是不支持的,因为相同的指针类型的值可以有多个整形的值的表达)。NULL或者整形的0不保证转换到目标指针类型的null值(这个时候使用隐式转换或者static_cast)
  • std::nullptr_t类型的值可以被转换为整型类型
  • 指向不同类型的指针类型的值可以转换,转换后的值如果要安全的解引用,转换的类型间需要满足type aliasing rules
static_cast

static_cast<new-type>(expression)

  • 首先,static_cast不能去除const or volatile;
  • 具有继承关系的类型的指针或引用的downcast(不能是虚继承),这种转换没有运行时检查;
  • 如果new-type是右值引用类型,static_cast将glvalue、class prvalue的表达式转换为xvalue,总结:用来进行值型别的转换,用来实现std::move的移动语义
  • 在存在从expression到new-type的隐式转换序列的类型间进行转换;或者如果存在直接初始化(direct initialization),可以用static_cast进行构造(等同于new-type Temp(expression)
  • 如果new-type是void,static_cast对expression求值后丢弃该值。
  • 如果存在从new-type到expression的标准转换序列,并且不涉及左值到右值、数组到指针、函数到指针、null指针、boolean转换,那么static_cast可以执行expression到new-type的隐式转换
  • scoped enumeration到整形或者floating-point类型的转换
  • 从整形或者enum类型到任何完整的enum类型的转换
  • 无运行时的upcast转换
  • void指针类型的prvalue可以被转换到指向任何类型的指针,(但是如果void指针存储的地址不满足目标类型的对齐标准,那么转换的结果不确定。
隐式转换序列

一个隐式转换序列是按照如下顺序组成的转换规则

  1. 0个或1个标准转换序列
  2. 0个或1个用户定义转换序列
  3. 在用户转换序列存在的前提下,0个或1个标准转换序列

标准转换序列:
一个标准转换序列按照如下顺序组成的转换规则

  1. 0个或1个:左值到右值的转换、数组到指针的转换、函数到指针的转换
  2. 0个或1个整型提升或者数值转换
  3. 0个或1个限定转换

用户定义转换:包括0个或1个非explicit的单参数构造函数或者非explicit的转换函数调用。

左值到右值的转换:任何非函数非数组类型T的泛左值可以隐式转换成同类型的纯右值
数组到指针的转换和函数到指针的转换:给兼容c擦屁股,不多说了
整形提升:小整型类型的纯右值可以转换成大整型类型的纯右值。算数运算符不接受小于int的类型作为参数,所以在左值到右值的转换后,如有必要进行整型提升。

数值转换:不同于提升,数值转换可以更改值,而且有潜在的精度损失。包括整型转换、浮点转换、浮点整形转换、指针转换布尔转换等。

  • 任何整数类型的纯右值可以隐士转换成任何其他整数类型,这种转换被称为整型转换(除了整型提升中的部分)
  • 浮点整型转换:截断小数部分

限定转换

  • 添加const or volatile

注意:安全bool的问题,使用explict类型转换函数解决

与c兼容

POD类型

c++中的pod类型是指和c语言兼容的类型,可以和c库直接交互的类型,从c++20开始这个概念被废弃,代之以其他的概念(比如说TrivialType)。
POD类型:

  1. scalar types
    包括算数类型(浮点、整型(包括布尔和字符))、枚举类型、指针类型以及这些类型的cv版本。
  2. pod classes
    首先是一个aggregate(数组类型,或者【没有私有和保护的非静态数据成员,没有用户提供的构造函数,没有虚基类、私有或者保护继承的基类,没有虚成员函数】的类类型),其次没有用户提供的拷贝赋值函数、析构函数,数据成员也不是非POD类型和引用。
  3. 以上类型的数组类型
  4. 以上类型的cv版本

p__n
491 声望10 粉丝

科学告诉你什么是不可能的;工程则告诉你,付出一些代价,可以把它变成可行,这就是科学和工程不同的魅力。


下一篇 »
learn