目录
(1)默认构造函数(Default Constructor)
(2)带参数的构造函数(Parameterized Constructor)
1. 对象的初始化和清理
C++每个对象都有自己的初始设置以及对象销毁前的清理数据的设置。
在C++中,对象的初始化和清理是通过构造函数和析构函数来实现的。构造函数用于初始化对象的成员变量,而析构函数则在对象被销毁时执行清理操作。
假设我们有一个名为"Person"的类,用于表示一个人的信息,包括姓名和年龄。我们可以通过构造函数来初始化一个"Person"对象的姓名和年龄,而析构函数可以在对象被销毁时执行一些清理操作,比如释放分配的资源。
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 构造函数
Person(const std::string& personName, int personAge) {
name = personName;
age = personAge;
std::cout << "Person对象已创建,姓名:" << name << ",年龄:" << age << std::endl;
}
// 析构函数
~Person() {
std::cout << "Person对象已销毁,姓名:" << name << ",年龄:" << age << std::endl;
}
};
int main() {
// 创建一个Person对象
Person person("Alice", 25);
// 对象使用...
// 程序结束,对象销毁时会自动调用析构函数进行清理
return 0;
}
在上面的例子中,我们创建了一个名为"person"的"Person"对象,并在构造函数中初始化了姓名为"Alice",年龄为25。当程序执行完毕时,"person"对象会被销毁,此时析构函数会被调用,输出相应的清理信息。
下面我们对构造函数和折钩函数进行一个了解。
1.1 构造函数和析构函数
在C++中,对象的初始化和清理是通过构造函数和析构函数来完成的。
对象的初始化:
构造函数(Constructor)用于初始化对象的成员变量,确保对象在创建时处于一个合适的状态。构造函数的名称与类名相同,没有返回类型,并可以有参数。当创建对象时,会自动调用构造函数来初始化对象。
在构造函数中,可以对成员变量进行赋值、执行其他初始化操作,并进行必要的资源分配。构造函数可以有多个重载版本,根据参数的不同进行区分。
对象的清理:
析构函数(Destructor)用于在对象被销毁时执行清理操作,释放对象所占用的资源。析构函数的名称与类名相同,前面加上波浪号(~),没有返回类型,也不接受任何参数。
当对象被销毁时,会自动调用析构函数。析构函数可以用于释放动态分配的内存、关闭文件、断开连接等清理操作。
这两个函数是被编译器自动调用的,完成对对象的初始化和清理工作,对象的初始化和清理工作时编译器强制我们做的事情,若是我们不提供,构造和折构,编译器会提供。编译器提供的构造函数和析构函数是空实现。
1.1.1 构造函数语法
语法:类名(){}
注意:
1、构造函数,没有返回值,也不写void;
2、函数名称和类名相同;
3、构造函数可以有参数,因此可以发生重载;
4、程序在调用对象是会自动调用构造,无需手动调用,而且只会调用一次。
构造函数的特点包括:
1、构造函数的名称与类名相同;
2、构造函数可以有多个重载版本,根据参数的不同进行区分;
3、构造函数可以被重载,以提供不同的初始化方式;
4、构造函数可以具有默认参数,使得在创建对象时可以省略某些参数;
5、构造函数可以使用成员初始化列表(Member Initialization List)来对成员变量进行初始化,提高效率和灵活性。
1.1.2 析构函数语法
语法:~类名(){}
注意:
1、析构函数,没有返回值,也不写void;
2、函数名称和类名相同,在名称前需要加符号~
3、构造函数不可以有参数,因此不可以发生重载;
4、程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次。
析构函数的主要作用是进行资源的释放和清理工作,例如释放动态分配的内存、关闭文件、释放网络连接等。由于析构函数在对象销毁时自动调用,因此可以确保在对象不再需要时进行必要的清理操作,避免资源泄漏和内存泄漏。
1.1.3 构造函数语法与析构函数语法代码示例
#include<iostream>
using namespace std;
//对象的初始化和清理
//构造函数
//初始化
class person
{
public:
//构造函数
//1、构造函数,没有返回值,也不写void;
//2、函数名称和类名相同;
//3、构造函数可以有参数,因此可以发生重载;
//4、程序在调用对象是会自动调用构造,无需手动调用,而且只会调用一次。
person()
{
//若是里面不写东西,编译器也会默认,但是里面为空,相当于把大括号内的东西全部注释掉了
cout << "person构造函数的调用" << endl;
}
//析构函数
//1、析构函数,没有返回值,也不写void;
//2、函数名称和类名相同,在名称前需要加符号~
//3、构造函数不可以有参数,因此不可以发生重载;
//4、程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次。
~person()
{
cout << "person析构函数的调用" << endl;
}
};
//构造和析构都是必须有的东西,如果我们自己不提供,编译器会提供一个空实现的构造和析构
void test1()
{
person p;//栈上的数据,test1执行完毕,释放这个对象
}
int main()
{
//test1();
person p;
system("pause");
return 0;
}
运行结果:
在test1中时,函数调用完以后就被释放了所以会调用,析构代码。
但是,若是写在主函数中,就不会被释放了,因此不会出现析构,但是按任意键,结束整个程序,会出先析构。
1.1.4 构造函数的分类以及调用
按参数分类:有参构造函数和无参构造函数
按类型分类:普通构造函数和拷贝构造函数
其中,无参构造函数叫做“默认构造函数”
而不论有无参数都统称为“普通构造函数”
1、构造函数分类
构造函数可以按照参数的不同分类为以下几种类型:
(1)默认构造函数(Default Constructor)
没有任何参数的构造函数被称为默认构造函数。如果一个类没有显式定义构造函数,编译器会自动生成一个默认构造函数。默认构造函数用于创建对象时不需要提供任何参数的情况。
//无参(默认)
person()
{
cout << "person构造函数的调用" << endl;
}