类,构造、析构、运算符重载

本文详细介绍了C++中类的概念,包括类的成员变量、成员函数(如构造函数、拷贝构造函数、析构函数和运算符重载),以及权限修饰符的应用。重点讲解了默认成员函数的使用和注意事项,如构造函数的默认行为、隐式类型转换和析构函数的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、类简介
  • 二、类的成员和对象
  • 类的默认成员函数
    • 1.构造函数
    • 2.拷贝构造函数
    • 3.运算符重载
    • 4.析构函数


前言

类和对象是C++面向对象程序设计的重要概念,是C++的特色和精华。精确的理解类的使用,对学习C++具有重要意义。


提示:以下是本篇文章正文内容,下面案例可供参考

、类简介

类简单来讲就是我们自己设计的数据类型。和C语言的结构体非常相似。具有继承性,封装性,多态性的特点。类具体化的结果就是对象,我们通过对象将类具体化,来帮我们解决具体的问题。类可以包含多种的成员变量和成员函数。它们有的供外界使用,有的仅在本类中处理数据,不供外界使用。因此我们在类的定义中使用不同的权限修饰符来表明这些成员的访问级别。这种权限修饰符有三种,public(共有的)类内、外界都可以访问,private(私有的)不能从外界或者派生类访问,可以通过类内、友元函数进行访问,protected(保护的)不可被外界访问,但可在友元函数、类内和派生类中访问。如果未标注权限修饰符,那么默认权限为private。

定义一个类使用class。形式如下:

class 类名
{
public:
共有成员
private:
私有成员
protected:
保护成员
}
类名 对象名;

 和结构体变量一样,我们一般也通过  对象名.成员变量  进行访问,如果是指针我们通过   指针变量名->成员变量   来访问,当然了,在成员函数中,我们可以直接使用成员变量,不用使用对象名。我们默认类的定义代码放在.h文件中,再通过include包含进来。类的具体实现代码放在.cpp文件中(一般我们需要将类定义.h文件包含进来,且通过在函数名前加     类名::  表明它属于类内函数)。(有时我们在.h文件中定义了类,然后用include包含到另一个.h文件中,再将这两个.h文件包含到一个.cpp文件中,编译器并不会因为这样类的重复定义而报错)

类和结构体的区别:

1)类可以将函数作为成员,而C语言结构体不行(C++可以)

2)类的默认访问级别是private,结构体为public,类的继承也一样

二、类的成员和对象

类的成员大部分为成员变量和成员函数。同时,类的对象也是可以拷贝的(这种拷贝是每个成员变量是逐个拷贝的),我们可以通过这种方式,来给对象初始化。大概有如下几种方式。

类名  对象名1=对象名2;
类名  对象名1(对象名2);
类名  对象名1{对象名2};
类名  对象名1=(对象名2);
类名 对象名1={对象名2};

成员函数声明和定义时函数名后面加const表示我们不会通过这个成员函数来修改任何成员变量的值。对象定义前加const表示我们只能够调用不改变成员变量的成员函数。同时,我们可以在成员函数末尾添加关键字  mutable 表示这个成员函数可以修改成员变量的值,即使成员函数末尾加了const。

当我们在使用成员函数时,编译器会自动把成员函数所属的对象的地址当做参数传递进成员函数中,就是  this (保留字)。我们可以通过*this来访问对象的所有成员。this带有const属性,不能改变this的指向。

static成员,如果一个成员变量前面加static,那么它就变成了静态成员变量了。可以说它是被所有对象统一的,我们通过任意一个对象改变它的值,其他对象的此静态成员变量也会与其保持一致。在类中的是静态成员变量的声明,此时不分配内存。一般我们在文件开头定义静态成员变量,并赋予初值,此时分配内存。

三、类的默认成员函数

类中有6个默认的成员函数,也就是说,如果我们不去定义它们,编译器也会自动帮我们生成一个默认的。它们分别是构造函数、析构函数、拷贝构造函数、赋值操作符重载、取地址操作符重载、const修饰的取地址操作符重载。

1、构造函数

