📄前言
如果一个类为空,那么它真的是空类吗,当然不是的,类无论是否为空,编译器都会为其增加六个默认的成员函数,本文将为你介绍这六个函数
🌺构造函数与析构函数
🍃构造函数
构造函数是一种特殊的成员函数,用于初始化对象的成员变量,每次创造对象时都会调用,并且只调用一次。对需要动态开辟内存空间的类可以有助于确保对象正确被初始化。
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取地址重载。