首页 > 其他分享 ><一>对象使用过程中背后调用了哪些方法

<一>对象使用过程中背后调用了哪些方法

时间:2022-12-01 10:15:17浏览次数:41  
标签:调用 哪些 背后 创建 int 对象 Test 临时 构造函数

代码1

#include <iostream>
using namepspace std;

class Test
{
	public:
		Test(int a=10):ma(a){cout<<"Test()"<<endl;}
	    ~Test(){cout<<"~Test()"<<endl;}
		Test(const Test & t):ma(t.ma){cout<<"Test(const Test & t)"<<endl;}
		Test & operator =(const Test & t){
		     if(this==&t){return *this;}
			 ma=t.ma;
			 return *this;
		}

	private:
		int ma;
};

int main(){

   Test t1();  //构造函数
   Test t2(t1);//拷贝构造
   Test t3=t1; //拷贝构造
   Test(20);   //显示生成一个临时对象,生存周期,所在语句
   Test t4=Test(20);//这里并不会先Test(20)创建临时对象,再用临时对象拷贝构造Test
   //上面会优化直接使用构造函数 和 Test t4(20)没有区别

   //C++编译器对于对象构造的优化,用临时对象生成新对象的时候,这个临时对象不会产生
   //直接构造新对象就可以了

   //赋值函数
   t4=t2;

   //t4是已经存在的对象
   //会生成一个临时对象,用这个临时对象给t4赋值,这句话还要做临时对象析构
   t4=Test(30);

   //int->Test 的时候,Test有没有合适的带整形参数的构造函数,显示的调用Test构造函数 创建临时对象
   t4=(Test)30;
   
   //int->Test 的时候,Test有没有合适的带整形参数的构造函数 隐式转换 创建临时对象
   t4=30;
   
   
   //创建一个临时对象,用p指针指向这个临时对象,但是出了这个语句,这个临时对象就析构了,
   //这个指针指向了一个析构的对象了!!不可以.
   Test *p =&Test(40);
  
   //Test(50);会创建一个临时对象,但是指定了一个引用(别名)指向他后,这个临时对象不会产生
   //出了这个语句不会析构,这个是可以
   const Test &ref=Test(50);

   return 0;
}

代码2

#include <iostream>
using namespace std;

class Test
{
	public:
		Test(int a=10,int b=20):ma(a),mb(b){cout<<"Test(int,int)"<<endl;}
	    ~Test(){cout<<"~Test()"<<endl;}
		Test(const Test & t):ma(t.ma),mb(t.mb){cout<<"Test(const Test & t)"<<endl;}
		Test & operator =(const Test & t){
		     if(this==&t){return *this;}
			 ma=t.ma;
			 mb=t.mb;
			 cout<<"operator="<<endl;
			 return *this;
		}

	private:
		int ma;
		int mb;
};

//程序启动后,全局变量先构造, 第1个创建
//第12个析构
Test t1(10,20);

int main(){
	
	//Test(int,int) 第3个构造
	//第9个析构
        Test t2(30,40);
	
	//拷贝构造t3,第4个构造
	//第8个析构
        Test t3=t2;
	
	//静态局部变量,在程序运行的时候,内存已经分配好,但是没有初始化
	//初始化要等到第一次运行的时候才初始化
	//构造函数 第5个构造 创建t4,不产生临时对象,等价static Test t4(40,50)
	//第10个析构
        static Test t4=Test(40,50);
	
	//构造函数 第6个构造,创建临时对象给t2赋值,出语句析构临时对象
        // 第1个析构
	t2=Test(1,2);
	
	//构造函数 第7个构造,创建临时对象给t2赋值,出语句析构临时对象
        //Test(50,500) 调用的是 Test(int a=50,int b=500)的构造函数,(Test)(50,500) (50,500)是表达式结果是500,
        //然后调Test(int a=500,int b=20默认值) 进行对象构造
	//第二个析构
        t2=(Test)(50,500);
	
	//隐式构造,构造函数Test(60,20) 第8个构造,创建临时对象给t2赋值,出语句析构临时对象
	//第三个析构
        t2=60;
	
	//堆上构造对象,构造函数Test(60,20) 第9个构造,指针指向堆地址
	//第5个析构
        Test *p1=new Test(8,9);
	
	//堆上构造2个对象,2次调用构造函数Test(10,20) 第10个构造,指针指向首元素地址
	//第6个析构
        Test *p2=new Test[2];
	
	//第11个构造 栈上创建临时对象,Test(80,80),指针指向临时对象,出作用域后,析构该临时对象
	//第4个析构
        Test *p3=&Test(80,80);
	
	//第12个构造 栈上创建临时对象,Test(90,100) 引用指向该临时对象,引用指向临时对象后,该对象
	//不再是临时对象,出了这个语句不析构
	//第7个析构
        const Test &p4=Test(90,100);
	
        //调用P1指向析构函数
	delete p1;
        //调用析构函数,析构2个对象
	delete[] p2;
	
        return 0;
}

