当前位置: 首页 > article >正文

c++180copy构造函数的调用

在这里插入图片描述

#include<iostream>
using namespace std;

class Test2
{
public:
	Test2()
	{
		m_a = 0;
		m_b = 0;
		cout << "无参构造函数" << endl;

	}
	Test2(int a,int b)//有参构造函数 //三种方法 
	{
		m_a = a;
		m_b = b;
		cout << "有参构造函数" << endl;

	}
	//赋值构造函数
	Test2(const Test2& obj)
	{
		cout << " 也是构造函数" << endl;
	}
protected:
private:

	int m_a;
	int m_b;
};
void main()
{
	Test2 t1(1,2);//什么都没写调用无参构造
	//2 =
	Test2 t2 = (3,4);// =  进行功能性增强 

	//Test2 t3 = 5;
	//3 直接调用构造函数 手动
	Test2 t4 = Test2(1, 4);//匿名对象的去和留
	//t4对象的初始化 
	t1 = t4;//把t4 copy给 t1 
	//对象的初始化 和 对象的赋值是不同的东西 
	return;
}

在这里插入图片描述
为什么需要构造析构函数

#include<iostream>
using namespace std;
 
class Test3
{
public:
	void init(int _a, int _b)
	{
		a = _a;
		b = _b;
	}
protected:
private:
	int a;
	int b;
};



void main()
{
	//copy函数默认提供
	Test3 t1;// 类没有提供构造函数 编译器会自动给予提供默认的构造函数
	int a = 10;
	int b = 39;
	t1.init(a, b);
	Test3 tArray[3];
	return;
}
#include<iostream>
using namespace std;
class Test4
{
public:
    // 有参构造函数
    Test4(int a, int b)
        : m_a(a), m_b(b)
    {
        cout << "有参构造函数" << endl;
    }

    // 复制构造函数
    Test4(const Test4& obj)
        : m_a(obj.m_a), m_b(obj.m_b)
    {
        cout << "也是构造函数" << endl;
        m_b = obj.m_b+100;
        m_a = obj.m_a+23;
    }
public :
    void print()
    {
        cout << "normal function" << endl;
        cout << m_a<<m_b<< endl;
    }
private:
    int m_a;
    int m_b;
};

// 1 赋值构造函数 用一个函数初始化另一个函数
void main()
{
	Test4 t1(1, 2);
	Test4 t0(1, 2);

    //赋值操作会不会调用构造函数:不会调用-
    t0 = t1;//用t1给t0赋值 到操作和初始化是两个不同的概念 
	// 第一种
    //Test4 t2 = t1;//用t1来初始化t2
    // t2.print();

    //第二种 用t1 初始化t2
    Test4 t2(t1);
    t2.print();

	return;
}
#include<iostream>
using namespace std;
class  Location
{
public:
	Location(int xx = 0, int yy = 0)
	{
		X = xx; Y = yy; cout << "constructor Object" << endl;
	}
	Location(const Location &p)//copy构造桉树
	{
		X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
	}
	~Location()
	{
		cout << X << "," << Y << "oBJECt dsetroyed" << endl;
	}
	int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};
void f(Location p)
	{
		cout << p.GetX() << endl;
	}

void main()
{
	Location a(1, 2);
	Location b = a;//自动调用copy构造函数 


	f(b);//b形参区初始化形参p  会调用copy构造函数


	return;
}
#include<iostream>
using namespace std;
class  Location
{
public:
	Location(int xx = 0, int yy = 0)
	{
		X = xx; Y = yy; cout << "constructor Object" << endl;
	}
	Location(const Location &p)//copy构造桉树
	{
		X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
	}
	~Location()
	{
		cout << X << "," << Y << "oBJECt dsetroyed" << endl;
	}
	int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};
void f(Location p)
	{
		cout << p.GetX() << endl;
	}
void playobj()
{
	Location a(1, 2);
	Location b = a;//a 对象初始化b  自动调用copy构造函数 
	cout << "b对象完初始化" << endl;
	f(b);//b形参区初始化形参p  会调用copy构造函数

}

void main()
{
	Location a(1, 2);
	Location b = a;//a 对象初始化b  自动调用copy构造函数 
	return;
}

注意调用机制

#include<iostream>
using namespace std;
class  Location
{
public:
	Location(int xx = 0, int yy = 0)
	{
		X = xx; Y = yy; cout << "constructor Object" << endl;
	}
	Location(const Location &p)//copy构造桉树
	{
		X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
	}
	~Location()
	{
		cout << X << "," << Y << "oBJECt dsetroyed" << endl;
	}
	int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};

//g函数返回一个元素
Location g()
{
	Location A(1, 2);
	return A;
}
//
void objplay()
{
	g();
}

void main()
{
	objplay();
	return;
}

在这里插入图片描述
把a析构了
在这里插入图片描述
g返回了一个匿名对象 没有人用所以析构掉
调用两个函数

	Location A(1, 2);

有参构造 函数

return A;

匿名对象函数

#include<iostream>
using namespace std;
class  Location
{
public:
	Location(int xx = 0, int yy = 0)
	{
		X = xx; Y = yy; cout << "constructor Object" << endl;
	}
	Location(const Location &p)//copy构造桉树
	{
		X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
	}
	~Location()
	{
		cout << X << "," << Y << "oBJECt dsetroyed" << endl;
	}
	int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};

//g函数返回一个元素  
//结论:函数的返回值是元素 (复杂类型) 汉辉的是一个新的的匿名对象 
//所以会调用匿名对象的copy构造函数
//匿名对象的去和留
Location g()
{
	Location A(1, 2);
	return A;
}
//
void objplay()
{
	g();
}

void objplay2()
{
	Location m=g();//把匿名对象直接初始化为m
	//匿名对象初始化m  此时c++编译器 直接把匿名对象转成m 从匿名子转换成有名字
	//牺牲内存 加快c++编译速度 
	//返回一个新对象 (没有名字)
	cout << "匿名对象被扶正 不会被析构" << endl;
	cout << m.GetX() << endl;
}
void objplay3()
{
	//如果匿名对象赋值给应一个同类型对象 被析构
	Location m2(1, 2);
	m2 = g();
	cout << "因为匿名对象=给m2 被析构"<<endl;
	cout << m2.GetX() << endl;
}
void main()
{
	//objplay();
	//objplay2();
	objplay3();
	return;
}



http://www.kler.cn/a/298324.html

相关文章:

  • 第10章 Service 和 BroadcastReceiver
  • Sobel边沿检测
  • 【前端】vue+html+js 实现table表格展示,以及分页按钮添加
  • Dubbo 安全方面措施
  • 【机器人工具箱Robotics Toolbox开发笔记(十三)】三自由度机器人圆弧轨迹规划仿真实例
  • InfluxDB和OpenTSDB两种时序数据库应用场景
  • Mysql基础练习题 1757.可回收且低脂的产品(力扣)
  • 二叉树 - 验证二叉搜索树
  • 知识蒸馏-KD
  • js 有关小数的方法
  • 低代码开发技术在农村现代化中的应用探索
  • FPGA硬件设计语言:VHDL和System Verilog
  • 叠螺污泥脱水机的成本包括哪些方面
  • 如何在红米手机中恢复已删除的照片?(6 种方式可供选择)
  • .NET 自定义过滤器 - ActionFilterAttribute
  • Go入门语法
  • Git的基本概念和使用方式
  • 2024临床常用的肺栓塞评估量表汇总!
  • 基于Ubuntu+PostgreSQL+Zip搭建SonarQube环境
  • 【计算机网络】UDP TCP介绍