默认构造函数是一种极其特殊的构造函数,它的函数名与类名相同。当我们创建对象的时候,它会被编译器自动调用(但如果使用对象拷贝定义时初始化对象,就不会调用构造函数,而是调用拷贝构造函数)。它不传递参数,或者传递的参数都有默认值。不仅如此,构造函数没有返回值,是真正意义上的没有返回值,函数定义前面不用写返回值类型。构造函数不可以被我们手工调用。在一般情况下,构造函数的的访问级别为public,这样才能被外界调用。如果构造函数有参数,那么我们创建类对象的时候也要带上这些参数(这种参数传递,通过()或{}都可以)。如果我们不去定义它,编译器会帮我们默认生成一个,一旦我们生成了自己的构造函数,编译器就不会再生成了。构造函数可以有多个,但不同构造函数之间参数类型,或者参数数量应保持一定的差异性,使编译器可以明确我们在创建对象时调用的构造函数类型。

构造函数参数可以有默认值,有默认值的函数参数也叫默认函数参数,也就是说,如果我们不给这个参数传递值(当然也可以传递值),那这个参数的值就是这个默认值。具体的方法就是在构造函数声明(一般只能在函数声明中,除非没有函数声明)的参数列表中用   参数=默认值   的方法使参数变为默认函数参数。需要注意的是,默认函数参数应放在参数列表的右边,也可以说,默认函数参数的右边也必须是默认函数参数。同时,在我们不给这些默认函数参数传递值时,定义对象时的传递参数列表同样不能和已有的构造函数的参数列表混淆,也说就是说,我们省略了默认函数参数的函数参数传递列表也必学和其他的构造函数的参数列表有一定的差异性,使编译器明确我们使用的构造函数,否则系统就会报错。

我们都听说过隐式类型转换。在我们给定义类对象初始化的时候,有时因为书写格式的不规范,就会进行隐式类型转换。例如会将一个数字转换为类对象(如果构造函数中有以一个数为形参的构造函数)。这种转换,会降低代码的可读性和安全性,造成隐患。为了规避这种隐患,我们在构造函数前加 explicit  关键字就可以禁止构造函数的隐式类型转换。我们一般把所有的构造函数全部声明explicit,从而保证产生我们不知道的影响。

如果一个类中的成员过多,那么一个一个的进行初始化不免有些效率过低,单独写一个函数来给它们初始化也有些浪费,这是因为我们可以通过构造函数初始化列表来进行对象的初始化。在构造函数的定义和{}之间添加一个 : ,我们就可以在其后进行对象类成员的初始化。

: 成员一(初始化值),成员二(初始化值)

 这里简单写一下

class Time 
{
public://三个成员变量
int hour;
int minute;
int scond; 
public:
explicit Time(int a,int b=1,int c=2)//这里就不再另建一个.cpp文件了
:hour(a),minute(b),scond(c)//构造函数初始化列表
{

}
}

2 、拷贝构造函数

拷贝构造函数函数名也与类名相同。第一个函数参数为类对象的引用,如果还有其他参数,那么其它参数应有默认值(也应在函数声明中,除非没有函数声明)。在某些时机(一般为定义时),拷贝构造函数会自动调用。我们也可以通过explicit来限制拷贝构造函数的隐式类型转换(但一般不会加)。但我们的第一个引用参数最好添加const属性。编译器生成的拷贝构造函数,是成员变量逐个拷贝的。一旦我们定义了自己的拷贝构造函数,系统就不会再生成了(也可以说是被替代了),不论我们的拷贝构造函数性能如何。因此,我们应确保自己的拷贝构造函数的功能。

3、运算符重载

运算符重载是指我们对已有的运输符进行重新定义,使其适用于不同类型数据。我们知道,两个int类型的变量是可以进行==比较的,那么两个类对象之间可以进行==比较吗,也是可以的。这是因为编译器帮我们定义了两个对象相等的条件。这种定义有时是不合乎我们的要求的,比较粗糙。这时,我们可以重载这些运算符来满足我们的需求。运算符重载本质是函数,因此也有参数列表(这里指重载对象)和返回类型。我们通过operator关键字来进行运算符重载。使用形式为:

返回类型 operator 运算符 (const 重载类型){函数体}

在使用重载运算符的过程中,this指向运算符左边的对象,而运算符右边的对象作为参数进行重载。

4、析构函数

析构函数和构造函数是相对的。构造函数常常被用来初始化对象,而析构函数主要用来执行清理工作。析构函数的名字是  ~类名,没有返回值,也不接受参数。而且,析构函数不能被重载,因此,对于一个类,只有一个析构函数。析构函数会在对象内存被释放前执行函数体。对于多个构造函数和析构函数的先后顺序问题,先构造的后析构,后构造的先析构。一般我们在构造函数中new出的数据,学要在析构函数中delete,以避免内存的泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鬼多不菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值