第四章: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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值