第四章:01构造函数
代码运行环境
本节教程所有代码都是在win11系统,Qt 5.12.12版本,mingw编译工具环境编写运行。创建的工程类型为Qt Console Application。
1.构造函数
1.1默认构造函数、构造函数重载
构造函数是特殊的成员函数,当创建类的对象时,系统会自动调用构造函数。构造函数是为了保证对象的每个成员都被正确初始化。
构造函数有以下几个特点:
- 函数名和类名完全相同
- 不能定义构造函数的类型(返回类型),也不能使用void
- 通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用
- 构造函数被声明为私有有特殊的用途
- 构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载)
#ifndef TEST_H
#define TEST_H
class Test
{
public:
//声明为私有则不能被调用
//如果类不提供任何一个构造函数,系统将提供一个默认的构造函数
Test();
//构造函数重载
Test(int num);
private:
int mNum;
};
#endif // TEST_H
#include "test.h"
#include <iostream>
using namespace std;
//不带参数的构造函数称为默认构造函数
Test::Test()
{
mNum = 0;
cout << "Initializing Default" <<endl;
}
//构造函数重载
Test::Test(int num)
{
mNum = num;
cout << "Initializing Default" << num <<endl;
}
1.2 构造函数和new运算符
构造函数创建的对象是在栈内存中,当程序退出,系统会自动释放内存,new运算符创建的对象是在堆内存中,当程序退出,系统不会释放堆内存。
#include <QCoreApplication>
#include "test.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test t; //默认构造函数
Test t2(10); //带参数的构造函数
//使用new运算符,有两个操作,分配内存,创建对象
Test* t3 = new Test(20); //new 运算符
//使用new运算符,要清除对象,必须调用delete运算符清除内存。
delete t3; //delete不仅释放内存,还调用了析构函数
return a.exec();
}
1.3 全局构造函数先于main函数执行
#include <QCoreApplication>
#include "test.h"
#include <iostream>
using namesapce std;
//在这里调用构造函数
Test t(10);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//观察打印结果输出顺序,将发现,先会打印 Test对象初始化
cout <<"entering main..." << endl;
cout << "exiting main..." <<endl;
return a.exec();
}
2.析构函数
2.1 析构函数的特点
析构函数是销毁对象的函数,不带任何参数,不能被重载。析构函数的特点如下:
- 函数名和类名相似(前面多了一个字符"~")
- 没有返回类型
- 没有参数
- 析构函数不能被重载
- 如果没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下:
classname::~xigouFun()
{
}
- 默认析构函数是一个空函数
#ifndef TEST_H
#define TEST_H
class Test
{
public:
//声明为私有则不能被调用
//如果类不提供任何一个构造函数,系统将提供一个默认的构造函数
Test();
//构造函数重载
Test(int num);
//这是析构函数
~Test();
private:
int mNum;
};
#endif // TEST_H
#include "test.h"
#include <iostream>
using namespace std;
Test::Test()
{
mNum = 0;
cout << "Initializing Default" <<endl;
}
//构造函数重载
Test::Test(int num)
{
mNum = num;
cout << "Initializing Default" << num <<endl;
}
//析构函数
Test::~Test()
{
cout << "Destory" << mNum << endl;
}
2.2 析构函数与delete运算符
析构函数可以除类构造函数创建的对象,但是使用new运算符创建的对象就必须用delete进行删除。要注意在处理对象和对象数组的时候,delete运算符的使用方法。
#include <QCoreApplication>
#include "test.h"
#include <iostream>
using namesapce std;
//在这里调用构造函数
Test t(10);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test t[2] = {10,20};
Test* t2 = new Test(2); //这样写是创建一个对象;new Test[2]这样是创建两个对象指针
// 通过new方法新建的要用delete去清除,删除单个对象
delete t2;
//若是对象数组,则用下面的方法删除
Test* t3 = new Test[2];
delete[] t3;
return a.exec();
}