C++类开发第二篇(浅析构造函数和析构函数)

class_2

构造函数

构造函数是一种特殊的成员函数,用于创建和初始化类的对象。它的名称与类的名称相同,没有返回值,也不需要显式调用。在C++中,每个类都必须至少有一个构造函数。

当我们创建一个类的对象时,编译器会自动调用构造函数来初始化该对象的成员变量。构造函数可以执行一些操作,如初始化成员变量、申请资源、打开文件等。上一篇当中提到的Stock类,如果直接运行

	Stock regina;
	//regina.acquire("ivanlee", 20, 12.5);
	//regina.show();
	regina.buy(20, 12.7);
	regina.show();

image-20240206100651561

股票份额由于没有初始化则会赋予一堆乱码。定义好构造函数的话在初始化regina实例的时候就会帮助我们设置一些数据。

首先在声明类的地方写好这一函数(必须放在public里面

class Stock {	
private:
	...
public:

	Stock(const string& co = "default_regina", long n = 0, double pr = 0.0);
};

由于我们在后续的代码里要对一些数据进行初始化,所以要给每一个参数默认值,不然会引发C++ 类 不存在默认构造函数的错误。

然后再去对构造函数进行编写

Stock::Stock(const string& co, long n, double pr) {
	company = co;
	if (n <= 0) {
		shares = 0;
		cout << "number of shares can not be negative; "
			<< company << " shares set to 0 \n";
	}
	else { shares = n; }
	share_val = pr;
	set_total();

}

再直接运行前面的代码的话,就会给一些合法的初始值。image-20240206104359858

执行顺序

任何构造函数都是在定义好某一个对象的时候就会运行的,不管其他方法是否会调用。

image-20240206105125996

构造函数的分类及调用

按参数类型:分为无参构造函数和有参构造函数

按类型分类:普通构造函数和拷贝构造函数(复制构造函数)

  • 普通构造函数是用来初始化新创建的对象的函数。它没有参数或者有若干个参数,用来指定如何初始化对象的各个成员变量。
  • 当我们创建一个类的对象时,会自动调用该类的普通构造函数来完成对象的初始化工作。
  • 拷贝构造函数是一种特殊的构造函数,它接受同类型的对象作为参数,并根据给定的对象创建一个新的对象。
  • 拷贝构造函数通常在对象复制、传递和返回值传递时被隐式调用。
#include<iostream>
using namespace std;
class Regina {

private:
	int mAge;

public:
	Regina() {
		cout << "无参数构造函数" << endl;
		mAge = 0;
	}
	Regina(int age) {
		cout << "有参数构造函数" << endl;
		mAge = age;
	}
	//拷贝构造函数(复制构造函数) 使用另一个对象初始化本对象
	Regina(Regina& regina) {
		cout << "拷贝构造函数" << endl;
		mAge = regina.mAge;
	}
	void Print() {
		cout << mAge << endl;
	}
};
//1. 无参构造调用方式
void no_params_test(){
	cout << "无参构造调用方式" << endl;
	Regina regina;
	regina.Print();
}
void with_params_test() {
	//第一种 括号法,最常用
	cout << "括号法,最常用:" << endl;
	Regina regina(127);
	regina.Print();
	//调用拷贝构造函数
	cout << "调用拷贝构造函数:" << endl;
	Regina regina2(regina);
	regina2.Print();
	
	//第二种 匿名对象(显示调用构造函数)
	cout << "匿名对象(显示调用构造函数)" << endl;
	Regina(200); //匿名对象,没有名字的对象
}
int main() {
	no_params_test();
	with_params_test();
	return 0;

构造函数调用规则

默认情况下,c++编译器至少为我们写的类增加3个函数

1.默认构造函数(无参,函数体为空)

2.默认析构函数(无参,函数体为空)

3.默认拷贝构造函数,对类中非静态成员属性简单值拷贝

如果用户定义拷贝构造函数,c++不会再提供任何默认构造函数

如果用户定义了普通构造(非拷贝),c++不在提供默认无参构造,但是会提供默认拷贝构造

析构函数

析构函数是在对象生命周期结束时被调用的特殊成员函数,其作用是用于释放对象所占用的资源。通常情况下,析构函数用于执行一些清理工作,例如释放动态分配的内存、关闭文件、释放资源等操作,以确保对象在销毁时不会导致资源泄漏。

在C++中,析构函数的名称与类名相同,前面加上波浪号"~"。它没有返回值,也不接受任何参数。当对象超出作用域、delete被用于释放对象的动态内存分配时,或程序结束时,析构函数将会被自动调用。

Stock::~Stock() {
	cout << "Bye, " << company << endl;
}

image-20240206231553873

posted @ 2024-02-06 23:18  ivanlee717  阅读(77)  评论(0编辑  收藏  举报