说说类的访问权限有几种⭐⭐⭐⭐⭐
对象是值传递还是引用传递⭐⭐⭐⭐⭐
拷贝构造函数的参数类型为什么必须是引用⭐⭐⭐⭐⭐
判断构造次数和析构次数⭐⭐⭐⭐⭐
说说初始化列表的使用场景⭐⭐⭐⭐⭐
下面这个例题,Student1有几个受保护的成员?⭐⭐⭐⭐⭐
深拷贝与浅拷贝的区别⭐⭐⭐⭐⭐
实现一个string类⭐⭐⭐⭐⭐
说说this指针⭐⭐⭐⭐⭐
- 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。
- 本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。
- 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
- 针对于非科班同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。
- 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
- 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。
说说类的访问权限有几种⭐⭐⭐⭐⭐
类中成员访问属性有三种:
(1)私有成员(变量和函数)只限于类成员访问,由
private
限定;(2)公有成员(变量和函数)允许类成员和类外的任何访问,由
public
限定;(3)受保护成员(变量和函数)允许类成员和派生类成员访问,不允许类外的任何访问。所以
protected
对外封闭,对派生类开放。对象是值传递还是引用传递⭐⭐⭐⭐⭐
引用传递对象
通常,使用对象作为参数的函数时,应按引用而不是按值来传递对象,这样可以有效的提高效率。
原因
因为按值传递的时候,将会涉及到调用拷贝构造函数生成临时的拷贝,然后又调用析构函数,这在大型的对象上要比传递引用花费的时间多的多。当我们不修改对象的时候,应当将参数声明为const引用。
实例
void goodGay(Building &building){//引用传递 函数体 } void goodGay(Building building){//值传递 函数体 }
拷贝构造函数的参数类型为什么必须是引用⭐⭐⭐⭐⭐
如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。因此拷贝构造函数的参数必须是一个引用。否则无法完成拷贝,而且栈也会满。
判断构造次数和析构次数⭐⭐⭐⭐⭐
如下面的例子,判断构造次数和析构次数
#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,第三次是按值返回需要用拷贝构造函数创建临时对象。
所以一共六次构造,六次析构。
说说初始化列表的使用场景⭐⭐⭐⭐⭐
成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
const 成员或引用类型的成员。因为 const 对象或引用类型只能初始化,不能对他们赋值。
下面这个例题,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个受保护的成员.
深拷贝与浅拷贝的区别⭐⭐⭐⭐⭐
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
实现一个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; };
说说this指针⭐⭐⭐⭐⭐
在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this指针。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。
豆芽点评
这里我们开始讲到类了,类包含的考点相当多,也很重要,无论是笔试、面试,都是高频考点,甚至面试时直接让手撕一个类等等。