专业编程基础技术教程

网站首页 > 基础教程 正文

C++|面试频繁被问的C++基础知识 面试c/c++的面试问题

ccvgpt 2024-10-12 13:56:31 基础教程 6 ℃

C++必知必会

1、strlen和sizeof区别?

C++|面试频繁被问的C++基础知识 面试c/c++的面试问题

sizeof是运算符,不是函数,结果在编译时得到而非运行中获得;sizeof参数可以是任何数据的类型或者数据

strlen是字符处理的库函数;strlen的参数只能是字符指针且结尾为'\0'的字符串。

因为sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小。

2、C++中struct和class区别

C++的struct可以有成员函数、公有和私有部分;任何可以使用class完成的工作,同样可以使用struct完成;

一般成员在struct默认是公有的,class则默认是私有的;class默认是private继承,而struct模式是public继承。

C中struct是用户自定义数据类型;C++中struct是抽象数据类型,支持成员函数的定义,即能实现多态。另外,C结构体中的成员不可以是函数。

一个结构标记声明后,在C中必须在结构标记前加struct关键字,才能做结构类型名;C++中结构体标记可以直接作为结构体类型名使用。

3、define宏定义和const的区别

define是在编译的预处理阶段起作用,const是在编译、运行的时候起作用;

define只做替换,不做类型检查和计算;const常量有数据类型,编译器可以对其进行类型安全检查

define只是将宏名称进行替换,在内存中会产生多分相同的备份。const在程序运行中只有一份备份;宏定义的数据没有分配内存空间,只是替换作用;const定义的变量需要分配内存空间。

4、C++中static的作用

static: 所有加static的全局变量和函数不可以在其他文件中使用,反之没有static修饰的可以在其他文件中使用。

未初始化的全局静态变量与局部静态变量,都存在全局未初始化区,且默认初始化为零。

函数内定义变量有static修饰的话,则该变量始终存在,且只进行一次初始化,其作用范围与局部变量相同,函数退出后不会被销毁,但不能使用。

类中的static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义的外部初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。

static成员函数:不具有this指针,无法访问类对象的非static成员变量;不能被声明为const、虚函数和volatile;

5、final和override关键字作用

override指定了子类的这个虚函数是重写的父类的,若函数名字输错了的话,编译器是不会编译通过。

final:不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加final关键字,添加final关键字后被继承或重写,编译器会报错.

6、重载overload和重写override

重载overload是指在同一范围内的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目不同。

重写override是派生类中覆盖基类中的同名函数,重写就是基类中某个定义为虚函数的内容。其特点是与基函数有相同参数个数、返回类型和参数类型。

7、浅拷贝和深拷贝的区别

浅拷贝:浅拷贝只是拷贝指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针的资源就会报错。深拷贝:深拷贝不仅拷贝值,还开辟出一块新的空间用来存放新的值,即使原先的对象被释放内存了,也不会影响到深拷贝得到的值。在实现拷贝赋值的时候,若有指针变量的话是需要实现深拷贝的。

8、内联函数和宏定义的区别

在编译前,宏定义为字符串替换。而内联函数可以进行参数类型检查且具有返回值。内联函数在编译时直接将函数代码嵌入到目标代码中,省去函数调用的开销提高了效率。宏定义时参数一般要括起来否则容易出现歧义。

内联函数有类型检测、语法判断等功能,但内敛函数不适合有循环语句的代码。

9、volatile、mutable和explicit关键字

volatile 声明的类型变量可以被某些编译器更改,如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当使用 volatile 声明的变量的值时,系统总是重新从它所在的内存读取数据。用于:多线程中被共享的变量,则需要volatile修饰变量。

mutable是可变的意思,在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const函数里面修改一些跟类状态无关的数据成员,那么这个就应该被mutable来修饰。

explicit用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

如果想看后续更多资源,请关注公主号:城子编程特讯


最近发表
标签列表