1. C 语言中的类型转换有哪两种?C++ 中的类型转换有哪四种?
C 语言: (type)expression、type(expression)
C++: static_cast、dynamic_cast、reinterpret_cast、const_cast
C++使用格式: xxx_cast(expression)
- 类型转换的本质(仔细品):
强制类型转换大部分时候是在欺骗编译器,让代码编译通过
2. const_cast
- 一般用于去除 const 属性,将 const 转换成非 const
const Person *p1 = new Person();
cout << p1->m_age << endl;
Person *p2 = const_cast<Person *>(p1);
p2->m_age = 20;
cout << p1->m_age << endl;
cout << p2->m_age << endl;
3. dynamic_cast
- 一般用于多态类型的转换,有运行时安全检测
- 运行父类指针指向子类实例,不允许子类指针指向父类实例
Person *p1 = new Person();
Person *p2 = new Student();
cout << "p1 - " << p1 << endl;
cout << "p2 - " << p2 << endl;
Student *stu1 = dynamic_cast<Student*>(p1);
Student *stu2 = dynamic_cast<Student*>(p2);
cout << "stu1 - " << stu1 << endl;
cout << "stu2 - " << stu2 << endl;
4. static_cast(了解即可)
- 对比 dynamic_cast , 缺乏运行时安全检测
- 不能交叉转换(不是同一继承体系的,无法转换)
- 用于基本数据类型转换,非 const 转成 const
5. reinterpret_cast
- 属于比较底层的强制转换,没有任何类型检查和格式转换,仅仅是
简单的二进制数据拷贝
- 可以交叉转换
- 可以将指针和整数相互转换
Person *p1 = new Person();
Person *p2 = new Student();
cout << "p1 - " << p1 << endl;
cout << "p2 - " << p2 << endl;
Student *stu1 = reinterpret_cast<Student*>(p1);
Student *stu2 = reinterpret_cast<Student*>(p2);
stu1->m_age = 20;
stu2->m_age = 21;
cout << "stu1 - " << stu1 << " m_age - " << stu1->m_age << endl;
cout << "stu2 - " << stu2 << " m_age - " << stu2->m_age << endl;
int i = 10;
double d1 = reinterpret_cast<double &>(i);
cout << "i - " << &i << " d1 - " << &d1 << endl;
cout << "d1 - " << d1 << endl;
6. 计算机中浮点数的存储分为哪三段数据?
- 从左到右:符号位、指数位、尾数部分
- 5.23561e-307 经典的浮点数表示法
7. auto 关键字的作用?auto 会影响程序的运行效率吗?
- auto 可以从初始化表达式中推断出变量的类型,大大简化了编程工作
- auto 属于编译器特性(可能会影响编译效率);不影响最终的机器码质量,不影响运行效率
8. nullptr 对比 NULL 有特别作用?
nullptr 专门用于表示空指针,可以解决 NULL 的二义性问题,而 NULL 可以表达任何为空的数据
9. C++ lambda 表达式格式如何?本质是什么?

10. 一些 lambda 表达式的经典写法?
int main() {
([] {
cout << "lambda1()-------" << endl;
})();
void (*p2)() = [] {
cout << "lambda2()-------" << endl;
};
p2();
int (*sum)(int, int) = [] (int a, int b) -> int {
return a + b;
};
cout<< sum(1, 2) << endl;
int a = 10;
int b = 0;
auto p4 = [a]() {
cout << "lambda4()-------" << a << endl;
};
a = 14;
p4();
auto p5 = [=]() {
cout << "lambda4()-------" << a << " b: " << b << endl;
};
a = 15;
p5();
auto p6 = [&a]() {
cout << "lambda4()-------" << a << endl;
};
a = 16;
p6();
auto p7 = [&]() {
cout << "lambda4()-------" << a << " b: " << b << endl;
};
a = 17;
b = 27;
p7();
}