C/C++教程

C++面试技术点整理(一)

本文主要是介绍C++面试技术点整理(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. 谈谈你对命名空间的理解

1.namespace 是一个关键字:随着工程量的增加,变量命名上不可避免出现重名,防止名称冲突 (在不同的命名空间中,即使 2 个变量名相同,也是 2 个不同的变量),在实际工作中,基本都 使用标准命名空间

2.命名空间只能 全局范围内 定义,不能定义在函数内部

3.命名空间内, 可以存放 变量、函数、结构体、类;也可以嵌套其他的命名空间 命名空间可以 匿名(一般不这样使用),类似静态全局变量

4.命名空间是可以 起别名 的。

2.谈谈指针和引用的区别

1. 引用是给变量起别名,内部实现是指针常量 (int* const ref = &a), 其可以简单的理解为本体指针存 放的是变量的地址

2. 引用的本质是指针常量,其指向不可修改,而指针可以改变指向

3. 引用创建的同时 必须初始化 ,指针创建的时候可以不必初始化 引用不能为空,指针可以为 NULL

4. “引用变量 ref“的内存单元保存的是"被引用变量 a "的地址 sizeof(引用) = 指向变量的大小;sizeof(指针) = 指针本身大大小

5. 引用使用的时候无需解引用,指针需要解引用 指针和引用“自增/自减运算“意义不一样

6. 在同等需求下,函数传参,引用可以将一级指针

3.谈谈对内联函数的理解

1.宏函数缺陷 1:需要将实现“加 括号”,以保证优先级的完整性

2.宏函数缺陷 2:即使加了括号,有些情况,依然有缺陷

3.内联函数本身是一个真正的函数,但宏函数不是函数

4.内联函数具有普通函数的所有行为唯一不同处:内联函数会在适当的地方像定义宏一样展开,可以 以空间换时间。因此,内联函数既可以避免宏函数的缺陷,也可以避免普通函数入栈的时间浪费

5.在普通函数函数面前加上 inline 关键字,否则视为普通函数

6.如果有函数声明,函数本身和声明必须同时加 inline 关键字,否则视为普通函数

7.任何在“类”内部定义的函数会自动成为内联函数

下列情况,普通函数即使指定为内联函数,编译器也可能考虑不按内联编译:

(1) 存在任何形式的循环语句

(2) 存在过多的条件判断语句

(3) 函数体过于庞大

(4) 对函数进行取址操作

使用方法建议:

(1) 内联仅仅只是给编译器一个建议,编译器不一定或接受这种建议

(2) 如果你没有将函数声明为内联函数,那么编译器也可能将此函数作内联编译(一个好的编 译器将会内联小的,简单的函数)。因此,不用可以使用内联函数,可以交给编译器去自行 处理。

4.谈谈函数的重载条件

1.函数重载:在 C 语言中,函数名必须是唯一的,程序中不允许出现同名的函数。在 C++ 中是允许 出现同名的函数,即在同一作用域内,具有相同函数名,不同参数列表的一组函数,称为函数重载

2.函数重载实现的原理:

                编译器为了实现函数重载,是做了一些幕后的工作,编译器用不同的参数类型来修饰不同的 函数名,比如 void func(); 编译器可能会将函数名修饰成 func ,当编译器碰到 void func(int x), 编译器可能将函数名修饰为 func_int, 当编译器碰到 void func(int x,char c), 编译器可能 会将函数名修饰为 func_int_char ,这里使用“可能”这个字眼是因为编译器如何修饰重载的函 数名称并没有一个统一的标准,所以不同的编译器可能会产生不同的内部名。

3.函数重载实现的条件:

        同一个作用域,参数的个数不同,参数的类型不同,参数的顺序不同

5.谈谈C与C++钟struct的不同点

1.c语言中的struct只有数据;c++中的struct不止有数据,还有函数

6.如何理解C++的封装性

封装特性主要包含两个方面,一个是属性和变量合成一个整体,一个是给属性和函数增加一个访问 权限

7.谈谈你对 C++ 构造和析构的理解

1.对象的初始化和清理也是两个非常重要的安全问题,一个对象或者变量没有初始化,对其使用后果 是未知,同样的使用完一个变量,没有及时清理,也会造成一定的安全问题。 C++ 为了给我们提供这种问题的解决方案,构造函数和析构函数,这两个函数会将被编译器自动调用,完成对象初始化和对象的清理工作。

2.构造函数主要作用在于创建对象时为对象的成员属性赋值。析构函数由编译器自动调用,无须手动 调用。主要用于对象销毁前系统自动调用,执行一些清理工作。

8. 构造函数的分类

1.按参数类型:分为无参构造函数和有参构造函数

2.按类型分类:普通构造函数和拷贝构造函数(复制构造函数)

9. 构造函数的调用规则

1.默认情况下,C++ 编译器至少为我们写的类增加 3 个函数:默认构造函数(无参,函数体为 空)、默认析构函数(无参,函数体为空)、默认拷贝构造函数,对类中非静态成员属性简单拷贝

2.如果用户定义构造函数, C++ 不会再提供任何默认构造函数;如果用户定义了普通构造(非拷 贝), C++ 不再提供默认无参构造,但是会提供默认拷贝构造。

10. 谈谈你对浅拷贝和深拷贝的区别

浅拷贝:同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立 的两个对象,这种情况被称为浅拷贝。一般情况下,浅拷贝没有任何副作用,但是当类中有指针, 并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。

深拷贝:当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷 贝构造函数,自行给指针动态分配空间,深拷贝。

这篇关于C++面试技术点整理(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!