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是一个指针,它时时刻刻指向你这个实例本身

豆芽点评

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