C++中的类,结构体,构造函数和析构函数

时间:2021-08-11
本文章向大家介绍C++中的类,结构体,构造函数和析构函数,主要包括C++中的类,结构体,构造函数和析构函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

struct 和 class的区别

C++中可以通过使用struct、class定义一个类,本质上他们没有任何的区别,唯一的区别就是struct的默认成员权限是public,class默认成员权限是private

构造函数

构造函数(也叫构造器),在对象创建的时候自动调动,一般用于完成对象的初始化工作

特点:
函数名与类名同名,无返回值(void 也不写),可以有参数,可以重载,可以有多个构造函数
一旦定义了一个构造函数,就必须使用其中一个自定义的构造函数来初始化

Example

class Person {
    int m_age;
    Person() {}
    Person(int age):m_age(age){}
    void display(){
        cout << this->m_age << endl;
    }
};

Person g_p1;        //Person()
Person g_p2();      //这是一个函数声明,函数名叫g_p2,返回类型Person,无参
Person g_p3(20);    //Person(int)

int main(){
    Person p1;      //Person()
    Person p2();    //这是一个函数声明,函数名叫g_p2,返回类型Person,无参
    Person p3(20);  //Person(int)

    Person *p4 = new Person;        //Person()
    Person *p5 = new Person();      //Person()
    Person *p6 = new Person(20);    //Person(int)
    return 0;
}

注意

  1. 通过malloc分配的对象不会调用构造函数,并且需要注意的是编译器并不一定会为每一个类生成空的无参构造函数,是否生成构造函数取决于是否需要做些额外的事情(内存操作,函数调用),比如:
  2. 成员变量在声明的同事进行了初始化
  3. 有定义虚函数
  4. 虚继承了其他类
  5. 包含了对象类型的成员,且这个成员有构造函数(编译器生成或者自定义)
  6. 父类有构造函数(编译器生成或者自定义)

默认情况下成员变量的初始化

Person g_p1;        //全局区,成员变量初始化为0

int main(){
    Person p1;      //栈区不会被初始化

    Person *p2 = new Person;        //成员变量不会被初始化
    Person *p3 = new Person();      //成员变量初始化为0
    Person *p4 = new Person[3];     //成员变量不会被初始化
    Person *p5 = new Person[3]();   //3个Person对象的成员变量都初始化为0
    Person *p6 = new Person(){};    //3个Person对象的成员变量都初始化为0

    cout << "g_p1"  << g_p1.getAge() << endl;
    cout << "p1"    << g_p1.getAge() << endl;
    cout << "p2"    << g_p2->getAge() << endl;
    cout << "p3"    << g_p3->getAge() << endl;
    cout << "p4"    << g_p4->getAge() << endl;
    cout << "p5"    << g_p5->getAge() << endl;
    cout << "p6"    << g_p6->getAge() << endl;
    return 0;
}

如果自定义了构造函数,除了全局区,其他内存空间的成员变量默认都不会被初始化,需要开发人员手动初始化

Person() {
  memset(this,0,sizeof(Person));//初始化全部成员变量为0
}

析构函数

析构函数(析构器),在对象销毁的时候自动调用,一般用于完成对象的清理工作

特点:

函数名以~开头,与类同名,无返回值(void也不写),无参,不可以重载,有且只有一个析构函数

注意

通过malloc分配的对象调用free的时候不会调用析构函数
构造函数、析构函数要声明为public,才能被外界正常使用,析构函数通常用来处理对象内部申请的堆空间,在对象销毁的时候由对象内部自己回收。

class Car
{
private:
    int m_price;
public:
    Car() {};
    ~Car() {};
};

class Person {
    Car *m_car;
    Person() {
        m_car = new Car();
    }
    ~Person() {
        if(m_car == nullptr) return;
        delete m_car;
        m_car = nullptr;
    }
};

原文地址:https://www.cnblogs.com/mengqingxiang/p/15128504.html