C++说爱你不容易面试题-4

常考面试题

  1. 说说面对对象和面对过程的区别?⭐⭐⭐

    两者的区别就在于:面向过程的编程思想,就是关注问题解决的过程,按顺序一步一步执行解决问题。而面向对象的编程思想,是把构成问题的各个事务分解成各个对象,即问题建模。建立对象的目的不是为了完成一个步骤,而是为了描述一个事务在解决问题中经过的步骤和行为

  2. 说说类的访问权限有几种⭐⭐⭐⭐

    类中成员访问属性有三种:

    (1)私有成员(变量和函数)只限于类成员访问,由private限定;

    (2)公有成员(变量和函数)允许类成员和类外的任何访问,由public限定;

    (3)受保护成员(变量和函数)允许类成员和派生类成员访问,不允许类外的任何访问。所以protected对外封闭,对派生类开放。

  3. 对象是值传递还是引用传递⭐⭐⭐⭐⭐

    1. 引用传递对象

      通常,使用对象作为参数的函数时,应按引用而不是按值来传递对象,这样可以有效的提高效率。

    2. 原因

      因为按值传递的时候,将会涉及到调用拷贝构造函数生成临时的拷贝,然后又调用析构函数,这在大型的对象上要比传递引用花费的时间多的多。当我们不修改对象的时候,应当将参数声明为const引用。

    3. 实例

      void goodGay(Building &building){//引用传递
          函数体
      }
      
      void goodGay(Building building){//值传递
          函数体
      }
  4. 拷贝构造函数的参数类型为什么必须是引用⭐⭐⭐⭐⭐

    如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。因此拷贝构造函数的参数必须是一个引用。否则无法完成拷贝,而且栈也会满。

  5. 判断构造次数和析构次数⭐⭐⭐⭐⭐

    如下面的例子,判断构造次数和析构次数

    #include <iostream>
    using namespace std;
    class Myclass{
    public:
        Myclass(int n){number=n;} //构造函数
        Myclass(Myclass &other) {number=other.number;}//拷贝构造函数
        ~Myclass(){}//析构函数
    private:
        int number;
    };
    
    Myclass fun(Myclass p){
        Myclass temp(p);
        return temp;
    }
    
    int main(){
        Myclass obj1(10),obj2(0);
        Myclass obj3(obj1);
        obj2=fun(obj3);
        return 0;
    }

    解析:

    (1)Myclass obj1(10),obj2(0); 这条语句调用了两次构造函数

    (2)Myclass obj3(obj1); 这条语句直接调用了一次拷贝构造函数

    (3)obj2=fun(obj3); 这条语句调用了三次拷贝构造函数,第一次是参数按值传递,使用拷贝构造函数创建了一个临时对象。第二次是函数内部使用拷贝构造函数初始化局部对象temp,第三次是按值返回需要用拷贝构造函数创建临时对象。

    所以一共六次构造,六次析构。

  6. 说说友元函数⭐⭐⭐

    1. 定义

      类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数

      友元可以是一个函数,该函数被称为友元函数

    2. 声明方式

      如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend

    3. 调用方式

      可以直接调用友元函数,不需要通过对象或指针

    4. 缺陷

      友元函数有权访问类的所有私有(private)成员和保护(protected)成员。破坏了类的封装性,并不建议使用友元

  7. 说说初始化列表的使用场景⭐⭐⭐⭐⭐

    1. 成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

    2. const 成员引用类型的成员。因为 const 对象或引用类型只能初始化,不能对他们赋值。

  8. 构造函数和初始化列表谁效率高?⭐⭐⭐⭐⭐

    初始化列表效率高。因为比构造函数构造对象时,少一次对象拷贝。

  9. 下面这个例题,Student1有几个受保护的成员?⭐⭐⭐⭐⭐

    class Student{  
    public:  
        void display();  
    pro

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>

全部评论
请问5.3中,第一次使用拷贝构造函数创建了一个临时对象,再把这个临时对象传递给fun()的形参p时,是否会调用拷贝构造函数完成初始化p?(Myclass p = 临时)是否应该是七次构造,七次析构?
1 回复 分享
发布于 2023-08-28 22:11 湖北
nullptr调用成员函数可以吗?为什么?⭐⭐⭐⭐ 这一题补充一下:如果成员函数是虚函数的话,运行就会出现段错误,因为调用虚函数会在运行时进行动态绑定。
1 回复 分享
发布于 2023-05-03 15:30 广东
实现一个string类的复制构造函数是不是有问题,m_data是私有变量,你函数参数中的other怎么可以直接调用自己的私有变量?
点赞 回复 分享
发布于 2022-08-11 22:07
请问 5.3 中  判断构造次数和析构次数⭐⭐⭐⭐⭐ 第三次是按值返回需要用拷贝构造函数创建临时对象。 原因是栈区生成的对象在成员函数结束时会被释放,所以需要再生成拷贝构造函数生成的临时对象赋值?
点赞 回复 分享
发布于 2022-03-10 14:02

相关推荐

04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
每晚夜里独自颤抖:把华北改为华南再试一试,应该就没啥问题了。改完可能都不用投,别人主动联系了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务