C++面试

笔试题:

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++中类和结构体的区别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值