C++——构造函数与析构函数的恩怨情仇 – 作者:Johnson666

构造函数

在类的实例进入其作用域时,也就是建立一个对象,构造函数就会被调用,那么构造函数的作用是什么呢?当建立一个对象时,常常需要做某些初始化的工作,例如对数据成员进行赋值设置类的属性,而这些操作刚好放在构造函数中完成。

类的构造方法如下:

class Person
{
    public:
    Person();  //构造函数
    int index;
    int getIndex();
};

Persn::Person()
{
    index = 10;
}

Person()是默认构造函数,如果不显式地写上函数的声明也可以。
构造函数是可以有参数的,修改上面的代码,使其构造函数带有参数。例如:

class Person
{
    public:
    Person(int Index);  //构造函数
    int index;
    int setIndex(int Index);
};

Person::Person(int Index)
{
    index = Index;
}

下面来个例子:

#include<iostream>
using namespace std;

class Person
{
public:
	Person();
	Person(int iIndex,short m_shAge,double m_dSalary);
	int m_iIndex;
	short m_shAge;
	double m_dSalary;
	int getIndex();
	short getAge();
	double getSalary();
};

Person::Person()
{
	m_iIndex = 0;
	m_shAge = 10;
	m_dSalary = 100;
}

Person::Person(int iIndex,short m_shAge,double m_dSalary)
{
	m_iIndex = iIndex;
	m_shAge = m_shAge;
	m_dSalary = m_dSalary;
}

int Person::getIndex()
{
	return m_iIndex;
}

int main()
{
	Person p1;
	cout << "m_iIndex is:" << p1.getIndex() << endl;
	Person p2(1,20,1000);
	cout << "m_iIndex is:" << p2.getIndex() << endl;
	return 0;
}

结果:
image.png
程序声明了两个对象p1和p2,p1使用默认构造函数初始化成员变量,p2使用带参数的构造函数初始化,所以在调用同一个类成员函数getIndex时输出结果不同。

析构函数

构造函数和析构函数是类体定义中比较特殊的两个成员函数,因为他们两个都没有返回值,而且构造函数名标识符和类名标识符相同,而析构函数名标识符就是在类名标识符前面加上“~”符号。
构造函数主要是用来在对象创建时,给对象中的一些数据成员赋值,主要目的就是用来初始化对象。析构函数的功能是用来释放一个对象,在对象删除前,用它来做一些清理的工作,它与构造函数的功能正好相反。
代码:

#include<iostream>
#include<string.h>
using namespace std;

class Person
{
public:
	Person();
	~Person();
	char *m_pMessage;
	void showStartMessage();
	void showFrameMessage();
};

Person::Person()
{
	m_pMessage = new char[100];
}

void Person::showStartMessage()
{
	strcpy(m_pMessage,"I'm Johnson666");
	cout << m_pMessage << endl;
}

void Person::showFrameMessage()
{
	strcpy(m_pMessage,"**************");
	cout << m_pMessage <<endl;
}

Person::~Person()
{
	delete[] m_pMessage;
}

int main()
{
	Person p1;
	p1.showFrameMessage();
	p1.showStartMessage();
	p1.showFrameMessage();
	return 0;
}

结果:
image.png
程序在构造函数中使用new为成员m_pMessage分配空间,在析构函数中使用delete释放由new分配的空间。成员m_pMessage为字符指针,在showStartMessage成员函数中输出字符指针所指向的内容。

使用析构函数的注意事项:
1.一个类中只可能定义一个析构函数。
2.析构函数不能重载。
3.构造函数和析构函数不能使用return语句返回值。不用加上关键字void,加上反而会报错。

构造函数和析构函数的调用环境:
1.自动变量的作用域是某个模块,当此模块被激活时,自动变量调用构造函数,当退出此模块时,会调用析构函数。
2.全局变量在进入main函数之前会调用构造函数,在程序终止时会调用析构函数。
3.动态分配的对象在使用new为对象分配内存时会调用构造函数;使用delete删除对象时会调用析构函数。
4.临时变量是为支持计算,由编译器自动产生的。临时变量的生存期的开始和结尾会调用构造函数和析构函数。

来源:freebuf.com 2021-05-20 22:46:27 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论