newClass a = Func(3)中隐藏的操作
缘起
#include <iostream>
#include <bitset>
using namespace std; class A
{
public:
A() { cout << "default constructor!" << endl; }
A(int i) { cout << "constructed by parameter:" << i << endl; }
~A() { cout << "destructed" << endl; }
}; A Play(A a)
{
return a;
}
int main()
{
// A temp;
A temp = Play();
cout << "-----------------------" << endl;
}
执行结果

问题1:为何有两个析构函数
执行函数Play(2)时,函数返回一个类型为A的对象,这个临时对象,这个对象是临时的,在赋值给temp后立马消失(即析构,程序中“---”为证)。然后A temp = Play(2)等号前半部分调用默认拷贝构造函数把函数返回的值赋给temp。main()函数结束时temp也就over了。
问题2:为何函数接收的是类,而传递的是整形的也行?
可以的,这里单个参数构造函数会定义一个隐性的类型转换,从参数的类型转换到自己。如果不让他转换,可以在构造函数前加入关键字“explicit”,例如
#include <iostream>
#include <bitset>
using namespace std; class A
{
public:
A() { cout << "default constructor!" << endl; }
A(int i) { cout << "constructed by parameter:" << i << endl; }
~A() { cout << "destructed" << endl; }
}; A Play(A a)
{
return a;
}
int main()
{
// A temp;
A temp = Play();
cout << "-----------------------" << endl;
}
错误提示

问题3: 既然有两个析构函数,为什么没有两个构造函数,即A temp不调用无参数的构造函数吗?
有两个析构函数,同时也有两个构造函数,只不过A temp = Play(2);调用的不是无参数的构造函数,而是默认的拷贝构造函数(不信你看下边的程序),区别A temp;(这里确实调用无参数的构造函数)
#include <iostream>
#include <bitset>
using namespace std; class A
{
public:
A() { cout << "default constructor!" << endl; }
A(int i) { cout << "constructed by parameter:" << i << endl; }
A(const A &a)
{ cout << "here" << endl; }
~A() { cout << "destructed" << endl; }
}; A Play(A a)
{
return a;
}
int main()
{
// A temp;
A temp = Play();
cout << "-----------------------" << endl;
}
输出

newClass a = Func(3)中隐藏的操作的更多相关文章
- docker containerd中的容器操作
containerd的中的各种操作都是通过Task来进行的,因此对于容器的create, start, delete等等操作其实都是一个个的Task而已. Task的数据结构如下所示: type Ta ...
- 盘点Windows 8.1中隐藏着的25个秘密功能
Windows 8.1正式版问世,带来了众多大家早已耳熟能详的“开始按钮”.“分屏显示”等功能.事实上,Windows 8.1贴心的设计细节有很多,多数细节隐藏于系统中某个不起眼的角落,科技网站PC ...
- js中frame的操作问题
这里以图为例,在这里把frame之间的互相操作简单列为:1变量2方法3页面之间元素的互相获取. A 首先从 父(frameABC)------->子(frameA,frameB,frameC) ...
- LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
- 第三章(jQuery中的DOM操作)
3.1 DOM 操作分类 ①DOM Core 包括(getElementById() , getElementsByTagName() , getAttribute() , setAttribute( ...
- xBIM WeXplorer xViewer的导航,相机、剖切、隐藏 等操作
目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...
- 在Python程序中的进程操作,multiprocess.Process模块
在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...
- python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块)
昨日内容回顾 操作系统纸带打孔计算机批处理 —— 磁带 联机 脱机多道操作系统 —— 极大的提高了CPU的利用率 在计算机中 可以有超过一个进程 进程遇到IO的时候 切换给另外的进程使用CPU 数据隔 ...
- 【Selenium】selenium中隐藏元素如何定位?
前言 面试题:selenium 中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~很多面试官自己都搞不清楚 ...
随机推荐
- gif修改背景透明
1.用ImageReady打开,将选中所有帧,右键选择“恢复为背景”. 2.打开“颜色板”,点击左下角的惊叹号,用吸色器点击背景,颜色板自动选中了背景色,将其映射为透明. 3.文件->将优化结果 ...
- Query execution was interrupted, max_statement_time exceeded
版本:5.6.16 群里看见一个问题,在备份的时候,报如下错误:[root@B28-19-75 bak]# mysqldump -root -p --single-transaction --mast ...
- .NET4.5中WCF中默认生成的basicHttpsBinding的研究
起因: 使用.net4.5建立了一个空白的WCF服务.默认使用的绑定配置是basicHttpsBinding. 问题发现: 1.用客户端进行服务引用,生成了默认的配置文件,其中绑定配置是basicHt ...
- List<T>中Exists 和Contains的区别
.net编码中,使用泛型List<>时,经常遇到这样的需求:新来一个Model对象,如果已有的List中没有这条数据,则把新对象Add到List中,否则不处理 判断已有的List中是否包含 ...
- Video Toolbox:读写解码回调函数CVImageBufferRef的YUV图像
本文档基于H.264的解码,介绍读写Video Toolbox解码回调函数参数CVImageBufferRef中的YUV或RGB数据的方法,并给出CVImageBufferRef生成灰度图代码.方便调 ...
- 学习KnockOut第三篇之List
学习KnockOut第三篇之List 欲看此篇---------------------------------------------可先看上篇. 第一步,先搭建一个大概的框架起来 ...
- Oracle 删除表分区
删除表分区(drop partition) 删除表分区包含两种操作,分别是: Ø 删除分区:alter table [tbname] drop partition [ptname] UPDA ...
- cookieContainer应用
PublicSharedFunctionGetCookiesSetByPage(ByVal strUrl AsString,ByVal cookieToProvide AsString)AsIEnum ...
- Ext学习-基础组件介绍
1.目标 学习对象获取,组件基础,事件模型以及学习ExtJS中的基础组件的应用. 2.内容 1.对象获取 2.组件原理以及基础 3.事件模型 4.常用组件的介绍 3.学习步骤 1 ...
- Windows下JNI执行步骤
问题描述: java JNI使用 问题解决: JNI编写步骤: (1)编写带有native声明的方法的java类 (2)使用javac编译所写的java类,然后使用javah生成扩展名 ...