C++进阶类和对象(对象的特性,构造函数和析构函数,深拷贝与浅拷贝)

目录

 1.  对象的初始化和清理

1.1  构造函数和析构函数

1.1.1  构造函数语法

1.1.2  析构函数语法

1.1.3  构造函数语法与析构函数语法代码示例

1.1.4  构造函数的分类以及调用

1、构造函数分类

(1)默认构造函数(Default Constructor)

(2)带参数的构造函数(Parameterized Constructor)

(3)拷贝构造函数(Copy Constructor)

2、构造函数调用

(1)括号法

(2)显示法

(3)隐式转换法

3、 构造函数的调用规则

4、拷贝构造函数调用的时机

(1)对象初始化时的拷贝构造

(2)函数参数传递时的拷贝构造

(3)函数返回值的拷贝构造

5、深拷贝和浅拷贝


 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;
}
(2)带参数的构造函数(Parameterized Const
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光の尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值