ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++——构造函数与析构函数的恩怨情仇

2021-05-20 22:59:54  阅读:156  来源: 互联网

标签:调用 函数 int 与析构 情仇 Person 析构 构造函数


构造函数

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

类的构造方法如下:

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.临时变量是为支持计算,由编译器自动产生的。临时变量的生存期的开始和结尾会调用构造函数和析构函数。

标签:调用,函数,int,与析构,情仇,Person,析构,构造函数
来源: https://blog.csdn.net/weixin_50464560/article/details/117093334

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有