C++后台面试题汇总---持续更新中

目录

  • C/C++语言相关
    • static, const的作用?
    • 引用与指针的作用及区别?
    • 如何避免野指针?
    • malloc, free和new, delete的区别?
    • extern有什么作用?
    • 简述 strcpy, sprintf与memcpy的区别?
    • C/C++中强制类型转换的使用场景
    • 什么时候生成默认构造函数?
    • 什么时候生成默认拷贝构造函数
    • 什么是深拷贝, 什么是浅拷贝

C/C++语言相关

static, const的作用?

从以下几个方面去讨论static的作用

修饰的对象: 变量, 函数
使用场景:

  • 函数体 :只能在函数体内进行访问,其他的函数是不能访问当前函数体中的static变量, 函数中static变量的值在函数调用结束之后不会消失,且只初始化一次,再次调用该函数时,static变量的值仍然是上一次调用结束时的结果
  • 模块内分两种情况:
    • 源文件: 定义在.c或.cpp文件中,该变量只能该源文件中进行访问,也就是说在该源文件中的其他函数都可以访问此静态变量; 如果在多个模块声明同变量时, 不会产生冲突(也就是说可以对其他源文件隐藏该变量)
    • 头文件: 定义在.h文件中,所有包含该.h头文件的源文件,都可以访问该静态变量/函数

作用是避免了命名重复, 对其他源文件隐藏该变量和隔离错误的作用,有利于模块化程序

    • 成员变量
    • 成员函数: 特性, 不接受this指针,不能访问类对象的成员,只能访问static成员变量
      • 成员函数/变量都是属于整个所拥有,而不是对象

const关键字的作用:
修饰变量
两种:全局const和局部const,
**注意:**在C语言中,局部const是可以通过指针进行修改的,而在C++中,会把const修饰的所有常量会加载到符号表当中,每次获取const常量都会在符号表中查询,因此C++中的局部const成员无法修改,而全局const不管C/C++都不能通过指针修改

另外,关于const和指针的修饰,关注下图即可
在这里插入图片描述

作用

  1. 防止值修改
  2. 可以避免多次内存分配
  3. 类型检查(定义的时候可以知道什么类型),作用域检查
#define var_d 100
const int var_c = 100;
//区别
//比如,在使用过程中,需要一个赋值
int a, b;
a = var_d;
b = var_d;
//本质上这里进行了两次分配,因为仅仅是将var_d替换成100

//如果是使用const修饰的常量赋值
a = var_c;
b = var_c;
//本质上这里只赋值了一次,因为var_c是一个常量

修饰函数参数 :表示函数参数不能修改
修饰函数返回值

类中常成员函数 :不修改成员变量
只读对象只能调用常成员函数,不可以调用普通成员函数
常成员函数之鞥呢调用常成员变量以及常成员函数
类常成员函数作用 :

  1. 避免修改成员变量
  2. 用于函数重载

引用与指针的作用及区别?

区别:
是否需要初始化?

  • 指针不需要初始化,但最好初始化
  • 引用必须要初始化,且初始化对象不能为空,同时,初始化后不能改变

是否允许为空?

  • 指针可以空
  • 引用不能为空

是否直接操作对象?

  • 指针通过某个指针变量指向一个对象, 对它所指向的变量进行间接操作
  • 引用是具体对象的一个别名, 对引用操作, 就是对目标操作

是否为对象

  • 指针是对象, 是有地址的, 它可以指向指针的指针
  • 引用不是对象, 没有实际地址, 不能定义引用指针, 也不能定义引用的引用

作用:

  • 引用的作用

    • 传参,避免内存分配, 以及对象数据的复制
    • 函数返回值, 避免对象数据的复制
  • 指针的作用

    • 传参, 避免对象的数据复制
    • 多态
    • 代码复用

如何避免野指针?

什么是野指针?

  1. 某指针没有初始化, 系统会随机分配一个地址
  2. 如果使用野指针, 容易造成内存泄漏, 出现段错误

如何避免?

  1. 指针没有指向具体对象时, 初始化为空
  2. 使用指针操作指针指向的对象时, 检查是否为指针对象分配内存
  3. new, malloc分配空间后, 需要检查指针是否为空, 说明分配内存失败, 这时需要强制退出
  4. 对c来说, 需要对空间数据置空, memset
  5. 释放内存后,需要将指针置空

malloc, free和new, delete的区别?

定义:
malloc, free是c当中的函数,而new,delete是c++当中的操作符

使用方式:

new/delete malloc/free
自动计算所需分配内存 需要手动计算所需分配内存
new返回是对象类型的指针 malloc返回void*, 需要转换为所需的类型
delete释放内存是需要对象类型的指针 free是void*类型的指针
new分配失败会抛出异常 malloc分配失败会返回null
new是在free store上分配内存 malloc是从堆上分配内存

new先调用operator new, 申请足够内存, 然后调用该类型的构造函数,初始化成员变量,最后返回对象类型的指针, delete先调用析构函数,在调用operator delete函数,释放内存

注意:delete,free调用后,内存不会立即释放,指针也不会只想空,为了避免野指针,释放内存后,应该把指针指向null

extern有什么作用?

原理: 引用还没有声明的变量或者函数,这个变量或函数在其他地方声明;(不可以是静态)
使用场景:
都是C或者都是C++
C++调用C编译的变量或者函数

代码展示
文件内:

#include 

int main()
{
	extern int var_main;
	extern void func_main();  //通常都是在main函数外声明一个函数,也可以使用extern
	func_main();
	printf("main var_main = %d\n", var_main);
	return 0;
}

int var_main = 100;

void func_main()
{
	printf("func_main var_main = %d\n", var_main);
}

文件外:
extern_other.c

#include 

int var_other = 99;


void func_other()
{
	printf("func_other var_main = %d\n", var_other);
}

extern_c.c

#include 

int main()
{
	extern int var_other;
	extern void func_other();
	func_other();
	printf("main var_other = %d\n", var_other);
	return 0;
}

编译时注意

#编译中要带上extern_other.c
gcc extern_c.c extern_other.c -o extern.exe
./extern.exe

C++调用C的情况:
由于C和C++的在编译时的命名不同(C++支持重载,因此跟C的命名有区别),用法如下
加"C"
extern_cpp.cpp

#include 

extern "C" int var_other; //加"C", 需要声明在main函数外
extern "C" void func_other();

int main(void)
{
	func_other();
	var_other = 100;
	printf("main var_other = %d\n", var_other);
	return 0;
}

extern_other.c

#include 

int var_other = 99;


void func_other()
{
	printf("func_other var_main = %d\n", var_other);
}

简述 strcpy, sprintf与memcpy的区别?

C/C++中强制类型转换的使用场景

什么时候生成默认构造函数?

什么时候生成默认拷贝构造函数

什么是深拷贝, 什么是浅拷贝

你可能感兴趣的:(C++基础,Linux服务器开发,数据结构与算法,c++,开发语言)