蒋豆芽的面试题专栏(7/C++类)

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

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

  3. 拷贝构造函数的参数类型为什么必须是引用⭐⭐⭐⭐⭐

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

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

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

  7. 深拷贝与浅拷贝的区别⭐⭐⭐⭐⭐

  8. 实现一个string类⭐⭐⭐⭐⭐

  9. 说说this指针⭐⭐⭐⭐⭐

img
  • 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。
  • 本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。
  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
  • 针对于非科班同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。
  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。
img
  1. 说说类的访问权限有几种⭐⭐⭐⭐⭐

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

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

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

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

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

    1. 引用传递对象

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

    2. 原因

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

    3. 实例

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

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

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

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

    #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,第三次是按值返回需要用拷贝构造函数创建临时对象。

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

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

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

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

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

    class Student{  
    public:  
        void display();  
    protected:  
        int num;  
        string name;  
        char sex;  
    };  
    
    class Student1:protected Student{  
    public:  
        void display1();  
    private:  
        int age;  
        string addr;  
    }; 

    保护继承中,基类的公有成员和保护成员被派生类继承后变成保护成员。所以Student1有4个受保护的成员.

  7. 深拷贝与浅拷贝的区别⭐⭐⭐⭐⭐

    浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存

    深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
    图片说明

  8. 实现一个string类⭐⭐⭐⭐⭐

    #include <iostream>  
    #include <cstring>  
    #include <vector>  
    using namespace std;  
    
    class MyString{  
    
    public:  
        //构造函数  
        MyString(const char* str = nullptr) {  
            if (str != nullptr) {  
                m_data = new char[strlen(str) + 1];  
                strcpy(m_data, str);  
            }  
            else {  
                m_data = new char[1];  
                *m_data = '\0';  
            }  
        } 
    
        // 拷贝构造函数  
        MyString(const MyString& other) {    
            m_data = new char[strlen(other.m_data) + 1];  
            strcpy(m_data, other.m_data);  
        }  
    
        // 拷贝赋值函数 =号重载  
        MyString& operator=(const MyString& other) {  
            if (this == &other) // 避免自我赋值!!  
               return *this;  
    
            delete[] m_data;  // 先释放原来的空间
            m_data = new char[strlen(other.m_data) + 1];  
            strcpy(m_data, other.m_data);  
            return *this;  
        }  
    
        ~MyString() {  
            delete[] m_data;  
            m_data = NULL;  
        }  
    private:  
        char* m_data;  
    };  
  9. 说说this指针⭐⭐⭐⭐⭐

    在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this指针。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址

    对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?

    this是一个指针,它时时刻刻指向你这个实例本身

豆芽点评

这里我们开始讲到类了,类包含的考点相当多,也很重要,无论是笔试、面试,都是高频考点,甚至面试时直接让手撕一个类等等。

- 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,总结出了高频面试考点(附有答案)共计309道,事半功倍,为大家春秋招助力。 - 本专栏内容分为七章:共计309道高频面试题(附有答案)

全部评论
第八题,string类编译无法通过啊
点赞 回复 分享
发布于 2021-04-04 15:49
针对于非科班和基础不太好的同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。本专刊采用讲故事的形式为大家串联、呈现每一个知识点,做到有趣有干货、通俗易懂,春秋招本是痛苦难捱的过程,我希望通过自己讲故事能缓解大家的压力与焦虑,并将知识轻松学到手。网址:https://www.nowcoder.com/tutorial/10078/index
点赞 回复 分享
发布于 2021-04-01 21:00
我将所有题目都汇总到了一篇文章中,这样方便大家学习。https://blog.nowcoder.net/n/ee923114ff7b4df980e99747493ed054
点赞 回复 分享
发布于 2021-03-23 13:23

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 15:00
教授A:“你为什么要讲这么久,是要压缩我们对你的评议时间吗?你们别以为这样就能够让我们对你们少点意见。”&nbsp;“从你的发言和论文格式就能知道你的性格啊。”…….&nbsp;感觉被狠狠霸凌了。
码农索隆:“教授您好,首先我想回应您提出的两点疑问。” “关于我讲解时间较长的问题:这绝非为了压缩各位老师的评议时间。这份毕业设计是我过去几个月倾注了全部心血的作品,从构思、实验、调试到撰写,每一个环节都反复打磨。我深知时间宝贵,所以选择详细讲解,是希望能更完整、清晰地展示它的核心创新点、实现过程和验证结果,确保老师们能充分理解它的价值和我的努力。我完全理解并重视评审环节的意义,也做好了充分准备来听取各位老师的专业意见和批评。几个月的研究都坚持下来了,我怎么可能害怕老师们的点评呢?今天站在这里,正是抱着虚心学习、诚恳求教的态度而来。” “如果我的展示确实超时,影响了后续流程,烦请老师们随时示意,我会立刻调整。我非常期待并预留了充足的时间,希望能听到老师们宝贵的建议和深入的讨论。” “其次,关于您提到‘从发言和论文格式就能知道我的性格’。教授,我对此感到非常困惑和不安。学术研究和答辩的核心,难道不应该是作品本身的质量、逻辑的严谨性、数据的可靠性和结论的合理性吗?论文格式有明确的规范要求,我尽最大努力遵循了这些规范。如果格式上存在疏忽或不足,这属于技术性、规范性的问题,恳请老师们具体指出,我一定认真修改。但将格式问题或个人表达风格(如讲解时长)直接上升为对个人性格的评判,甚至以此作为质疑我学术态度和动机的依据,这让我感到非常不公平,也偏离了学术评议应有的客观和严谨原则。” “我尊重每一位评审老师的专业权威,也衷心希望能得到老师们对我的工作内容本身的专业指导和批评指正。任何基于研究本身的意见,无论多么尖锐,我都会认真聆听、反思并改进。但我恳请老师们,能将评议的焦点放在我的研究本身,而不是对我个人进行主观的推断或评价。谢谢各位老师。”
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务