C++学习笔记 04 构造函数 和 析构函数

一、不写构造函数带来的问题

  1. 属性值未被初始化,是内存上的脏数据
  2. 创建对象语句,于编译期报错:Using uninitialized memory
  3. 不同于java,属性有默认值,C++属性的初始值需要程序员手动指定
#include<iostream>

class Entity {
public:
	int x, y;
	void print() {
		//-858993460 , -858993460
		std::cout << x << " , " << y << std::endl;
	}
};

int main() {
        //1. 内部方法调用时,会显示未初始化的内存数据
	Entity e;
        e.print();

        //2. 外部直接访问未初始化属性的对象时,编译报错
	//如果没有构造函数:编译报错:Using uninitialized memory 'e'.
	// 如果有空构造函数:-858993460 , -858993460
	std::cout << e.x << " , " << e.y << std::endl;
}

二、隐藏构造函数的2种方式

  1. private
  2. delete
#include<iostream>

class Log {
private:
	//1. 隐藏默认构造函数方式一
	Log() {}
public:
	//2. 隐藏默认构造函数方式二
	//Log() = delete;

	static void write(const char* message) {
		std::cout << message << std::endl;
	}
};

int main() {
	Log::write("Hello");
	Log log;
	log.write("World");
}

三、析构函数

在当前栈区释放时,该栈中的对象会背释放,此时调用析构函数

#include<iostream>

class Entity {
public:
	Entity() {
		x = 0;
		y = 0;
		std::cout << "Create Entity!" << std::endl;
	};
	~Entity() {
		std::cout << "Destroy Entity!" << std::endl;
	};
	int x, y;

	void print() {
		//-858993460 , -858993460
		std::cout << x << " , " << y << std::endl;
	}
};

//需要挪到main函数之外,能看到析构函数的调用
void testDestructor() {
	Entity e;
	e.print();
}


int main() {
	//对象在栈上创建,当作用域(当前方法)结束时会被自动销毁
	//最后一行代码:std::cin.get(); 执行完成后, 当前栈被销毁,e,被销毁,执行e的析构函数。但黑窗口已经不见了
	//所以将此调用移到main函数之外
	//Entity e;

	//如果没有构造函数:编译报错:Using uninitialized memory 'e'.
	// 如果有空构造函数:-858993460 , -858993460
	//std::cout << e.x << " , " << e.y << std::endl;
	//e.print();
	
	testDestructor();
	std::cin.get();

}

posted @ 2025-12-11 09:35  超轶绝尘  阅读(3)  评论(0)    收藏  举报