C++学习日志31------拷贝构造、析构函数

C++学习日志31------拷贝构造、析构函数,第1张

目录
  • 一、析构函数
  • 二、拷贝构造


一、析构函数
#include
#include
//任务1:定义Date类

class Date
{
private:
	int year = 2019, month = 1, day = 1;
public:
	int getYear() { return year; }
	int getMonth() { return month; }
	int getDay() { return day; }
	void setYear(int y) { year = y; }
	void setMonth(int m) { month = m; }
	int setDay(int d) { day = d; }
	Date() = default;
	Date(int y, int m, int d) :year{ y }, month{ m }, day{ d }
	{
		std::cout << "Data" << toString() << std::endl;
	}
	std::string toString()
	{
		return (std::to_string(year) + "-" + std::to_string(month) + "-" + std::to_string(day));
	}//2019-1-1


};

//任务2:定义Gender枚举类型
//任务3:定义Employee类


enum class Gender
{
	male,
	female,

};
class Employee
{
private:
	std::string name;
	Gender gender;
	Date* birthday;
	static int numberOfObjects;
public:
	void setName(std::string name) { this->name = name; }
	void setGender(Gender gender) { this->gender = gender; }
	void setBirthday(Date birthday) { *(this->birthday) = birthday; }
	std::string getName() { return name; }
	Gender getGender() { return gender; }
	Date getBirthday() { return *birthday; }
	std::string toString()
	{
		return (name + (gender == Gender::male ? std::string("male") : std::string("female")) + birthday->toString());
	}
	Employee(std::string name, Gender gender, Date birthday) :name{ name }, gender{ gender }
	{
		numberOfObjects++;
		this->birthday = new Date{ birthday };
		std::cout << "Now there are: " << numberOfObjects << "employee" << std::endl;
	};
	Employee() :Employee("Alan", Gender::male, Date(2000, 4, 1)) {}
	~Employee()
	{
		numberOfObjects--;
		delete birthday;
		birthday = nullptr;
	}
};



int Employee::numberOfObjects = 0;
//任务4:在堆和栈(函数作用域与内嵌作用域)上分别创建Employee对象,观察析构函数的行为
int main()
{
	Employee e1;
	std::cout << e1.toString() << std::endl;
	Employee* e2 = new Employee{ "John",Gender::male,Date(19990,3,2) };
	std::cout << e2->toString() << std::endl;

	{
		Employee e3{ "Alice",Gender::female,{1989,2,14} };
		std::cout << e3.toString() << std::endl;
	}

	std::cin.get();
	return 0;



}


结果如上图所示。

二、拷贝构造
#include

//任务1:创建Square类

class Square 
{
private:
	double side{ 1.0 };
	static int numberOfObjects;
public:
	double getSide() { return side; }
	void setSide(double side) { this->side = side; }
	Square(double side)
    {
		this->side = side;
		numberOfObjects++;
	}
	Square(const Square& s)
	{
		this->side = s.side;
		numberOfObjects++;
		std::cout << "Square(const Square&) is invoked" << std::endl;
	
	}
	~Square()
	{
		numberOfObjects--;
	}

	Square() :Square(1.0) {}
	double getArea() { return side * side; }
	static int getNumberOfObjects() { return numberOfObjects; }
	int getNumberOfObjectsNonStatic() { return numberOfObjects; }
};



int Square::numberOfObjects = 0;
//任务4:在堆和栈上分别拷贝创建Square对象
int main()
{
	Square s1(10.0);
	std::cout << "Squares: " << Square::getNumberOfObjects() << std::endl;

	Square s2{ s1 };
	std::cout << "Squares: " << Square::getNumberOfObjects() << std::endl;

	Square* s3 = new Square{ s1 };
	std::cout << "Squares: " << Square::getNumberOfObjects() << std::endl;

	std::cout << "s3's area is" << s3->getArea()<<std::endl;

	delete s3;
	
	std::cout << "Squares: " << Square::getNumberOfObjects() << std::endl;
	return 0;
}






结果如上图所示。

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

原文地址: https://outofmemory.cn/langs/674885.html

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

发表评论

登录后才能评论

评论列表(0条)

保存