1、评价一下C/C++各自的特点:
- C语言是一种结构化语言,面向过程,基于算法和数据结构,所考虑的是如何通过一个过程或者函数从输入到输出。
- C++是面向对象,基于类、对象和继承,所考虑的是如何构造一个对象模型,让这个模型能够契合阈值对应的问题,通过获取对象的状态信息得到或实现过程控制。
2、头文件中的ifndef/define/endif有什么作用
- 这是C++预编译头文件保护符,保证即使文件被多次包含,头文件也只定义一次。
3、#include<file.h>与#include"file.h"的区别
- 前者是从标准库路径寻找和引用file.h,而后者是从当工作路径搜寻并引用file.h
4、在C++ 程序中调用被C编译器后的函数,为什么要加extern"C"?
- extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其他模块中使用
- extern"C"是连接申明,被extern"C"修饰的变量和函数是按照C语言方式编译和连接的。c++支持函数重载,而c语言不支持
- 解决名字匹配问题,实现C++与C的混合编程
5、const有什么用途
- 在C/C++中,可以定义const常量,修饰函数的返回值和形参。
- 在C++中,还可以修饰函数的定义体,定义类的const成员函数。被const修饰的东西受到强制保护,可以预防意外的变动,提高程序的健壮性。
6、const和#define有什么区别?
- const和#define都可以定义常量,但是const用途更广。
- const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
7、sizeof与strlen
- sizeof的返回值类型为size_t(unsigned int);
- sizeof是运算符,而是strlen是函数
- sizeof可以用类型做参数,其他参数可以是任意类型的或者是变量、函数、而strlen只能用char*参数,且必须是以’\0’结尾。
- 数组作sizeof参数时不会退化为指针,而传给strlen就会退化为指针
- sizeof是编译是的常量,而strlen要到运行才会计算出来,且是字符串中字符的个数而不是内存的大小
8、volatile关键字
- 避免编译器指令优化
9、static关键字:
- 修饰局部变量、全局变量、类中成员变量、类中成员函数
10、类型转换
- const_cast:常量指针被转化成非常量指针,并且仍然指向原来的对象。常量引用被转换成非常量引用,并且仍然指向原来的对象。
- static_cast:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
- reinterpret_cast:仅仅重新解释类型,但没有进行二进制的转换:
- dynamic_cast:动态类型转换,主要用于基类和子类之间的转换,运行时类型安全检查(转换失败返回NULL):
11、什么是内置函数(内联函数、内嵌函数)
- 在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程装出去,只要在函数首行的左端加一个关键字inline即可。
12、函数声明
- 建议在头文件进行声明,在源文件中定义,定义函数的源文件应该把含有函数声明的头文件包含进来,编译器负责验证函数的定义和声明是否匹配
- 在函数声明时指定了默认参数,如果定义函数时也指定默认参数,其值应与函数声明时一致,如果不一致,编译系统以函数声明时指定的默认参数为准,在定义函数时指定的默认参数值不起作用。
13、C++为啥可以重载?C语言为啥不支持重载?
void function(float x,float y);
- 在C语言中,编译器进行编译之后,在库中的名字为:_function
- 在C++中,编译器在进行编译之后,在库中的名字为:_function_float_float
- C++在编译时会将函数的参数类型加入函数名中,这样在代码上看函数名是一样,而在编译后函数名是不同。
- 编译在链接的阶段,都是找到相应的函数名,进行链接。
- 在C语言中,两个函数的名字一样,就会在链接时报错。
- 在C++中,两个函数的名字不相同,就不会报错。
参考书籍:《C++ Primer 第5版 中文版》