- 主题:这种直接在构造函数里边执行操作的会产生什么行为?
比如下面的代码
struct FO
{
FO() { a = 5; printf("a = %d\n", a);
int a;
operator int() { return a;}
};
int main()
{
int retv = FO();
return retv;
}
到底会不会为FO对象分配栈上的内存? 是不是获取完毕retv之后, FO临时对象就销毁了?
--
修改:hyperLee FROM 120.244.224.*
FROM 120.244.224.*
写了个小代码测试一下, g++的, 确实是即时创建和销毁的.
#include <iostream>
using namespace std;
bool myfunction (int i,int j) { return (i<j); }
struct myclass
{
myclass()
{
printf("myclass::myclass()\n");
}
~myclass()
{
printf("myclass::~myclass()\n");
}
operator int() { return a;}
int a = 5;
} ;
int main ()
{
cout << "myvector contains:"<<endl;
int retv = myclass();
cout << "mark2"<< " retv = " << retv <<endl;
return 0;
}
---------------------------------------
$ ./a
myvector contains:
myclass::myclass()
myclass::~myclass()
mark2 retv = 5
【 在 hyperLee (老李) 的大作中提到: 】
: 比如下面的代码
: struct FO
: {
: ...................
--
FROM 120.244.224.*
继续测了一下, 发现如果明确写出 myclass cls; 那么这个cls会在函数返回时候才销毁.
但是主帖里边的做法, 好像在c++中还真找不出规则来. 未定义行为?
【 在 hyperLee (老李) 的大作中提到: 】
: 写了个小代码测试一下, g++的, 确实是即时创建和销毁的.
: #include <iostream>
: using namespace std;
: ...................
--
FROM 120.244.224.*
int retv = myclass();
here myclass() is rvalue
it doesn't exist after use
cls is lvalue
it will exist until the the scope ends
【 在 hyperLee 的大作中提到: 】
: 继续测了一下, 发现如果明确写出 myclass cls; 那么这个cls会在函数返回时候才销毁.
: 但是主帖里边的做法, 好像在c++中还真找不出规则来. 未定义行为?
:
--
修改:mvtec FROM 67.163.48.*
FROM 67.163.48.*
这个叫临时对象。
临时对象一般是没有其它栈上变量那样的地址的。即产即销。
【 在 hyperLee (老李) 的大作中提到: 】
: 比如下面的代码
: struct FO
: {
: ...................
--
FROM 76.126.252.*
临时对象还包括lvalue
所以并不确切
【 在 here080 的大作中提到: 】
: 这个叫临时对象。
: 临时对象一般是没有其它栈上变量那样的地址的。即产即销。
--
FROM 67.163.48.*
【 在 mvtec (mvtec) 的大作中提到: 】
: 标 题: Re: 这种直接在构造函数里边执行操作的会产生什么行为?
: 发信站: 水木社区 (Sat May 9 06:31:10 2020), 站内
:
: 临时对象还包括lvalue
你这才叫不确切。
: 所以并不确切
: 【 在 here080 的大作中提到: 】
: : 这个叫临时对象。
: : 临时对象一般是没有其它栈上变量那样的地址的。即产即销。
: --
:
: ※ 来源:·水木社区
http://m.newsmth.net·[FROM: 67.163.48.*]
--
FROM 76.126.252.*
万事不决看汇编!debug模式下编译一下看看汇编就知道了。汇编面前,源代码无秘密(当然,汇编是特定于编译器的,各编译器的实现可能有差异)
另外一招就是在debugger中step into。当然,你搞的printf也可以。
肯定是先在栈上构造对象,然后调用operator int()成员函数。
可以看看这个的Q1、Q2:
https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
普通情况:临时对象超出其所在的表达式范围就无效了(被析构了)
例外情况:临时对象被绑定到一个const &,此时临时对象的生命周期和const &绑定的一样长。
【 在 hyperLee 的大作中提到: 】
: 比如下面的代码
: struct FO
: {
: ...................
--
修改:z16166 FROM 125.33.227.*
FROM 125.33.227.*
看来是个高手
【 在 z16166 的大作中提到: 】
: 万事不决看汇编!debug模式下编译一下看看汇编就知道了。汇编面前,源代码无秘密(当然,汇编是特定于编译器的,各编译器的实现可能有差异)
: 另外一招就是在debugger中step into。当然,你搞的printf也可以。
: 肯定是先在栈上构造对象,然后调用operator int()成员函数。
: ...................
--
FROM 183.39.56.*