<一>对象使用过程中背后调用了哪些方法
代码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);
<一>对象使用过程中背后调用了哪些方法的更多相关文章
- 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法
错误如题:使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法 报错如下: 解决方法: 1.首先查看你的lombok插件是否下载安 ...
- Office word 2013中直接调用MathType的方法
Office word 2013中直接调用MathType的方法 | 浏览:4403 | 更新:2014-02-20 14:45 | 标签: word 使用Office word 2013的用户肯定早 ...
- CEF3中js调用delphi内部方法
2015-01-20修改:以下方法不适合delphi7,在CEF3源码中限制了delphi_14 up,对于被我误导的朋友说声抱歉 在CEF1中JS调用delphi的方法已经贴过:http://www ...
- win7 安装过程中遇到的错误解决方法
win7 安装过程中遇到的错误解决方法 windows安装无法继续.若要安装windows 请单击 确定 重新启动计算机: 当 出现如上提示的时候,按下shift+f10 会打开命令窗口,进入到C:\ ...
- 【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理
原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...
- 安装过程中出现PKG_CONFIG_PATH的问题解决方法
在安装开源软件的过程中, 经常会碰到提示配置PKG_CONFIG_PATH路径, 或者直接提示没有安装某某库, 但是我们已经安装了啊. 其实造成这种情况的原因很简单, 就是安装的目录不能被依赖程序找到 ...
- python中子类调用父类的方法
1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...
- ThreadLocal对象使用过程中容易陷入的坑
ThreadLocal对象帮助我们管理线程内的对象,保证对象在线程之间是相互隔离的. 今天碰到的坑是这样的: index01.html页面加载的时候会发送一次a请求,然后点击附件上传的时候会发送上传请 ...
- linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法
Oralce安装教程 1.先安装需要的依赖包 找到哪个没有安装,直接yum install XX,直到所有的都安装完成.注意,可能一个包安装了,再次执行检查,还是提示没有安装,那么就不需要管他们了, ...
- 使用speex动态链接库过程中遇到问题及解决方法
本以为speex的应用程序很容易就能跑起来,可是,实际操作中才发现,这里面暴露 的问题还真不少.看来以后不能眼高手低了,知行合一,这个一定要牢记在心中. speex安装成功后,可以一直无法调用动态链接 ...
随机推荐
- avue常用场景记录
接手的一个项目使用的是avue这个傻瓜式的专门给后端人员用的框架,文档不够友好,使用起来各种蛋疼(咱专业前端基本上不使用).为此,专门记录一下.当前avue版本2.8.12,如果要切换avue的版本, ...
- AlertManager企业微信报警,时间是UTC时间,错8个小时的两种解决办法
第一种 {{ (.StartsAt.Add 28800e9).Format "2020-01-02 15:04:05" }} 或者是 {{ ($alert.StartsAt.Add ...
- 2>&1到底是什么意思?
java -jar snapshot.jar > snapshot.log 2>&1 & 写Java的朋友一定对上面的命令很熟悉,相信大部分人都知道>表示的是重定向, ...
- C#高级特性(反射)
今天来讲解反射的应用: 一.反射是什么? 简诉一下,反射就是.Net Framework 的一个帮助类库,可以获取并使用metadata(元数据清单):说的通俗易懂点,就是不用通过引用,仍然可以使用其 ...
- 第三周python作业
import datetime mot = ["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择.", "今天星期二:\n含泪播种的人一定会笑着收." ...
- 如何0到1构建DevOps?
从0到1构建DevOps,首先得弄清楚这个DevOps的受众群体,它的用途到底是什么,解决什么问题,比如Android Studio是为了解决Android应用的开发,3UCS xPlus是为了解决应 ...
- 将 N 叉树编码为二叉树
将 N 叉树编码为二叉树 作者:Grey 原文地址: 博客园:将 N 叉树编码为二叉树 CSDN:将 N 叉树编码为二叉树 题目描述 将一棵n叉树编码为一棵二叉树,并对二叉树进行解码,得到原始的n叉树 ...
- 洛谷P2880 [USACO07JAN] Balanced Lineup G(树状数组/线段树)
维护区间最值的模板题. 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5 ...
- P1896 [SCOI2005] 互不侵犯 方法记录
原题链接 [SCOI2005] 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
在最新版的 .NET 平台中,微软在逐步放弃 System.Drawing.Imaging ,给出的理由如下: System.Drawing命名空间对某些操作系统和应用程序类型有一些限制. 在Wind ...