「C++」类的六大默认成员函数

在这里插入图片描述

文章目录

  • 前言
  • 构造函数与析构函数
    • 构造函数
      • 特性
      • 初始化列表
    • 析构函数
      • 特性
  • 拷贝函数与重载函数
    • 拷贝函数
      • 特征
    • 赋值函数
      • 特征
    • 取地址与const取地址重载函数
  • 总结


前言

如果一个类为空,那么它真的是空类吗,当然不是的,类无论是否为空,编译器都会为其增加六个默认的成员函数,本文将为你介绍这六个函数

「C++」类的六大默认成员函数_第1张图片

构造函数与析构函数

构造函数

构造函数是一种特殊的成员函数,用于初始化对象的成员变量,每次创造对象时都会调用,并且只调用一次。对需要动态开辟内存空间的类可以有助于确保对象正确被初始化。

class cat
{
private:
	char* _name;
public:
	cat();	//默认构造函数应不带参数或带缺省值
	//cat(const char* _name = "miu!");	带缺省值的初始化方式
};

特性

虽然构造函数可以用于开辟空间,但其主要用途还是用与初始化成员函数。

特征:

  • 函数名与类名相同
  • 构造函数无返回值类型声明
  • 可被重载
  • 如果没有显式定义,编译器则会生成一个不带参数的构造函数
  • 对象实例化时自动调用

初始化列表

为了解决成员变量中的引用成员变量,const 成员变量等不能直接赋值的情况,C++使用了初始化列表来解决。初始化列表在构造函数中使用,无论是否显式使用,编译器都会调用它,所以建议优先使用初始化列表进行初始化。

class cat
{
public:
	cat(int age = 9, const char* name = "liya") :_age(age), _name(name)	{}	//使用初始化列表初始化。
private:
	int _age = 0;
	char* _name = nullptr;
};

注意:初始化的顺序和成员变量的声明顺序一样,并且不会改变

析构函数

析构函数是用于清理成员变量的的特殊成员函数,当对象被销毁时调用,且在对象的生命周期内只调用一次。常被用于清理动态开辟的成员变量

class Arr
{
public:
	Arr(int* data = nullptr, size_t sz = 0)		//构造函数
	:_size(sz)
	,_data(new int[sz])
	{
		memcpy(_data, data);
	}
	~Arr() { delete [] _data; } 	//析构函数
private:
	size_t _size;
	int* _data;
};

特性

析构函数与构造函数相反,主要用于清理成员的资源。

特征:

  • 与类同名,前面加~
  • 一个类只能有一个析构寒素
  • 类销毁时自动调用
  • 是默认成员函数之一

拷贝函数与重载函数

拷贝函数

拷贝函数是用于完成对象的拷贝操作的函数,是构造函数的重载,形参为类对象的const引用,主要用于解决深拷贝的问题。

class Vector
{
public:
	Vector() {};
	//形参必须为引用,否则会陷入死循环
	Vector(const Vector& arr)	//拷贝构造函数
	:_size(arr._size)
	,_data(new int[size])
	{							
		memcpy(_data, data);	//进行深拷贝,避免出现内存复用的情况
	}
	~Vector();
private:
	//C++11支持给成员变量缺省值
	size_t _size = 0;
	int* _data = nullptr;
};

特征

  • 是构造函数的重载
  • 可以被默认生成(只做浅拷贝)
  • 拷贝函数可以被重载,可以指定不同版本以应对不同情况
  • 只能有一个参数且必须为类对象的引用
  • 默认完成字节序的值拷贝

赋值函数

赋值函数其实就是赋值操作符重载,操作符重载是C++为了加强代码的可读性而引入的功能,大大的方便了类之间的计算。

注意:

  • 不能通过连接其他符号来创建新的操作符:比如operator@
  • 重载操作符必须有一个类类型参数
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this指针
  • .* :: sizeof ?: . 以上五个操作符不能够重载。
class A
{
public:
	A(int a = 0):_aa(a) {}
	//必须返回A&,例子: int a = b = c;
	A& operator=(const A& val):_aa(val._aa) { return *this; }	//赋值操作符重载
private:
	int _aa;
};

A aa(21);
A bb = aa;	

特征

当我们没有显式定义时,编译器会给我们生成一个默认的赋值重载函数,而且会给成员变量做浅拷贝,内置类型变量会直接赋值,自定义类型变量会调用其拷贝函数。

取地址与const取地址重载函数

这两个函数一般不用重新定义,函数返回类对象的引用。

class A
{
public:
	A* operator&() { return this; }
	const A* operator&*() { return this; }
};

总结

类的默认成员函数有构造函数、析构函数、拷贝函数、赋值重载、取地址重载、const取地址重载。

博客主页:主页
我的专栏:C++
我的github:github

你可能感兴趣的:(C++,c++,java,开发语言)