纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

wuqiongjin   2021-04-13 我要评论
想了解C++类中的六大默认成员函数详解的相关内容吗wuqiongjin在本文为您仔细讲解C++类默认成员函数的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++类默认成员函数,C++类六大默认成员函数,C++类成员函数下面大家一起来学习吧。

在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;
};
class Date
{
public:
    //初始化列表
	Date(int year, int month, int day)
		:_year(year),
		 _month(month),
		 _day(day)
	{}
 
private:
	int _year;
	int _month;
	int _day;
};

相关文章

猜您喜欢

  • 正则匹配最后一个字符串 怎样使用正则匹配最后一个字符串详解

    想了解怎样使用正则匹配最后一个字符串详解的相关内容吗putline在本文为您仔细讲解正则匹配最后一个字符串的相关知识和一些Code实例欢迎阅读和指正我们先划重点:js正则表达式匹配字符串,正则匹配最后一次出现的字符,正则表达式提取字符串下面大家一起来学习吧。..
  • 学习html标签 怎样学习html的各种标签

    想了解怎样学习html的各种标签的相关内容吗南岸青栀*在本文为您仔细讲解学习html标签的相关知识和一些Code实例欢迎阅读和指正我们先划重点:学习html各种标签,常用html5标签学习下面大家一起来学习吧。..

网友评论

Copyright 2020 www.Musicdownload3mp.com 【飞音下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式