C++入门笔记---定义构造器(构造函数)和析构器

回顾一下OOP技术的基础:

-定义一个有属性和方法的类(模板)

-为该类创建一个变量(实现)

但是面向对象过程可不只有这么简单,接下来我们更深一步的了解他。

1.构造函数(构造器)

首先就是构造器,他也是一种方法,并且每个类至少有一个构造器,如果在创建类的时候没有定义构造器的话,编译器会默认生成一个无参数的构造器,这个构造函数的作用是对实例化的对象进行初始化,构造器和通用的方法的区别:

  1. 构造器的名字必须和他所在的类的名字一样
  2. 系统在创建某个类的实例的时候会第一时间调用这个类的构造器
  3. 构造器永远不会返回任何值

创建构造器,需要先把这个函数的声明加到类里面去

class Car{
    Car(void);//因为构造器没有任何返回值 所以也不用在Car前面加上一个void
};

注意大小写和类名保持一致,在结束声明之后开始定义构造器本身,也就是写这个构造函数

Car::Car(void){//不用写void Car::Car(void) 因为构造器会默认他没有任何返回值 并且我们在类里声明这个函数的时候也没有写
    color = "WHITE";
    engine = "V8";
    wheel = 4;
    gas_tank = FULL_GAS;//FULL_GAS意为油缸是满的 在真正实现这个函数的时候 可以对其进行宏定义
}

 那么我们就可以对这个类各种填东西,让他看起来不那么简陋......如下,是我自己写的一个简单的类,实例化一个对象,以及调用对象的方法的一个小代码,当然这个代码虽然可以运行,但是有非常多的不足,只是在刚开始的时候拿来练练手罢了。

#include<iostream>
#define FULL_GAS 85

class Car{
	public:
		std::string color;
		std::string engine;
		unsigned int gas_tank;
		unsigned int wheel; 
		
		Car(void);//构造函数 
		void setColor(std::string col);//更改颜色 
		void setEngine(std::string eng);//更改引擎
		void setWheel(unsigned int whe);//更改轮子个数
		void fill_tank(int liter);//加油
		int running(void);//让车跑起来 
		void warning(void);//油不够的时候 进行警告 
		
};

Car::Car(void){
	color = "WHITE";
    engine = "V8";
    wheel = 4;
    gas_tank = FULL_GAS;
}

void Car::setColor(std::string col){
	color = col;
}

void Car::setEngine(std::string eng){
	engine = eng;
}

void Car::setWheel(unsigned int whe){
	wheel = whe;
}

void Car::fill_tank(int liter){
	gas_tank += liter;
}

int Car::running(void){
	char answer;//用于答复是否需要加满油 
	
	std::cout<<"我是一辆汽车,我正在以120的速度向前移动.........\n";
	gas_tank--;
	std::cout<<"当前还剩"<<100*gas_tank/FULL_GAS<<"%的油量";
	
	if(gas_tank<10){
		std::cout<<"是否需要加满油再继续行驶?(Y/N)\n";
		std::cin>>answer;
		if(answer=='y'||answer=='Y') fill_tank(FULL_GAS);
		if(gas_tank==0){
			std::cout<<"没油了!\n";
			return 0;
		} 	
	}
	return 1;
}

void Car::warning(void){
	std::cout<<"WARNING!还剩"<<100*gas_tank/FULL_GAS<<"%油量!\n";
}
int main(){
	Car mycar;
	while(mycar.running()) ;
	return 0;
} 

运行结果:

构造对象数组:之前讲过数组可以是任何一种数据类型,当然也包括对象。

Car mycar[10];
//调用的语法依旧是:mycar[x].running;

 注意:x代表着给定元素的下标,mycar这个数组里每一个单元都存储着一个Car类的实例化对象,这样我们就可以造很多车了~~~

构造器总结:

  1. 每个类至少有一个构造器,如果你没有在类里定义一个构造器,编译器就会使用如下语法替你定义一个空的构造器:ClassName::ClassName(){},其实除此之外编译器还会替你创建一个副本构造器(CopyConstructor),所以构造器是很重要的,没有他就不能实例化对象。
  2. 一个常见的做法就是在创建对象的时候做出一些事情(借助构造函数),在对象创建出来以后用另一种方法做同样或不同的事情,
