C++类开发第二篇(浅析构造函数和析构函数)
class_2
构造函数
构造函数是一种特殊的成员函数,用于创建和初始化类的对象。它的名称与类的名称相同,没有返回值,也不需要显式调用。在C++中,每个类都必须至少有一个构造函数。
当我们创建一个类的对象时,编译器会自动调用构造函数来初始化该对象的成员变量。构造函数可以执行一些操作,如初始化成员变量、申请资源、打开文件等。上一篇当中提到的Stock类,如果直接运行
Stock regina;
//regina.acquire("ivanlee", 20, 12.5);
//regina.show();
regina.buy(20, 12.7);
regina.show();
股票份额由于没有初始化则会赋予一堆乱码。定义好构造函数的话在初始化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();
}
再直接运行前面的代码的话,就会给一些合法的初始值。
执行顺序
任何构造函数都是在定义好某一个对象的时候就会运行的,不管其他方法是否会调用。
构造函数的分类及调用
按参数类型:分为无参构造函数和有参构造函数
按类型分类:普通构造函数和拷贝构造函数(复制构造函数)
- 普通构造函数是用来初始化新创建的对象的函数。它没有参数或者有若干个参数,用来指定如何初始化对象的各个成员变量。
- 当我们创建一个类的对象时,会自动调用该类的普通构造函数来完成对象的初始化工作。
- 拷贝构造函数是一种特殊的构造函数,它接受同类型的对象作为参数,并根据给定的对象创建一个新的对象。
- 拷贝构造函数通常在对象复制、传递和返回值传递时被隐式调用。
#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;
}