C++类和对象(中)

文章介绍了C++中的特殊成员函数,包括构造函数用于对象初始化,析构函数在对象销毁时释放资源,拷贝构造用于对象复制,赋值运算符重载处理对象赋值,以及const成员变量和const成员函数确保对象状态不变。这些概念对于理解和编写高效、安全的C++代码至关重要。
摘要由CSDN通过智能技术生成

目录

一、默认成员函数

 二、构造函数

1.什么是构造函数

2.构造函数的特点

三、析构函数

1.什么是析构函数

2.析构函数的特点

四、拷贝构造

1.什么是拷贝构造

2.拷贝构造的特点

五、赋值运算符

1.运算符重载

 2.赋值运算符重载

六、const成员

七、取地址和const取地址操作符重载


一、默认成员函数

默认成员函数有六个,分别是:                                                                                                       构造函数
析构函数
拷贝构造
赋值重载运算符
取地址重载
const取地址重载

 二、构造函数

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << " " << _month << " " << _day << endl;

	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	d1.Init(2023, 6, 5);
	d1.Print();
	Date d2;
	d2.Init(2023, 6, 5);
	d2.Print();
	return 0;
}

对于这样每次使用都要调用初始化函数和销毁函数的类,大家在使用时难免忘记调用导致程序奔溃,而且反复的创建和销毁需要浪费我们大量精力。对于这样的问题C++的祖师爷就创造了构造函数和析构函数

1.什么是构造函数

构造函数是一个特殊的成员函数,用于在创建对象时进行初始化操作。构造函数的名称与类名相同,并且没有返回类型(包括void)。它在对象被创建时自动调用,用于初始化对象的成员变量和执行其他必要的设置。

2.构造函数的特点

1.构造函数名与类名相同:构造函数的名称必须与其所属类的名称完全相同,包括大小写。           2.构造函数没有返回类型:与其他函数不同,构造函数没有显式的返回类型,包括void。它们在对象创建时自动调用,无需显式调用。                                                                                               3. 构造函数在对象创建时被调用:当使用类的对象声明时,构造函数会自动调用,为对象分配内存并初始化其成员变量。

自动调用示例

 4.构造函数可以重载:一个类可以有多个构造函数,它们可以具有不同的参数列表(重载),以便在创建对象时提供不同的初始化选项。

5.默认构造函数:如果没有定义构造函数,编译器会自动为类生成一个默认构造函数。默认构造函数没有参数,并执行默认的初始化操作。

这里没有给成员变量初始值,也没有定义构造函数,所以系统自动生成自动调用产生了随机值

6.无参和全缺省的构造函数都是属于默认构造函数,因为它们在对象创建时提供了默认的初始化方式。无参的构造函数适用于不需要任何参数的初始化场景,而全缺省的构造函数适用于所有成员变量都具有默认值的情况。他们都不需要传参。
无参构造函数、全缺省构造函数、编译器默认生成的构造函数,都属于默认构造函数,他们有且只能有一个。

三、析构函数

1.什么是析构函数

析构函数是一种特殊的成员函数,它的功能与构造函数功能相反,用于在对象销毁时进行清理和释放资源的操作。析构函数的名称与类名相同前面加上波浪号~,没有参数和返回类型(包括void)。它在对象被销毁时自动调用,用于执行必要的清理操作。

2.析构函数的特点

1.析构函数的名称与类名相同:析构函数的名称必须与其所属类的名称完全相同,并在前面加上波浪号~,包括大小写。

2.析构函数没有返回类型:与其他函数不同,析构函数没有显式的返回类型,包括void。它们在对象销毁时自动调用,无需显式调用。

3.仅能有一个析构函数:一个类只能有一个析构函数。它不允许重载多个析构函数。

4.析构函数在对象销毁时被调用:当对象的生命周期结束、超出作用域或显式删除对象时,析构函数会自动调用。它用于清理对象所占用的资源。

5.自定义析构函数:如果不定义析构函数,编译器会生成一个默认的析构函数,执行默认的清理操作。但如果需要执行特定的清理操作或释放动态分配的资源,可以自定义析构函数(类中没有申请资源时,析构函数可以不写;有资源申请时,一定要写,否则会造成资源泄露)。

四、拷贝构造

1.什么是拷贝构造

拷贝构造函数是一种特殊的构造函数,用于创建一个对象时,使用同一类的另一个对象的值进行初始化。拷贝构造函数的主要目的是创建一个新的对象,并将已存在对象的值复制到新对象中。

2.拷贝构造的特点

    1.拷贝构造函数是构造函数的一个重载形式。

    2.拷贝构造函数的参数是对同一类的对象的引用,它用于指定要拷贝的对象。通常使用const关键字确保被拷贝的对象在拷贝过程中不会被修改。

五、赋值运算符

1.运算符重载

C++对于内置类型的运算比较直接,但是对于自定义类型就需要我们来重载运算符

函数名字为:关键字operator后面接需要重载的运算符符号
函数原型: 返回值类型operator操作符(参数列表)

注意:

1.不能通过连接其他符号来创建新的操作符: 比如operator@

2.重载操作符必须有一个类类型参数

3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义

4.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
5.  .*   ::  sizeof  ?:  .  注意以上5个运算符不能重载

 2.赋值运算符重载

赋值运算符重载格式
参数类型: const 类&,传递引用可以提高传参效率
返回值类型:类&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
检测是否自己给自己赋值
返回*this: 要符合连续值的含义

赋值运算符只能重载成类的成员函数不能重载成全局函数

原因:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。

六、const成员

在C++中,const成员是指在类中声明为const的成员变量或成员函数。

const成员变量:在类中声明为const的成员变量。它们必须在类的构造函数初始化列表中进行初始化,并且不能在类的任何成员函数中修改。const成员变量可以是基本数据类型(例如int、float等)或自定义类型。const成员变量在对象创建时就被初始化,并且在对象的整个生命周期中保持不变。

const成员函数:const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。const成员函数通过在函数声明的末尾加上const关键字来标识。

const成员函数可以重载非const成员函数,但非const成员函数不能重载const成员函数。这是因为权限可以被缩小,但是不能被放大。

如果我们设置函数的时候,该函数不想改变成员变量,我们就可以使用const来修饰,这可以使我们的代码更安全

七、取地址和const取地址操作符重载

这两个不常用,一般不会自定义,编译器会默认生成

class Date
{ 
public :
 Date* operator&()
 {
 return this ;
     }
 const Date* operator&()const
 {
 return this ;
 }
private :
 int _year ; 
 int _month ; 
 int _day ; 
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值