笔试题:
1 指针和引用有什么区别
指针占用空间,引用不占内存
存在多级指针,不存在多级引用
指针可以不初始化,引用必须初始化
指针可以指向不同的变量,引用只能引用同一个变量
指针可以指向数组,引用无法引用数组
引用实际上的底层代码是用指针实现的。指针是一种底层机制,引用是一种语法层面的高层机制,从语言概念上来讲引用是一个变量的别名,将地址这一概念隐藏了,实际上在使用引用运行程序的过程中,依然需要地址。
笔试题2:
请描述malloc、free与new、delete的区别
malloc free 是c库函数,new delete是c++运算符
malloc free 不做类型检查, new delete 要做类型检查
malloc free 仅仅开辟释放内存,new delete除了开辟释放内存外,还会调用构造析构函数
malloc free管理的是堆空间,new delete管理的是“自由存储区”(也是堆空间)
3、 在C语言中,const关键字修饰变量时,会将变量变成只读变量,无法直接修改变量的值,需要通过指针间接修改变量的值
C++中,const关键字修饰变量,会将变量变成常量。无法使用指针进行修改
3、深拷贝与浅拷贝
深拷贝:是含有内存空间的重新开辟过程的拷贝构造函数
浅拷贝:仅仅是值的复制过程
4、构造函数与析构函数、拷贝构造函数
构造函数:时机---在对象被创建的那一刻,自动调用,
作用---- 利用特定的值构造处对象 ,将对象初始化成一个特定的状态
特点:可以重载,与类名相同,但是不能有二义性,用户不定义,系统会自定义一个
析构函数:
时机:在一个类对象离开作用于时自动调用
作用:在对象的生命周期结束时,释放内存,结束对象的生命周期
特点:不带返回值,不带参数,用户不定义,编译会自动生成的,
命名:~A()
拷贝构造函数:一个已经有的对象初始化新对象时,新对象会调用拷贝构造函数将已有的对象成员赋值给自己,将自己的成员进行没存的分配和初始化,初始的对象源于自己的已有的对象
例子:Demo obj1(1,2);
Demo obj2=obj1;
时机:已有对象初始化新对象是调用
作用:新对象通过拷贝构造函数,生成基于原对象的对象,
特点:与类名相同,没有返回值,没有重载,参数是对象的引用,用户不自定义,编译器就自动嗲调用隐藏的函数
应用场景:一个已有对象给新对象赋值
对象充当函数形参
对象充当函数返回值
5、 类和对象的描述(类和对象的区别)
①类是一个抽象的概念,不存在与时间和空间之中,只是为一类相同的对象定义了抽象的属性和行为
②对象是类产生的一个具体的东西
③类是一个静态的概念,类本身不携带任何数据,当没有为类创建任何对象时,类本身不存在与内存空间中
④对象是一个动态的概念,每一个对象都存在着区别于别的对象的自己独特属性和行为,对象的属性随着他自己的行为而发生改变
6、你如何理解类的抽象过程
从一类 具体的事物抽出,概括出他们相同的属性与行为。个别的不同的属性和行为可舍弃。
7、 你如何理解面向过程和面向对象
8、内联函数
9、内联函数和宏有什么区别
宏是在预处理进行操作,内联函数是在编译时操作
宏不做类型检查,内联函数需要做类型检查
宏无法访问类的私有成员,类的内联函数是有可能访问到类的私有成员
宏仅仅是在预处理时将代码展开不需要额外的空间和时间,而内联函数需要额外的空间,因此调用一个宏的效率要高于调用一个内联函数。
10、 哪些运算符不能重载?
. 点运算符
:: 作用域区分符
.* 点星运算符,指向类的成员的指针
?: 条件运算符
11、
类模板中的成员函数,是否都是函数模板?
类模板本身需要两次编译,意味着类模板中的成员在真正能够运行前都需要两次编译。所以类模板中的成员函数都是函数模板
12、
笔试题:
如果一个类有继承关系,又是组合类,则这个类实例化时构造顺序是什么?
原则:
先调用基类构造函数,后调用内嵌类对象的构造函数,最后执行组合类构造函数函数体;
如果有多继承,则基类的构造函数调用顺序和继承时声明顺序一致;如果有多个内嵌类对象,则内嵌类对象的构造顺序和内嵌类对象在组合类内的声明顺序有关。
13、
面试题:请你谈一谈多态?
概念:同样的消息结合不同的对象,导致不同的行为(相同的函数名,根据调用时上下文不同产生不同的行为)
实现多态的方式:函数重写实现多态、函数模板模板实现多态、虚函数实现多态
通过虚函数实现多态,实现的条件是:
作用域不同,满足类型兼容性原则
函数原型一样,同名、同参、同返回值
有virtual关键字修饰,声明为虚函数
通过指针或者引用来访问类的虚函数
实现过程:
父类:
virtual void fun();//原型声明<虚函数>
子类:void fun(){//类外实现的成员函数<xuhan>
}
请你说说多态的分类?
两类:运行多态和编译多态
编译多态:强制多态、参数多态、重载多态
运行多态:包含多态:虚函数重写
意义:设计模式的基础、是框架的基石
理论基础:虚函数表的函数指针做函数参数
原理:vptr指针,虚函数表,存储着类成员的函数指针
虚函数、虚表
14、
笔试面试题:
1 对象中的虚表指针什么时候被初始化?
虚表指针被构造函数初始化,就是对象声明的时候,执行构造函数的完,对象的前四个字节就会生成指向函数虚表的指针--vptr
3 构造函数能不能声明成为虚函数 不会被继承,即使写在了虚表中,后续的子类用不了
4 是否类中的每个成员函数都能被声明称为虚函数 ×:构造 拷贝 静态
5 请说出重载和重写的区别?
重载:构造函数重载,作用与相同,在同一个类作用域,函数名相同,参数类型和个数各不相同,有无virtual关键字均可
重写:作用域不同,函数名相同,返回值,参数类型和个数均相同,必须有virtual关键字
6 虚函数表在被编译器初始化的过程你是如何理解的
7 虚函数多态的实现原理(详细说明虚函数的工作过程)
22、
class myString{
private:
char* pStr;
public:
myString(const char* pStr = nullptr);
~myString();
myString(myString& pObj);
myString operator+(myString& obj);
myString& operator=(myString& obj);
};
写出成员函数。
23 C++中类和结构体的区别