Car mycar;//这个在实例化这个对象的时候 构造器已经把他初始化为白色 这样该是最普遍的颜色
mycar.setColor("Yellow");//但是我不喜欢这种大众的颜色 我想要改变一下 我想要与众不同 那就可以根据自己的喜好来调用set函数更改颜色

析构器 

从前面的内容我们了解到,在创建对象的时候,系统都会自动调用一个特殊的方法,即构造器。相应的,在销毁一个对象的时候,系统也会调用另外一个特殊的函数达到相应的效果,这就叫做析构器。一般来说构造器用来完成实现的初始化和准备工作(申请分配内存),那么析构器用来完成时候所必须的清理工作(清理内存),在java里有一个垃圾处理机制,所以在Java里没有析构器,但是c++里必须有。构造器和析构器两者相辅相成,有许多共同之处。首先,析构器有着和构造器/类一样的名字,只不过前边多了一个波浪符"~"前缀。

class Car{
    Car(void);//构造器
    ~Car();//析构器
   };

注意: 

  1. 析构器也永远不返回任何值,所以在声明他的时候,像构造器一样,前面不用加上void
  2. 析构器永远是不带参数的,你想象一下,你都准备销毁这个对象了,这个对象已经没用了,你还传参数干嘛....所以析构器的声明永远是这个格式:~ClassName();
  3. 一般来说析构器是可有可无的,但是构造器必须存在。虽然他可有可无,但是在比较复杂的类里,析构器往往至关重要(可能会引起内存泄露),例如在某个类的构造器里申请了一块内存,我们就必须在析构器里面释放那块内存。写一个也不费事,不写有风险,所以还是写上比较好。

下面就用一个自己写的例子来感受一下析构器里面的内容应该怎么去写:

编程任务:从键盘输入以段名言和一个作者 将这些内容写入到指定文件中去

//输入一句名言和作者 将其写入文件中去 

#include<iostream>
#include<string>
#include<fstream>

class StoreQuote
{
public:
	std::string quote,speaker; 
	std::ofstream fileOutput;
	
	StoreQuote();//构造器 
	~StoreQuote();//析构器
	void inputQuote();
	void inputSpeaker();
	bool write();//将内容写入文件 
};

StoreQuote::StoreQuote(){
	fileOutput.open("E:\\test.txt",std::ios::app);//如果没有改文件的话 会新建一个 然后打开方式是在文件尾部追加	
}

StoreQuote::~StoreQuote(){
	fileOutput.close();//关闭文件 在构造器里申请打开文件 自然在调用结束后就要将其关闭 否则会内存泄漏 
} 

void StoreQuote::inputQuote(){
	std::getline(std::cin,quote);//前面讲过不能用scanf 因为遇到空格就会停止 获取一段字符串 要用string类里的getline函数来读取一行 
}

void StoreQuote::inputSpeaker(){
	std::getline(std::cin,speaker);
}

bool StoreQuote::write(){
	if(fileOutput.is_open()){//fileOutput是ofstream类的一个实例化对象 这个类里有is_open()方法,用来判断目标文件是否正常打开 
		fileOutput<<quote<<"|"<<speaker<<"\n";//输出流不再是我们平时认为的stdout(屏幕)了 已将变成fileOutput了 构造函数里fileOutput指向E:\test文档 
		return true;
	}
	return false;
}

int main(){
	StoreQuote sq;
	
	std::cout<<"请输入一句名言:\n";
	sq.inputQuote();
	
	std::cout<<"请输入名言的作者:\n";
	sq.inputSpeaker();
	
	if(sq.write()) std::cout<<"成功写入文件!\n";
	else std::cout<<"写入文件失败!\n";
	
	return 0;
} 

运行结果:

1.从键盘输入,显示成功写入文件,那就去E盘查看一下

2.查看E盘,存在test文档,打开文档检查内容是否被写进去 

3.写入成功 

 以上就是构造器和析构器的内容,关于析构器的内容,要好好看一下最后一个代码!

猜你喜欢

转载自blog.csdn.net/J_SUNV/article/details/85089511