返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++类中的六大默认成员函数详解
  • 580
分享到

C++类中的六大默认成员函数详解

2024-04-02 19:04:59 580人浏览 安东尼
摘要

在c++中,当你去创建一个类的时候,即便这个类是空类,也会自动生成下面6个默认成员函数,在本篇博客中,我将逐一分析下面6个默认成员函数。 构造函数 构造函数并不是去构造函数的函数,

c++中,当你去创建一个类的时候,即便这个类是空类,也会自动生成下面6个默认成员函数,在本篇博客中,我将逐一分析下面6个默认成员函数。

构造函数

构造函数并不是去构造函数的函数,而是去对函数进行初始化的函数。构造函数的函数名与类名相同,当我们每次创建类对象的时候,就会自动调用构造函数。构造函数在对象的生命周期中只会调用1次。


class Date
{
public:
    //构造函数
	Date(int year = 2021, int month = 4, int day = 11)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

构造函数的几个特点

①函数名与类名相同

②无返回值

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

④构造函数可以重载


class Date
{
public:
    //构造函数的重载:
    //无参的构造函数
	Date()
	{}
    //需要传参的构造函数
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

⑤如果类中没有显式定义构造函数(就是自己没有去定义构造函数),那么编译器会自动生成一个无参的默认构造函数;

如果类中显式定义了构造函数,那么编译器将不再生成,而是去使用用户定义的构造函数。

⑥默认构造函数只能同时存在1个。默认构造函数分为以下3种:①无参的构造函数 ②全缺省的构造函数 ③编译器默认生成的构造函数

默认构造函数的共同特点是:不用传参就可以调用


class Date
{
public:
	//下面2种和 当你不写构造函数时编译器自动生成的默认构造函数只能同时存在1种
    //无参的
	Date()
	{
		_year = 2021;
		_month = 4;
		_day = 11;
	}
    //全缺省的
	Date(int year = 2021, int month = 4, int day = 11)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

⑦编译器生成的默认的构造函数,对内置类型(int, char, double...)不会做任何处理,但是会针对自定义类型的成员,调用它的构造函数去进行初始

构造函数调用的2种写法:


int main()
{
    //无参时
    Date d;
    //单个参数
	Date(1);
	Date d1 = 2;//这种写法会发生隐式类型转换
    //多个参数
    Date(2021, 4, 11);
    Date d2 = {2021, 4, 11};//C++11中才支持的写法
}

构造函数与初始化列表

初始化列表:以冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

初始化列表有什么用?

初始化列表,顾名思义就是对对象进行初始化的,但是我们已经可以在构造函数体内进行初始化了(通过对成员变量进行赋值来进行初始化),为什么还需要初始化列表?

这是因为,有些类型的数据无法通过在构造函数体内进行赋值来进行初始化。这样的数据类型有下面3种:

  1. 引用成员变量
  2. const成员变量
  3. 自定义类型成员 (且它的类没有默认构造函数[即,它必须要进行传参])

上面的三种数据类型有一个共同的特点,它们都要求你在定义变量的时候进行赋值。

比如,引用成员变量,使用引用的时候必须进行初始化,否则语法就是错误的。

析构函数

析构函数的作用与构造函数相反,在对象的生命周期结束的时候会自动调用析构函数,完成类的一些资源清理的工作。

析构函数的特点

  • 析构函数名是在类名的前面加上~
  • 无参,无返回值
  • 一个类中有且只有1个析构函数。如果未显式定义,系统会自动生成默认的析构函数。(如果定义了,则采用显式定义的)
  • 对象生命周期结束时,C++编译系统会自动调用析构函数
  • 编译器生成的默认的析构函数,对内置类型(int, char, double...)不会做任何处理,但是会针对自定义类型的成员,会去调用它的析构函数

析构函数的一般使用情况:

一般使用在那些涉及到动态内存开辟空间的类中,因为这样的对象需要对其动态开辟的空间进行释放。


class Stack
{
public:
    //构造函数
	Stack(int n = 3)
	{
		_a = (int*)malloc(sizeof(int)*n);
		_size = 0;
		_capacity = n;
	}
    //析构函数
	~Stack()
	{
		free(_a);
		_size = _capacity = 0;
	}
private:
	int* _a;
	int _size;
	int _capacity;
};

拷贝构造函数

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象去创建新的对象时,编译器会自动调用拷贝构造函数。

拷贝构造函数的特点

