对象的初始化的例子函数

//对象的初始化和销毁
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值