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(2);
    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(2);
    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(2);
    cout << "-----------------------" << endl;
}
复制代码

输出

 




本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3615563.html,如需转载请自行联系原作者


相关文章
|
JavaScript
判断函数是否标记为async
判断函数是否标记为async
判断函数是否标记为async
|
5月前
|
JavaScript
箭头函数与普通函数(function)的区别
箭头函数是ES6引入的新语法,相比传统函数表达式更简洁,且没有自己的this、arguments、super或new.target绑定,而是继承自外层作用域。这使得箭头函数在处理回调和闭包时更加灵活方便。
|
7月前
|
JavaScript 前端开发 Java
v-if和v-show的区别?使用场景?v-if状态改变调用钩子函数的示例
这篇文章详细阐述了Vue中`v-if`和`v-show`指令的共同点、区别、使用场景以及它们在组件和普通元素上附属时的不同表现,并通过示例展示了状态改变时对钩子函数调用的影响。
v-if和v-show的区别?使用场景?v-if状态改变调用钩子函数的示例
|
JSON 小程序 JavaScript
小程序根据返回值的int类型渲染不同的状态
小程序根据返回值的int类型渲染不同的状态
149 0
|
10月前
|
JavaScript 前端开发
提交表单时执行func方法
在这个例子中,我们使用jQuery的 `.submit()`方法来处理表单提交事件。当用户点击提交按钮时,会执行一个函数,该函数阻止表单的默认提交行为(使用 `e.preventDefault()`),然后执行我们的代码。
45 0
|
前端开发
switch对按钮进行判断操作
switch对按钮进行判断操作
102 0
箭头函数与普通 function 的区别
箭头函数与普通 function 的区别
102 0
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
156 0
element close事件关闭表单,数据替换掉原始列表的数据bug解决
element close事件关闭表单,数据替换掉原始列表的数据bug解决
105 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等