C++常考面试题(第一篇)

【题目 1】浅谈你对 C 和 C++的理解?

1)C 语言面向过程,C++是面向对象的语言
2)C++语句是对 C 语言的扩充和包含

【题目 2】引用和指针有什么区别?或引用的特点?

引用的特点:1.引用不能单独存在(必须初始化)int num = 1; int& ref = num ;
2. 引用不可以改变指向 int num2 = 5; ref = num2;赋值操作--》 num 变成 5
3. 普通的引用,不可以用常量或者临时值初始化 int& ref = 4;错误的
区别:
引用是一个变量的别名,指针是一个变量,存的另一个变量的地址。
1.引用不能为空引用,指针可以是空指针。
2.引用赋值之后不可以改变指向,指针可以改变。
3.引用不能单独存在,指针可以。
引用必须进行初始化,指针可以随时初始化。

【题目 3】将"引用"作为函数的参数有哪些特点

void fun(int& num);不需要开辟新空间
void fun(int num); 需要生成一个临时的新变量
void fun(int* p); 指针变量需要空间的
1.传递指针和引用的相同点:都可以实现对传递过来的实参本身进行操作。
不同:
参数类型为引用和值传递:
值传递:需要为形参分配新空间,并且和原变量不是同一个变量
引用传递:没有新变量的生成,没有新空间分配
指针传递:和引用达到相同的效果,指针变量需要新空间,并且指针在代码可读性上,稍差一点
fun(&num); *p,引用操作更直观。

【题目 4】什么是常引用?常引用有什么作用

const int& ref = num;
const int& ref = 4;
特点:可以使用常量或者临时值初始化
1.常引用的引入主要是为了避免使用变量的引用时, 在不知情的情况下改变变量的值。
2.常引用常作为函数的传入形参, 避免实参在调用函数中被意外的改变。
void fun(const int& ref)只读的
{
//函数内不可以通过小名改变原变量的值,间接保护原变量
ref = 80;错误的
}

【题目 5】函数参数传递中值传递、地址传递、引用传递有什么区别?

1.值传递,形参的改变不影响实参,形参和实参只是将值传递过去,实际上地址还是两块地址,所以改变其中 一个,不会影响另一个。
2.地址传递,形参的改变会影响实参,形参中存的是实参的地址,改变形参中的值,实际上是改变它存的那块地址里的值。
3.引用传递,形参的改变也会影响实参, 形参是实参的别名,形参和实参是同一个地址,所以改变一个必然 会影响另一个。

【题目 6】c++中,static 关键字有什么作用?

类中的静态成员变量和静态成员函数。
静态成员变量:

  1. 类的内部成员用 static 进行修饰后,变为静态成员;
  2. 所有该类的对象共享这一块内存,静态成员不建议使用对象对象进行调用,可以直接通过类名进行调用。
    3.静态成员变量必须在类外声明,若未初始化则为默认值,给静态变量分配空间。
    成员函数:
    静态成员函数:1.没有 this 指针,所有只能访问静态成员变量; 2.只能调用静态成员函数。

【题目 7】const 关键字有什么作用?

const 修饰之后变为"只读"。
变量被 const 修饰变为常量,值被初始化后,不能再修改。
在 c++中,常用于修饰函数和对象。
常函数:const 修饰在形参列表的后面,常函数中的成员变量不能被修改。
void show() const { 不可以改变类中成员变量的值 }
常对象:对象中的成员属性不能被修改;只能调用常函数;
const person a;
常引用:引用中的属性值不能被修改; 可以用常量进行初始化。

【题目 8】描述一下常函数与常对象?

常函数 const 修饰在形参列表的后面,常函数中的成员变量不能被修改。
常对象 const 可以修饰在类的前面或类的后面,1)对象中的成员属性不能被修改 2)只能调用常函数。

【题目 9】c++中如何打破 const 的限制?

使用 mutable 关键字
class A
{
mutable int num;
public:
void fun() const //常函数不可以修改成员的值
{
num++;//正确的
}
};

【题目 10】const 和#define 定义常量有什么区别 (谁更安全)

  1. define 宏是在预处理阶段展开。const 常量是在编译运行阶段使用
  2. 宏没有类型,不做任何类型检查,仅仅是展开。
    const 常量有具体的类型,在编译阶段会执行类型检查,所有 const 更安全。
    3.define 宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
    const 常量会在内存中分配(可以是堆中也可以是栈中)

【题目 11】C++中结构体(struct)和类(class)有什么区别?

1.成员的默认访问权限:struct 为 public,class 为 private
2.习惯用法:复杂逻辑写在 class 类中,较小体量的,结点等,用结构体
3.默认的继承权限:struct 为 public 继承,class 为 private 继承

【题目 12】如何格式化输出 bool 类型的值?

在打印输出 bool 变量前使用 boolalpha 转换,使用 noboolalpha 解除转换。
cout << boolalpha << true << noboolalpha << endl;

【题目 13】构造函数是什么?有哪些特点?

格式:函数名和类名相同,没有返回值,可以有参数
调用时机:创建对象时,自动调用的函数
什么时候有默认的构造函数?作用是什么?
类中没有显示的定义构造函数,会存在默认的构造, 没有参数,没有逻辑
class person
{};

【题目 14】析构函数是什么?有哪些特点?

~person( ){ }
析构函数是在对象自动销毁时被系统调用的函数,作用是释放对象中开辟的内存空间,防止内存泄漏。
析构函数没有返回类型,函数名为~加类名,没有形参列表,不能被重载(每个类中只能有一个析构函数)。

【题目 15】有了 malloc/free,为什么还要 new/delete?

相同点:它们都可用于申请动态内存和释放内存。
不同点:1)malloc 与 free 是 C++/C 语言的标准库函数;
new/delete 是 C++的运算符,关键字。
2)new 申请的空间,直接进行初始化;
malloc 申请的空间没有类型,void*,需要进行强制类型转换。
补充:person* p = new person; //调用 person 类的无参构造
person* operator new (person)
{
malloc 堆空间申请空间
调用 person 的构造函数
return person*
}
对象 在创建的时候,要自动调用构造函数,对象在消亡之前要自动执行析构函数。
由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务。
因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。

结语

以上就是一些C++面试题,本次C++知识分享到此结束,后续还会发有关C++面试题。

最后的最后,还请大家点点赞,点点关注,谢谢大家!

相关推荐
谈谈叭2 小时前
Javascript中的深浅拷贝以及实现方法
开发语言·javascript·ecmascript
lx学习2 小时前
Python学习26天
开发语言·python·学习
大今野3 小时前
python习题练习
开发语言·python
爱编程的鱼3 小时前
javascript用来干嘛的?赋予网站灵魂的语言
开发语言·javascript·ecmascript
捕鲸叉4 小时前
怎样在软件设计中选择使用GOF设计模式
c++·设计模式
捕鲸叉4 小时前
C++设计模式和编程框架两种设计元素的比较与相互关系
开发语言·c++·设计模式
未知陨落5 小时前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
大波V55 小时前
设计模式-参考的雷丰阳老师直播课
java·开发语言·设计模式
无敌最俊朗@5 小时前
unity3d————接口基础知识点
开发语言·c#
一丝晨光6 小时前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++