  • 拷贝构造函数是构造函数的一个重载
  • 拷贝构造函数的参数只有1个,且必须使用引用传参,如果使用引用传值的形式会引发无限递归

拷贝构造函数的2种调用方法(完全等价的):


int main()
{
	Date d1(1);
	//拷贝构造函数
	Date d2(d1);  //1
	Date d3 = d1; //2
 
	return 0;
}

赋值运算符重载

在了解赋值运算符重载之前,我们需要先知道什么是运算符重载。

运算符重载

运算符重载是具有特殊函数名的函数。

函数名:关键字operator后面接需要重载的运算符符号(如:operator>)

函数原型:返回类型 operator操作符 (参数列表)

注意:

  • operator后面必须跟着的是操作符(这样是不可以的 operator@)
  • 重载操作符必须有一个类类型或者枚举类型的操作数
  • 用于内置类型的操作符,其含义无法改变。(比如内中的整型+,3+5这其中的+的意义不会改变)
  • this指针为限定的第一个形参,也就是this作为第一个操作数
  • .*、::、sizeof、?:、. 这5个操作符无法进行重载。

赋值运算符重载


class Date
{
public:
	Date(int year = 2021, int month = 4, int day = 11)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//赋值运算符重载
	Date& operator=(const Date& d)
	{
		_year = d._day;
		_month = d._month;
		_day = d._day;
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};

注意:赋值运算符重载必须有返回值,如果没有返回值的话,无法解决 a = b = c 这种连续赋值的操作。

拷贝构造函数与赋值运算符重载


Date d1(1);
	Date d2(0);
	
	//赋值运算符重载
	d2 = d1;     //注意,只有2个操作数都是已经定义过的变量时,才会调用赋值运算符重载
 
