c++临时对象大剖析?
关键字:l-value、 r-value、 const value、temporary and it's
scope
前几天有人发现这样一段代码在g++和vc6下编译结果不同
http://topic.csdn.net/u/20091113/19/ec6af899-cb1a-4a81-92b7-0ab2bc8c2f24.html
其中一个重要问题就是临时对象的问题。
之后自己对临时对象这个以前很少注意到的东西越想越投入,而且发现这个
东东似乎比构造、析构、拷贝构造、赋值等c++的一些自动化特性更多地被应
用在代码中且各大编译器对此的支持程度不一。
目前有几个问题到现在还不是很清楚,特列出来请大家指点:
1:临时对象在什么情况下产生?标准有没有规定?
2:临时对象的作用域或者生命周期是怎么样的?
3:临时对象到底是不是右值?
4:如果临时对象作为一个右值,可不可以修改?或者说右值是不是const或
者常量?
5:右值是否不可以被关联到非常量(const)引用?为什么?
请大神小虾们各抒己见。先写个类以供大家讨论使用:
scope
前几天有人发现这样一段代码在g++和vc6下编译结果不同
http://topic.csdn.net/u/20091113/19/ec6af899-cb1a-4a81-92b7-0ab2bc8c2f24.html
其中一个重要问题就是临时对象的问题。
之后自己对临时对象这个以前很少注意到的东西越想越投入,而且发现这个
东东似乎比构造、析构、拷贝构造、赋值等c++的一些自动化特性更多地被应
用在代码中且各大编译器对此的支持程度不一。
目前有几个问题到现在还不是很清楚,特列出来请大家指点:
1:临时对象在什么情况下产生?标准有没有规定?
2:临时对象的作用域或者生命周期是怎么样的?
3:临时对象到底是不是右值?
4:如果临时对象作为一个右值,可不可以修改?或者说右值是不是const或
者常量?
5:右值是否不可以被关联到非常量(const)引用?为什么?
请大神小虾们各抒己见。先写个类以供大家讨论使用:
#include <iostream>
using std::cout;
using std::endl;
class A
{
public:
A(int i)
: m_i(i)
{
cout << "A(" << m_i << ")" << endl;
}
~A()
{
cout << "~A(" << m_i << ")" << endl;
m_i = 0;
}
A(const A& a)
: m_i(a.m_i)
{
cout << "A(A(" << m_i << "))" << endl;
}
A& operator=(const A& rhs)
{
cout << "A(" << m_i << ")" << "=A(" << rhs.m_i << ")" << endl;
m_i = rhs.m_i;
return *this;
}
A& operator--()
{
cout << "--(" << m_i << ")" << endl;
--m_i;
return *this;
}
private:
int m_i;
};
A GetA(int i)
{
A a(i);
return a;
}
int main()
{
A la1(1);
A ra2 = --GetA(2);
--ra2;
A ra3 = GetA(3);
A ra4 = GetA(4);
A* pa = &GetA(5);
return 0;
}
...全文
相关推荐
详解C++ 中的临时对象
然而,由于编译器优化,实际可能只会调用一次拷贝构造函数,避免了额外的临时对象复制。临时对象的管理和优化是C++性能调优的重要方面,理解其工作原理可以帮助编写更高效、更符合C++标准的代码。
小问题大思考之C++ 临时对象
在C++编程中,临时对象(Temporary Object)是一种在代码中并不直接声明,但由编译器自动创建的对象。它们通常出现在类型转换、按值传递、按值返回和对象定义等场景,对程序性能有着重要影响。理
C++l临时对象
### C++中的临时对象#### 一、引言在C++编程中,临时对象是一个非常重要但又常常被忽视的概念。这些对象虽然不直接出现在源代码中,但在编译器生成的目标代码中却扮演着至关重要的角色。
深入c++中临时对象的析构时机的详解
深入理解C++中临时对象和具名对象的析构时机在C++中,对象的生命周期和析构函数的调用是程序设计中的关键概念。当我们创建对象时,会涉及到构造函数的执行,而在不再需要对象时,析构函数则负责释放其占用
详解C++ 临时量与临时对象及程序的相关优化
总之,理解和掌握C++中的临时量与临时对象及其生命周期是编写高效代码的关键。通过优化临时对象的使用,可以显著提高程序性能,减少内存开销。


