构造函数和析构函数

构造函数的特性:
1.名字和类名相同。
2.需要声明为 public 属性。否则创建对象时无法被调用。
3.没有返回值。函数体中不能有 return 语句,不管是声明还是定义函数名前都不能出现返回值类型,即使是 void 也不允许。
4.系统在创建对象时自动调用,不需要用户显式调用(用户也不能调用,会报错)。
5.允许重载。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数。
6.如果用户没有定义构造函数,编译器会自动生成一个函数体和形参都为空的构造函数。例:Student(){}。
7.调用没有参数的构造函数或不传参数,不能加括号!!!(不过在Visual Studio据说不会报错)

构造函数的作用:
在创建对象的时候对对象的数据成员进行初始化:
方式一:采用参数初始化表。
方式二:在构造函数的函数体中对成员变量赋值。
使用参数初始化表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简明。

析构函数的特性:
1.名字:~类名。
2.需要声明为 public 属性,否则释放对象时无法被调用。
3.没有返回值。函数体中不能有 return 语句,不管是声明还是定义函数名前都不能出现返回值类型,即使是 void 也不允许。
4.系统在释放对象时自动调用,不需要用户显式调用(用户可以调用,但无需这样做,容易导致程序异常终止)。
5.不允许重载。因此一个类只能有一个析构函数。
6.如果用户没有定义析构函数,编译器会自动生成一个默认的析构函数。
7.析构函数没有参数。

析构函数的作用:
在系统释放对象占用的内存之前进行一些清理工作,把对象所占用的额外空间归还给程序。

#include <iostream>

using namespace std;

class Student
{
public:
    // 方式一:采用参数初始化表
    Student(int a, int b) : age(a), score(b)
    {
        cout << "调用构造函数" << endl;
    }
    // 方式二:在构造函数的函数体中对成员变量赋值
    /* Student(int a, int b)
    {
        age = a;
        score = b;
        cout << "初始化完成" << endl;
    } */
    ~Student()
    {
        cout << "调用析构函数" << endl;
    }
    void printinfo()
    {
        cout << "age : " << age << endl;
        cout << "score : " << score << endl;
    }

private:
    int age;
    int score;
};

int main(int argc, char *argv[])
{
    Student stu(16, 18);
    stu.printinfo();
    return 1;
}
 
输出:
调用构造函数
age : 16
score : 18
调用析构函数

 

posted @ 2023-05-12 16:59  jason8826  阅读(16)  评论(0编辑  收藏  举报