C++ Day07 面向对象 B 构造函数、析构函数、继承的作用

217 阅读3分钟
1. C++ 中创建出来的对象可以放在几个地方?
  • 全局区(数据段):全局变量
  • 栈区:函数里面的局部变量
  • 堆区:动态申请内存(malloc、new 等)
2. 构成函数什么时候被调用?通常拿来完成什么事情?C++调用 malloc 申请对象内存会调用构造函数吗?
  • 构造函数:在对象创建的时候会自动调用,一般用于完成对象的初始化操作。
  • 通过 malloc 分配的对象不会调用构造函数
3. C++ 中如果没有自定义构造函数,编译器会默认生成一个无参的构造函数吗?
  • 不一定,需要分场景
  • 正确定义:在某些特定的情况下,编译器才会为类生成空的无参的构造函数
// 这种情况就不会调用默认的无参构造函数
struct Person {
    int m_age;
};

int main() {
    Person person;
    person.m_age = 10;
    return 0;
}
// 这种情况就会调用默认的无参构造函数
struct Person {
    int m_age = 0;
};

int main() {
    Person person;
    person.m_age = 10;
    return 0;
}
4. 思考下面的代码:调用了几次无参构造函数?调用了几次有参构造函数?
#include <iostream>
using namespace std;

struct Person {
    int m_age;
    Person() {
        cout << "Person::Person" << endl;
    }
    Person(int age) {
        m_age = age;
        cout << "Person::Person(int age)" << endl;
    }
};

Person person;
Person person1();
Person person2(10);

int main() {
    Person person;
    Person person1();
    Person person2(20);
    
    Person *p0 = new Person;
    Person *p1 = new Person();
    Person *p2 = new Person(30);
    return 0;
}
  • 结果如下:调用了 4 次无参构造函数;3 次有参构造函数
  • 注意点:其中有两个是函数声明啊
// 输出日志如下
Person::Person
Person::Person(int age)
Person::Person
Person::Person(int age)
Person::Person
Person::Person
Person::Person(int age)
Program ended with exit code: 0
5. 什么是析构函数?通过 malloc 的对象,在 free 的时候会调用析构函数吗?
  • 析构函数:对象销毁之前会自动调用的函,通常在函数中做一些内存的释放工作
  • 通过 malloc 的对象,在 free 的时候不会调用析构函数
6. 什么是声明和实现的分离?有什么用?
  • 明放在 .h 文件中,实现放在.cpp 文件中
  • .h 文件只有方法的声明,在.cpp 中用Person::setAge(){}这种方式进行方法实现
  • 作用:可以只对外暴露声明,而隐藏代码的具体实现。
7. C++如何定义命名空间?如何使用命名空间?命名空间的本质是什么?有一个默认命名空间如何调用?
  • 定义:namespace LP {int g_age;}
  • 使用: using namespace LP; 或者 using LP::g_age
  • 本质:类似 OC 的做法,给命名空间内的东西加上前缀
  • 默认命名空间:也就是全局命名空间,调用如下 ::func()
// 下面两句 C 语言代码,如果进行转汇编
g_age = 13;
LSP::g_age = 14;
// 最终的汇编实现,可以看到命名空间,就是进行名字的替换
mov     cs:_g_age, 0Dh
mov     cs:__ZN3LSP5g_ageE, 0Eh ; LSP::g_age
8. 继承的作用?
  • 作用:继承就是把公共的数据和方法抽取到父类中,子类中放各自独有的数据和方法,从而实现代码的复用
  • C++ 中的继承,就相当于将父类的代码,直接剪贴到子类的头部
9. 成员访问权限、继承方式有三种权限,是哪三种?
  • public:公共的,任何地方都可以访问(struct 默认)
  • protected:子类内部、当前类内部可以访问
  • private:私有的,只有当前类内部可以访问(class 默认)
10. 子类内部访问父类成员变量权限,是哪两种权限综合决定的?
  • 子类内部访问父类成员的权限,是以下 2 项中权限最小的那个决定的
  • 成员本身的在父类的访问权限
  • 子类继承父类时的访问权限
11. struct 的默认继承方式的访问权限是什么?class 的呢?
  • struct 默认是 public 继承
  • class 默认是 private 继承
  • 所以经常看到类似代码:class Student : Public People{}