	//拷贝构造函数
	Date d3(d1);

浅拷贝

浅拷贝是你在没有写拷贝构造函数和operator=时,编译器自动调用的默认成员函数。它的功能是将对象以字节的为单位拷贝过去。

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

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可(编译器默认的基本就够用了),只有特殊情况,才需要重载,比如想让别人获取到指定的内容。


class Date
{
public:
    //取地址操作符重载
	Date* operator&()
	{
		return this;
	}
    //const取地址操作符重载
	const Date* operator&()const
	{
		return this;
	}
private:
	int _year;
	int _month;
	int _day;
};

到此这篇关于C++类中的六大默认成员函数的文章就介绍到这了,更多相关C++类默认成员函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!


class Date
{
public:
    //初始化列表
	Date(int year, int month, int day)
		:_year(year),
		 _month(month),
		 _day(day)
	{}
 
private:
	int _year;
	int _month;
	int _day;
};

--结束END--

本文标题: C++类中的六大默认成员函数详解

本文链接: https://lsjlt.com/news/123470.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++类中的六大默认成员函数详解
    在C++中,当你去创建一个类的时候,即便这个类是空类,也会自动生成下面6个默认成员函数,在本篇博客中,我将逐一分析下面6个默认成员函数。 构造函数 构造函数并不是去构造函数的函数,...
    99+
    2024-04-02
  • 详解C++中类的六大默认成员函数
    目录一、类的默认成员函数二、构造函数Date(形参列表)1、构造函数的函数名和返回值2、构造函数的调用3、构造函数的重载4、系统生成的默认构造函数5、系统生成的默认构造函数的作用6、...
    99+
    2022-11-13
    C++类默认成员函数 C++类六大默认成员函数 C++类成员函数
  • C++类中六个默认的成员函数详解
    目录浅谈构造函数析构函数拷贝构造函数赋值重载函数const成员函数取地址及const取地址重载函数深挖 构造函数拷贝构造函数赋值运算符重载函数总结浅谈 先来说一下“this...
    99+
    2024-04-02
  • C++中类的默认成员函数详解
    目录一、构造函数二、析构函数三、拷贝构造函数四、赋值函数(赋值运算符重载)总结C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声明)—&md...
    99+
    2024-04-02
  • C++中类的默认成员函数怎么用
    这篇文章主要介绍了C++中类的默认成员函数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声...
    99+
    2023-06-29
  • C++类的默认成员函数有哪些
    本文小编为大家详细介绍“C++类的默认成员函数有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++类的默认成员函数有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。类的默认成员函数每个类中,如果不主动实...
    99+
    2023-06-29
  • c++中类成员默认是什么类型
    未指定访问权限时,c++ 中类的成员默认访问权限为私有,只能由该类的成员函数访问。原因在于私有成员有助于封装数据,防止意外访问或修改敏感信息。例外包括友元声明和继承,其中友元和派生类可以...
    99+
    2024-05-09
    c++
  • 【C++类和对象】类有哪些默认成员函数呢?(下)
    文章目录 一、类的6个默认成员函数二、日期类的实现2.1 运算符重载部分2.2 日期之间的运算2.3 整体代码1.Date.h部分2. Date.cpp部分 三. const成员函数...
    99+
    2023-09-06
    c++ 开发语言
  • C++类的静态成员变量与静态成员函数详解
    目录1、类的静态成员变量2、静态成员函数总结1、类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成...
    99+
    2024-04-02
  • C++函数的默认参数详情
    文章转自微信 公众号:Coder梁(ID:Coder_LT) C++当中的支持默认参数,如果你学过Python,那么想必对此不会陌生。C++中的默认参数的用法和Python基本一致...
    99+
    2024-04-02
  • C++成员函数中const的使用详解
    目录修饰入参值传递址传递const修饰入参修饰返回值修饰函数总结const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用...
    99+
    2024-04-02
  • C++中的类成员函数当线程函数
    目录类成员函数当线程函数解决方法一解决方法二解决方法三类成员函数作为多线程的入口类成员函数当线程函数 C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该...
    99+
    2022-11-13
    C++类成员函数 C++线程函数 C++成员函数
  • C++类中隐藏的默认函数有哪些
    这篇文章主要介绍了C++类中隐藏的默认函数有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Test类中隐藏的六个默认的函数class Test{public:/...
    99+
    2023-06-29
  • C++超详细讲解函数参数的默认值
    目录1.参数默认值的指定方式2.参数默认值的指定规则1.参数默认值的指定方式 在 C++ 中,可以在函数声明时为参数提供一个默认值。这样在函数调用时,如果没有提供函数参数值,则使用默...
    99+
    2024-04-02
  • C++ 函数的默认参数和可变参数详解
    c++++ 默认参数允许为函数参数设置默认值,而在可变参数中,可以为函数提供任意数量的参数。具体而言:默认参数:允许在函数声明时为参数指定默认值,在调用时如果没有提供值则使用默认值。可变...
    99+
    2024-04-19
    编程 c++
  • C++的静态成员变量和静态成员函数详解
    目录一.static修饰变量二.static修饰函数三.static在类中使用1.创建与初始化 2.使用问题 3.在public、private下static变量使用 四.class...
    99+
    2024-04-02
  • Python的类成员变量默认初始值的坑及解决
    目录类成员变量默认初始值的坑问题发现示例代码结果原因解决方法Python默认值参数简单粗暴上代码可以用下面这种写法类成员变量默认初始值的坑 问题发现 一个循环内,缺省值初始化同名变量...
    99+
    2024-04-02
  • C++中Operator类型强制转换成员函数解析
    类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字 operato...
    99+
    2022-11-15
    类型强制转换 Operator C++
  • C++中成员函数和友元函数的使用及区别详解
    为什么使用成员函数和友元函数 这个问题至关重要,直接影响着后面的理解: 程序数据: 数据是程序的信息,会受到程序函数的影响。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一...
    99+
    2024-04-02
  • 怎么理解C++类的静态成员变量与静态成员函数
    本篇内容介绍了“怎么理解C++类的静态成员变量与静态成员函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、类的静态成员变量C++类的静态...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作