关于C++临时对象的一道题目

下面的代码输出什么?为什么?
class Test
{
    int m_i;
    int m_j;
public:
Test(int v)
{
cout<<"Test(int v)"<<endl;
}
~Test()
{
cout<<"~Test()"<<endl;
}
};
Test Play(Test t)
{
return t;
}
int main()
{
Test t = Play(5);
}

用编译器检测   最后输出调用了两次析构函数?

我觉得是3次:

第一次  Play(5) 5隐式转化为一个Test 对象;调用一次构造函数

然后再return t;这个语句中  t采用默认的拷贝构造函数赋值给一个 临时对象比如temp;调用一次构造函数;

然后 Test  t = Play(5);也就是 Test t = temp;这里也调用一次构造函数;

既然是三次构造函数,为什么不是三次析构函数,

看别人的博客说 Test t = temp;这里不会调用构造函数?不理解?

高手们谁可以解释一下?

时间: 2024-08-25 03:32:42

关于C++临时对象的一道题目的相关文章

由一道题目引出的java多态

某次逛论坛时发现一个非常有意思的题目,如下: class A<B> { public String show(A obj) { return ("A and A"); } public String show(B obj) { return ("A and B"); } } class B extends A { public String show(B obj) { return ("B and B"); } public Stri

C++标准的规定:非常量的引用不能指向临时对象(转载)

C++标准的规定:非常量的引用不能指向临时对象: 为了防止给常量或临时变量(只有瞬间的生命周期)赋值(易产生bug),只许使用const引用之. 下面的内容转自: http://blog.csdn.net/liuxialong/article/details/6539717 概括一下: 不能把临时对象作为实参传给非const引用. 例如: void conv(string &str) { } int main() { conv("dasd"); // 这里错了,编译器自动生成一

一个函数返回临时对象引起的编译器优化问题

我们都知道,如果在一个函数调用另一个函数,假设是 main 函数调用 fun 函数,这个 fun 函数返回一个临时类类型变量,那么这个时候编译器就会在 main 函数申请一个空间并生成一个临时对象,通过拷贝构造函数将 fun 返回的临时变量的值拷贝到这个临时对象.我们看如下的代码: #include <iostream> #include <cstring> using namespace std; class Matrix { public: explicit Matrix(do

C++临时对象减少的方法

C++临时对象产生的场景: 1. 值传递   2. 函数返回   3. 后置++ 等 减少临时对象产生的方法: 1. 使用引用或指针传递 2. 避免隐式类型转换 3. 使用 += 代替 + string x = a + b; // 这里会产生保存a+b值的临时对象 string x(a); x += b; // 这样就不会产生临时对象 4. 使用前置++代替后置++ 前置++的定义: type operator++(); 后置++的定义: const type operator++(int);

对象追踪、临时对象追踪、绝对坐标与相对坐标

1.对象追踪 快捷键SE 若所画的图形不是在水平或垂直方向上的则按极坐标的方法输入 如下图 临时对象追踪 快捷键  键盘上的ctrl+鼠标右键 与对象追踪差不多只是使用时需要点击起点接下来的步骤与使用对象追踪时的一样 2.绝对坐标 就是以坐标系为原点建立的直角坐标系 输入时按直角坐标系的方法输入(x,y) 如下图 这样输入得到的是一条线段的长度 如果不输入0,0,只输入5,10则就是如下图 相对坐标就是以上一个点为原点建立直角坐标系 输入时在输入的坐标前面加上@然后在输入坐标 当在输入时软件发现

C++临时对象销毁时间

下面这段代码会输出什么? [cpp] view plaincopy const char* p = string("hello temprary string").c_str(); cout << p; 下面这段代码运行之后会怎样? [cpp] view plaincopy #include <vector> class Foo { public: Foo() { _p = new char[32]; } ~Foo() { delete _p; } privat

转:C++中临时对象及返回值优化

http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行时确实生成了这样的对象. 通常出现在以下两种情况: (1)为了使函数调用成功而进行隐式类型转换的时候. 传递某对象给一个函数,而其类型与函数的形参类型不同时,如果可以通过隐式转化的话可以使函数调用成功,那么此时会通过构造函数生成一个临时对象,当函数返回时临时对象即自动销毁.如下例: //计算字符ch

STL——临时对象的产生与运用

所谓临时对象,就是一种无名对象.它的出现如果不在程序员的预期之下(例如任何pass by value操作都会引发copy操作,于是形成一个临时对象),往往造成效率上的负担.但有时候刻意制造一些临时对象,却又是使程序干净清爽的技巧.刻意制造临时对象的方法是,在型别名称之后直接加一对小括号,并可指定初值,例如Shape(3,5)或int(8),其意义相当于调用相应的constructor且不指定对象名称.STL最常将此技巧应用于仿函数(functor)与算法的搭配上,例如: #include<ios

C++11系列之——临时对象分析

/*C++中返回一个对象时的实现及传说中的右值——临时对象*/ 如下代码: 1 /**********************************************/ 2 class CStudent; 3 CStudent GetStudent() 4 { 5 CStudent loc_stu; 6 return loc_stu; 7 } 8 9 int main() 10 { 11 CStudent stu = GetStudent(); 12 } 13 /************