我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++类与对象的详细说明2

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++类与对象的详细说明2

类的默认成员函数

每个类中,如果不主动实现默写特定函数,类中也会自动去生成这些函数,它们就是默认成员函数。默认成员函数分为六种,它们是特殊的成员函数,如果我们不实现,编译器会自己实现。

下面将对这些函数一 一进行介绍。

构造函数

概念

构造函数的作用即为初始化,相当于平时我们自己写的Init函数,但在对象实例化时会自动调用,以保证实例化对象一定初始化。

特性

(1)函数名与类名相同

如日期类Date,其构造函数名也为Date

(2)无返回值

以日期类为例,其构造函数的声明和定义可以写成如下样子:

class Date{public:Date(int year = 0, int month = 1, int day = 1);private:int _year;int _month;int _day;};class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1);
private:
	int _year;
	int _month;
	int _day;
};
Date::Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}

(3)对象实例化时编译器自动调用对应的构造函数

为了验证这一点,我们创建一个对象,但不对其进行其它操作:

int main()
{  
	Date date1;
	return 0;
}

 通过调试可以发现对象date1已经被自动初始化了。

(4)构造函数可以重载

(5)如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义,编译器将不再自动生成。

(6)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

针对第五点,我们不免会发出疑问,编译器自动生成的默认构造函数究竟干了什么呢?

首先,需要先了解C++把类型分为两类:内置类型(基本类型)和自定义类型。

内置类型就是C语言自带的类型,如int、char、double、指针、内置类型的数组;而自定义类型就是strucrt和class定义的类型。

编译器默认生成的构造函数,对于成员变量中的内置类型不做初始化,对于自定义类型成员变量则会调用它的默认构造函数初始化,如果没有默认构造函数则会报错。

析构函数

概念

析构函数的功能是完成对象中资源的清理。虚构函数会在对象的生命周期到了之后调用。

特性

(1)析构函数名是在类名前加上字符~。

(2)无参数无返回值。

日期类析构函数的声明可以写成如下形式:

~Date();

(3)一个类有且只有一个析构函数。若喂显式定义,系统会自动生成默认的析构函数。

(4)对象生命周期结束时,C++编译系统自动调用析构函数。 

对于编译器自动生成的默认析构函数,与构造函数类似,对于内置类型成员变量不做处理;对于自定义类型成员变量会去调用它的构造函数。

拷贝构造函数

概念

拷贝构造函数用于使用同类型对象去初始化实例对象。

特征

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

(2)拷贝构造函数的参数只有一个且必须使用引用传参,使用传值的方式会引发无穷递归调用。

日期类拷贝构造函数的声明需要写成如下形式:

Date(Date& date);

为什么必须采用引用传参呢?引发无穷递归又是怎么一回事呢?

不妨来思考一下,传参实际上也是对内容进行临时拷贝,将实参传给形参本身就需要调用拷贝构造。由此一来,会导致不断调用拷贝构造,造成无穷递归调用。

(3)若未显式定义,系统会生成默认的拷贝构造函数了。

默认拷贝构造函数对于内置类型成员,会完成按字节序的拷贝(浅拷贝),如果需要深拷贝则需要自己写拷贝构造函数;对于自定义类型成员,则会调用它的拷贝构造函数。

所谓按字节序拷贝指将内存中的内容照搬照抄,复制过来。在一些情况下就会出错,如存放申请内存地址的指针,如果按字节序拷贝,会导致两个对象中的成员变量指向同一块空间,在析构时会导致同一块空间释放内存多次,引发错误。

赋值运算符重载

运算符重载

在谈及赋值运算符重载前,必须先来讲一讲运算符重载。

我们知道,对于int类型,是可以进行加减乘除等运算的。但对于自定义类型,能否实现加减乘除运算呢?这就需要运用到运算符重载了。

运算符重载是具有特殊函数名的函数。函数名字为:operator操作符(参数列表)

注意:一些运算符不支持重载,即:.*、::、sizeof、?:、.

以Date类==运算符重载为例,需要将函数作为成员函数,以便于访问成员变量:

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1);
	bool operator==(Date& date)const;
private:
	int _year;
	int _month;
	int _day;
};
bool Date::operator==(Date& date)const
{
	return _year == date._year
		&& _month == date._month
		&& _day == date._day;
}

赋值运算符重载

赋值运算符重载顾名思义,是对赋值运算符进行的重载,用于两个已经存在的对象进行赋值拷贝。

赋值运算符重载有四个要点:

(1)参数类型

(2)返回值

(3)检测是否自己给自己赋值

(4)返回*this,用于连续赋值

一个类如果没有显式定义赋值运算符重载,编译器会自己生成一个,对于内置成员,完成按字节序拷贝;对于自定义成员变量,会调用它的赋值运算符重载。

取地址及const取地址操作符重载

这两个运算符一般不需要重新定义,使用编译器生成的重载即可,只有特殊情况才需要重载,如不希望自己特定的内容被别人访问时。

总结

篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++类与对象的详细说明2

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++类与对象的基础知识点详细分析

类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
2023-02-13

C++类与对象的重点知识点详细分析

类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
2023-02-13

Java对象与Java类的详细介绍

本篇内容介绍了“Java对象与Java类的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录1.面向对象是什么?2.Java类1.什
2023-06-20

C语言中的+=运算符详细说明

+=运算符是c语言中的复合赋值运算符,用于将变量值与表达式相加,语法为:变量 += 表达式;它先计算表达式值,再将结果与变量当前值相加,将计算结果存储回变量中,常用于累加变量值或更新数值。C语言中的+=运算符详细说明简介+=运算符是C语
C语言中的+=运算符详细说明
2024-04-03

C++的类与C#的类详细介绍

本篇内容介绍了“C++的类与C#的类详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!许多编程人员学习C++总结经验为,有的觉得C++语
2023-06-17

C++11之std::future对象的使用以及说明

这篇文章主要介绍了C++11之std::future对象的使用以及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录