C++11 类的六个默认函数实现及使用
六个默认函数:
- 构造函数
A();
- 析构函数
~A();
- 拷贝构造函数
A(const A&);
- 赋值运算符重载
A& operator(const A& );
- 移动构造函数
A(const A&&);
- 移动赋值运算符重载
A& operator(const A&& );
#include<iostream>
using namespace std;
struct A {
//构造函数
A(int x = 0) :val(x)
{
cout << "A()" << endl;
}
//析构函数
~A()
{
cout << "~A()" << endl;
}
//拷贝构造
A(const A& _a) :val(_a.val)
{
cout << "A(const A&)" << endl;
}
//赋值构造
A& operator=(const A& _a)
{
cout << "operator=(const A&)" << endl;
if (this != &_a)
{
val = _a.val;
}
return *this;
}
//移动构造
A(A&& _a)noexcept
{
val = _a.val;
cout << "A(A&&)" << endl;
}
//移动赋值
A& operator=(A&& _a)noexcept
{
if (this != &_a)
{
val = _a.val;
}
cout << "operator=(A&&)" << endl;
return *this;
}
private:
int val;
};
int main()
{
A a1(10); //构造函数
cout << endl;
A a2(a1); //拷贝构造
cout << endl;
A a3;
a3 = a1; //赋值构造
cout << endl;
A a4(move(a1)); //移动构造
cout << endl;
A a5;
a5 = A();//移动赋值
cout << endl;
return 0;
}
执行结果
在实现拷贝构造函数时,传参时一定要是左值引用,否支会导致无限拷贝构造导致堆栈溢出。
同时在类属性中有指针成员时,要实现深拷贝,否则会出现非法访问或重复释放内存。
在某些情况下(函数返回对象引用),对象拷贝后立即就被消耗了。拷贝构造就回造成性能上的浪费,而且深拷贝也会造成浪费。移动构造可以避免这种情况的发生。为了支持移动构造,C++11引入了右值引用。在类属性成员有指针类型存在时能提高执行效率和简化资源转移过程。赋值和移动赋值之间也类似。