文章目录
- 前言
- 1、C和C++的区别
- 2、int *p[10]和int (*p)[10]的区别
- 3、sizeof()一个数组名的大小是多少?
- 4、int和long有什么区别?
- 5、浮点数存储方式详解
- 6、static关键字详解
- 7、#define const inline
- 8、智能指针详解
- 9、引用:左值与右值详解
- 10、代码到执行全过程详解
- 11、结构体可以直接赋值吗?
- 12、volatile关键字作用
- 13、一个参数既可以是const又可以是volatile吗?
- 14、指针与常量详解
- 15、extern "C"
- 16、面向对象三大特征
- 17、多态——重载与覆写详解
- 18、一个空类的大小以及默认成员函数有哪些?
- 19、什么是面向对象?
- 20、拷贝构造函数和赋值运算符区别
- 21、C++中struct和class区别
- 22、强制类型转换运算符详解
- 23、模板特化与实例化
前言
此文章主要记录常见且简单一点的C++面试题(持续更新······)
比较复杂且重要的面试题将新开文章详细写,以链接形式放入此文章。
仅做学习记录,不做任何其他用途
1、C和C++的区别
- C是面向过程而C++是面向对象:
C++使用class来表示一个类,里面可以有变量、函数。C中只有struct,主要是作为一个数据的集合,不能有函数。C++为了兼容C而同样有struct结构,但除了保留C语言中的功能外,也有和class一样的功能,区别在于默认权限不同,struct默认public,而class默认private。 - C使用malloc/free来分配内存,而C++还引入了new/delete运算符
- C++中使用了&(引用)而C没有
- C++有函数重载,C没有
2、int *p[10]和int (*p)[10]的区别
int *p[10]
是指有一个数组名为p,其中的10个元素为整型指针。
int (*p)[10]
是指有一个指针p,指向一个数组,其中的10个元素为整型。
3、sizeof()一个数组名的大小是多少?
int arr[10];
sizeof(arr) = 4*10;
sizeof(arr[0]) = 4;
char str[] = "abcdefg";
sizeof(str) = 9;//包括'\0'
strlen(str) = 8;
如果是数组名作为了函数参数,然后又在函数内进行sizeof(arr)
,则其大小是一个指针的大小。因为,当数组作为形参时,数组名就会退化为一个指针指向该类型数组。
int i=0;
sizeof(++i) = 4;
cout<< i <<endl;//还是0
//这是因为sizeof只是计算表达式类型的大小,而不执行表达式
4、int和long有什么区别?
类型 | 16位系统 | 32位系统 | 64位系统 |
---|---|---|---|
int | 2 | 4 | 4 |
long | 4 | 4 | 8 |
5、浮点数存储方式详解
TODO
6、static关键字详解
TODO
7、#define const inline
#define
和const
区别:
- 处理阶段不一样:#define在预处理阶段展开,const在编译阶段使用;
- define没有类型检查,仅展开代码,const常量具有类型,会进行安全检查;
- 存储区不一样:#define在代码段,const常量在数据段;
- 定义域不同:#define不受限制,而const只在定义域内有效;
#define
和inline
:inline会进行安全类型检查;inline在编译期展开,并且只是给编译器一个建议,不一定采纳,而#define在预处理阶段展开;
8、智能指针详解
TODO
9、引用:左值与右值详解
TODO
10、代码到执行全过程详解
TODO
11、结构体可以直接赋值吗?
一般情况下是可以的。编译器会提供缺省的复制赋值运算符,也可自行重载,不过,当结构体中有指针成员时,需要小心。
12、volatile关键字作用
提供对特殊地址的稳定访问。
编译器可能会对某些变量进行优化,直接在寄存器中取值。加上volatile后,编译器不对其进行优化,必须去内存中获得数据。
用途:并行设备硬件寄存器、多个线程之间共享的变量
13、一个参数既可以是const又可以是volatile吗?
可以:const表示在程序内部是只读的,在编译期中不允许程序改变变量,但在程序外部环境下可能改变。volatile让编译器不优化这个变量,必须去内存中获得。
14、指针与常量详解
TODO
15、extern “C”
主要作用是在C++代码中正确调用C语言代码。加上extern "C"后,编译器会用C语言方式进行编译。
16、面向对象三大特征
封装:将事物封在一个类中,并在类中完成各种方法,只提供接口供外部使用。
继承:可以继承之前的类,保留所有功能,并且可进行拓展。
多态:一个实现方法在不同环境下进行不同的动作。
17、多态——重载与覆写详解
TODO
18、一个空类的大小以及默认成员函数有哪些?
空类大小理论上为0,但在实际中,编译器为了区分不同的空类会有1字节的大小。
提供的缺省成员函数有六个:
class anempty
{
anempty();//缺省构造函数
~anempty();//缺省析构函数
anempty(const anempty&);//默认拷贝构造
anempty& operator=(const anempty&);//赋值运算符
anempty* operator&();//取址运算符
const anempty* operator&() const;//取址运算符 const
19、什么是面向对象?
面向对象是一种思想,如将人看作一个对象,一个人具有一些属性(身高、年龄)也会有一些动作(睡觉、吃饭),将这些看作是一个对象,集合在一个类里面。
面向过程具体化的,流程化的,解决一个问题。
举个例子——洗衣服:
面向过程:用盆接水->放入衣服->放入洗衣液->清洗->拧干->晾晒
面向对象:将衣服放入洗衣机,让洗衣机清洗衣服,完成后拿出来晾晒
洗衣机就是一个类,自动完成洗衣服的一些动作。
面向对象底层其实也是面向过程的,只是把过程抽象成了一个类,进行封装,从而方便使用,易维护、易复用、易扩展。
面向对象三大特性:封装、继承、多态
20、拷贝构造函数和赋值运算符区别
stone s;
stone s1=s;//隐式调用拷贝构造
stone s2(s);//显示调用拷贝构造
stone s3;
s3=s;//赋值运算符
21、C++中struct和class区别
- 默认权限不同,class默认private,struct默认public
- class还可用于模板参数
22、强制类型转换运算符详解
TODO
23、模板特化与实例化
template<typename T>//模板函数
int compare(const T& v1,const T& v2)
{
return v1<v2;
}
//模板特化
template<> int compare<char*>(const char* const& v1, const char* const& v2)
{
//自己的具体实现,与通用模板函数逻辑不同
return strcmp(v1,v2);
}
//显式模板实例化 只做声明,处理逻辑不变
//提高效率,而不需要编译器推导
int compare<int>(const int& v1, const int& v2);
实例化:用具体值去代替模版的参数这一行为。
特化:由于某种类型的逻辑需要特殊考虑,模版的范型不能描述。所以对这种特殊情况需要单独写一个特例模版。