【题目 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 关键字有什么作用?
类中的静态成员变量和静态成员函数。
静态成员变量:
- 类的内部成员用 static 进行修饰后,变为静态成员;
- 所有该类的对象共享这一块内存,静态成员不建议使用对象对象进行调用,可以直接通过类名进行调用。
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 定义常量有什么区别 (谁更安全)
- define 宏是在预处理阶段展开。const 常量是在编译运行阶段使用
- 宏没有类型,不做任何类型检查,仅仅是展开。
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++面试题。
最后的最后,还请大家点点赞,点点关注,谢谢大家!