C++ Day11-面向对象 F 隐式构造、友元函数、内部类、局部类

189 阅读2分钟
1. 使用对象类型作为函数的参数或返回值,会存在什么问题吗?
  • 一般情况下不推荐使用对象类型作为函数的参数或返回值,因为可能会产生一些不必要的中间对象
2. C++中的隐式构造是什么?
  • 隐式构造: 会调用单参数的构造函数
// 下面两句代码等价
Animal a1(10);
Animal a2 = 10;
3. 默认构造什么时候会生成?下面代码 m_age 的值什么时候会被初始化?
class Animal {
public:
 int m_age = 10;
};
  • 总结:创建一个对象的时候,如果有事情要干(比如初始化成员变量、创建虚表)就会生成默认构造函数
  • m_age 的值会在生成的默认构造方法中生成
4. 友元函数什么时候使用?
  • 需要在函数内,访问其他类的私有成员变量时,可以将该函数声明为 友元函数
5. 什么时候使用内部类?
  • 当你需要对一个类的访问权限进行控制的时候,就使用内部类
  • 内部类不会影响外部类内存结构,换句话说内部类只是编译器的语法糖
6. 什么是局部类?
  • 局部类:在一个函数内部定义的类,称为局部类
7. 厦门函数的打印结果是什么?


#include <iostream>
using namespace std;

class Car;
class Person;

class Person {
public:
    int m_height;
    
    Person(){
        cout << "Person 无参数构造函数被调用" << endl;
    };
    
    Person(const Person &c) {
        cout << "Person 拷贝构造函数被调用了" << endl;
    }
    
    void run() {
        cout << "Person run" << endl;
    }
    
    ~Person() {
        cout << "~Person 析构函数被调用" << endl;
    }
};

class Car {
public:
    int m_age;
    Person m_owner;
    
    Car(){
        cout << "Car 无参数构造函数被调用" << endl;
    };
    
    Car(const Car &c) {
        cout << "Car 拷贝构造函数被调用了" << endl;
    }
    
    void run() {
        cout << "Car run" << endl;
    }
    
    ~Car() {
        cout << "~Car 析构函数被调用" << endl;
    }
    
};
int main() {
    cout << "main 1" << endl;
    
    Car *c1 = new Car();
    
    cout << c1->m_owner.m_height << endl;
    cout << c1->m_age << endl;
    
    
    cout << "main 2" << endl;
    
    delete c1;
    return 3;
}


  • 这个问题主要理解类对象实例c1中有非指针类型的对象实例m_owner,非指针类型的成员变量,声明周期会跟随对象实例的生命周期。
  • 打印结果如下
main 1
Person 无参数构造函数被调用
Car 无参数构造函数被调用
0
0
main 2
~Car 析构函数被调用
~Person 析构函数被调用