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


一、析构函数

#include<iostream>
#include<string>
//任务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<iostream>

//任务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;
}





在这里插入图片描述
结果如上图所示。

猜你喜欢

转载自blog.csdn.net/taiyuezyh/article/details/124216503