如果一个类为空,那么它真的是空类吗,当然不是的,类无论是否为空,编译器都会为其增加六个默认的成员函数,本文将为你介绍这六个函数
构造函数是一种特殊的成员函数,用于初始化对象的成员变量,每次创造对象时都会调用,并且只调用一次。对需要动态开辟内存空间的类可以有助于确保对象正确被初始化。
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++为了加强代码的可读性而引入的功能,大大的方便了类之间的计算。
注意:
.* :: 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;
当我们没有显式定义时,编译器会给我们生成一个默认的赋值重载函数,而且会给成员变量做浅拷贝,内置类型变量会直接赋值,自定义类型变量会调用其拷贝函数。
这两个函数一般不用重新定义,函数返回类对象的引用。
class A
{
public:
A* operator&() { return this; }
const A* operator&*() { return this; }
};
类的默认成员函数有构造函数、析构函数、拷贝函数、赋值重载、取地址重载、const取地址重载。
博客主页:主页
我的专栏:C++
我的github:github