C++——构造函数,析构函数.

C++——构造函数,析构函数.,第1张

0.前言

        我这更新速度着实令人担忧,毫无章法可言啊,分享一下最近在读的一本书《山月记》,是日本作家写的,看到了悟净出世这一篇,有一段是河底的妖怪都自立一派思想大家,但是那些妖怪哲学家 因为词汇的有限 只能用通俗的话语解释深刻的哲理。我想表达的是什么,或许,世间的大多数道理人人懂之,却讲不出来。无法像文化大家一样用犀利的文字直击人心,我们能做的就是多去读书,一为了弥补“讲不出”,二是能明白一些非大多数人懂得道理。


1.构造函数、析构函数

        构造函数就是我们在创建类的时候,调用的函数,分两种情况,一是系统提供,二是自定义,一般我们都是自定义构造。

我们只讲一下自定义的构造函数。

 构造函数的定义:

  1. 函数名和类名相同
  2. 参数可有可无,可以重载
  3. 无返回值

如果我们没有定义构造函数,系统会提供一个无参无函数体的函数

类名()

{

}

一旦我们自定义了构造函数,系统就不再提供

看代码

#include 
#include 
using namespace std;
class Stu {
	private:
		int age;
		string name;
	public:
		Stu(){
			
		}
		~Stu(){
			
		}
		void printf();
};

void Stu::printf() {
	cout << age << name << endl;
}
int main() {
	Stu stu1;
	stu1.printf();
}

        这里就是我们自主定义的一个构造函数和析构函数(那就直接讲了析构吧,你想有来必有回,析构函数就是这样,格式就是在构造函数的前面加上~),这个构造里是空的,没有实体,所以这个效果就相当于如果不写系统默认提供的那个构造。

        既然是函数,构造函数,构造什么东西,一般是默认的,比如上面这些代码,虽然有age和name,但是没有默认值,那我们就可以在构造函数里给它默认值。

Stu(){
			age=18;
			name="嘟嘟"; 
		}



18嘟嘟

--------------------------------
Process exited after 0.02036 seconds with return value 0
请按任意键继续. . .

        这些只是基本 *** 作,如果我们在构造里定义指针之类的呢,这个时候就要用到析构,在程序结束时,释放掉指针。

#include 
#include 
#include 
using namespace std;
class Stu {
	private:
		int age;
		string name;
		int *p;
	public:
		Stu(){
			age=18;
			name="嘟嘟"; 
			p=(int *)malloc(sizeof(int));
			*p=age;
			
		}
		~Stu(){
			free (p);
		}
		void printf();
};

void Stu::printf() {
	cout << age << name << endl;
	cout << *p << endl;
}
int main() {
	Stu stu1;
	stu1.printf();
}



18嘟嘟
18

--------------------------------
Process exited after 0.1457 seconds with return value 0
请按任意键继续. . .

        还有main函数里是这种构造方式,我们说了构造函数也是函数,那是函数就可以重载,我们来看构造函数的重载。

#include 
#include 
#include 
using namespace std;
class Stu {
	private:
		int age;
		string name;
		//int *p;
	public:
		Stu(){
			cout << "无参构造" << endl;
			age=18;
			name="嘟嘟"; 
			//p=(int *)malloc(sizeof(int));
			//p=&age;
			
		}
		Stu(string _name){
			cout << "有参构造1" << endl;
			this->name=_name;
			age=777;
		}
		Stu(string _name,int _age){
			cout << "有参构造2" << endl;
			this->name=_name;
			this->age=_age;
		}
		~Stu(){
			cout << "析构函数---";
			//free (p);
			cout << name << "的析构"<< endl;
		}
		void printf();
};

void Stu::printf() {
	cout << age << name << endl;
	//cout << *p << endl;
}
int main() {
	Stu stu1;
	stu1.printf();
	
	Stu stu2("哈哈");
	stu2.printf();
	
	Stu stu3("嘻嘻",999);
	stu3.printf();
}


(注意  注释掉了指针)

无参构造
18嘟嘟
有参构造1
777哈哈
有参构造2
999嘻嘻
析构函数---嘻嘻的析构
析构函数---哈哈的析构
析构函数---嘟嘟的析构

--------------------------------
Process exited after 0.02948 seconds with return value 0
请按任意键继续. . .



        第一个对象,我们没有传参进去,所以他调用的是第一个构造函数,第二个、第三个对象传了参数,所以,它会自动匹配调用相同类型的构造函数,是不是很神奇,但是记住,析构函数只有一个。于是三个构造对应三个析构。


2.构造析构的时刻

        其实从运行的结果我们可以看出来,构造肯定是在运行时建立对象的时候调用的,析构函数是在return 0,也就是程序正常结束时,而且我们看到,先构造的后析构,这是为啥呢。这就与数据结构里的栈有关系,还是那句话,构造函数也是函数,所有函数的调用都是以栈的形式实现,先进后出,所以,嗯嗯。


        好,下节讲拷贝构造函数吧。。。

        推荐一首歌,경고 (警告),挺有节奏感噢。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1295860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存