//对象的初始化和销毁
#include<utility> //定义重载关系运算符 简化关系运算符的写入和pair类型
#include<bits/stdc++.h>
using namespace std;
class HaveAll{
public:
HaveAll() : member(0) // 默认初始化函数
{
cout<<" default constructor "<<member<<endl;
}
HaveAll(int n) : member(n) // 隐式转换构造函数
{
cout<<" converting constructor "<<member<<endl;
}
HaveAll(const HaveAll& lh) : member(lh.member) // 拷贝构造函数
{
cout<<" copy constructor "<<member<<endl;
}
HaveAll(HaveAll &&rh) noexcept : member(rh.member) // 移动构造函数
{
cout<<" move constructor "<<member<<endl; // noexpect 表示这个函数不能抛出任何的异常
}
~HaveAll()
{
cout<<" destructor constructor "<<member<<endl;
}
HaveAll &operator = (const HaveAll &r)
{
member = r.member;
cout<<" copy assignment "<<member<<endl;
return *this;
}
HaveAll &operator = (const HaveAll &&rr)noexcept
{
member = rr.member;
cout<<" move assignment "<<member<<endl;
return *this;
}
void print()const
{
cout<<member<<endl;
}
private:
int member = 0;
};
int main(void)
{
cout<<"1: ";//默认初始化
HaveAll one;//定义对象的时候没有指定初始值 自动调用默认初始化函数
cout<<"2: ";//拷贝初始化
HaveAll two = one;
cout<<"3: ";//直接初始化
HaveAll three(one);//初始值在圆括号()中 可以提供对各初始值 根据初始值的类型和个数直接调用最匹配的构造函数 这里就调用了HaveAll(const HaveAll &lh)初始化函数
//HaveAll other(12); 也是直接初始化 但是调用的是 HaveAll(int n) : member(n) 函数进行初始化
cout<<"4: ";//拷贝初始化
HaveAll four = 4;// 发生在用等号初始化一个对象时 首先使用等号右边的初始值创建一个对象 赋值给新创建的对象 用等号右边的初始值创建一个对象 赋值给新创建的对象
//等号右边的值只能有一个 调用与初始值类型匹配的构造函数 这里调用的就是 HaveAll(int n) : member(n) 函数
//先创建后 拷贝 同类型的对象赋值操作会引起拷贝构造函数的调用 但是却没有在输出中发现拷贝构造函数的调用
//实际上 编译器可以跳过拷贝构造函数得调用直接创建对象 要求 拷贝构造函数必须存在且可以被访问(public成员)
cout<<"5: ";//列表初始化 一个对象
HaveAll five{5};// 用花括号里面得每一个值来初始化构造对象 特别得是 这个可以是一个初始值得列表 来初始化数组得每个元素 如果给出的元素小于数组的大小 则
//剩下的元素通过默认初始化进行赋值操作。
//HaveAll arr2[3] = {8,9};
//*************************************************************************************************************************************************************************
cout<<"6: ";//拷贝初始化
HaveAll six = std::move(one);
cout<<"assignment one"<<endl;
one = 1;
cout<<"assignment two: "<<endl;
two = four;
cout<<"array without initial value"<<endl;
HaveAll arr1[2]; // 默认初始化
cout<<"array with initial value"<<endl;
HaveAll arr2[3] = {8,9}; // 列表初始化 对象数组
cout<<"new an object: ";// 动态创建对象 默认初始化
HaveAll *ph = new HaveAll;
cout<<"delete pointer: ";
delete ph;
cout<<"Over"<<endl;
return 0;
}
对象的初始化的例子函数
最新推荐文章于 2022-09-01 15:02:48 发布