//第2个创建 构造函数
//第11个析构
Test t5(200, 250);

标签:调用,哪些,背后,创建,int,对象,Test,临时,构造函数
From: https://www.cnblogs.com/erichome/p/16939124.html

相关文章

  • Clover引导都支持哪些.efi文件
    接下来给大家介绍EFI/Clover/drivers/UEFI目录下可能会用到的一些​​.efi​​文件:1.AptioInputFix.efi「为使用AMIUEFIBIOS的主板提供FileVault2键盘驱动」2.ApfsDrive......
  • Clover引导都支持哪些.efi文件
    接下来给大家介绍EFI/Clover/drivers/UEFI目录下可能会用到的一些​​.efi​​文件:1.AptioInputFix.efi「为使用AMIUEFIBIOS的主板提供FileVault2键盘驱动」2.ApfsDrive......
  • 每日一抄 Go语言模拟远程调用
    packagemainimport( "errors" "fmt" "time")//客户端请求和接收封装/*下面代码封装了向服务器请求数据,等待服务器返回数据,如果请求超时该函数还会处理超时逻辑......
  • SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) 被调用2次
    问题GAS技能输入绑定失效。直接原因在ListenServer的一端,ACharacter::SetupPlayerInputComponent在游戏开始后,被调用了2次,说明第1次输入绑定的InputComponent被移除(......
  • springcloud之远程调用
        在微服务架构中,通常存在多个服务之间的远程调用的需求.远程调用通常包含两个部分:序列化和通信协议.常见的序列化协议包括json,xml,bytes等.目前主流的远程调用......
  • spingcloud之基于ribbon的远程调用&负载均衡
    1-服务调用eureka内部继承了ribbon在创建RestTemplate的时候,声明@LoadBalanced在服务消费者order_service中,找到启动类OrderApplicationpackagecn.itcast.order;importo......
  • 调用运行时类的指定结构:属性、方法、构造器
    packageday3;importorg.junit.Test;importjava.lang.reflect.Field;importjava.lang.reflect.Method;//调用运行时类的指定结构:属性、方法、构造器publicclassR......
  • Python学习(二):字符串常用函数有哪些?
    1.检验字符串长度:len(str);a="hellopython"len(a)12a="hellopython"len(a[::2])##从头取到尾,隔一个取值的长度6 2.切割字符串:obj.split(str);a="hell......
  • 智能云解析DNS有哪些核心技术?-中科三方
    ​传统解析技术经常出现线路拥堵、解析延迟、遭受DDoS攻击和DNS劫持等问题,已无法满足用户和企业对解析及时性、稳定性和安全性的需求。​​智能云解析DNS​​做为新一代解析......
  • 智能云解析DNS有哪些核心技术?-中科三方
    传统解析技术经常出现线路拥堵、解析延迟、遭受DDoS攻击和DNS劫持等问题,已无法满足用户和企业对解析及时性、稳定性和安全性的需求。智能云解析DNS做为新一代解析技术,可完......