一个看似简单却很复杂的有关问题
一个看似简单却很复杂的问题!
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout < < "执行构造函数创建一个对象\n ";x=i;}
A(A&){cout < < "执行复制构造函数创建一个对象\n ";}
~A(){cout < < "执行析构函数!\n ";}
int get() {return x;}
void set(int i){x=i;}
private:
int x;
};
A func( );
int main()
{
A* r = &func();
cout < < "调用完毕,main函数中\n ";
cout < <r-> get() < <endl;
r-> set(88);
cout < <r-> get() < <endl;
return 0;
}
A func( )
{
cout < < "跳转到func函数中!\n ";
A a(23);
return a;
}
输出:
跳转到func函数中!
执行构造函数创建一个对象
执行复制构造函数创建一个对象
执行析构函数!
执行析构函数!
调用完毕,main函数中
-858993460
这是使用指针来接收函数返回的对象。接下来是引用。
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout < < "执行构造函数创建一个对象\n ";x=i;}
A(A&){cout < < "执行复制构造函数创建一个对象\n ";}
~A(){cout < < "执行析构函数!\n ";}
int get() {return x;}
void set(int i){x=i;}
private:
int x;
};
A func( );
int main()
{
cout < < "main函数中\n ";
A &r=func();
cout < < "调用完毕,main函数中\n ";
cout < <r.get() < <endl;
r.set(88);
cout < <r.get() < <endl;
return 0;
}
A func( )
{
cout < < "跳转到func函数中!\n ";
A a(23);
return a;
}
输出:
main函数中
跳转到func函数中!
执行构造函数创建一个对象
执行复制构造函数创建一个对象
执行析构函数!
调用完毕,main函数中
-85899360
88
执行析构函数!
我们看到用引用的方式结果第二个析构函数最后才执行,而指针的话则在func函数中就都已经执行完毕了,为什么会有这个区别,引用或者指针都各自接收的是复制构造函数复制出的对象还是原始对象??请高手指教,谢谢。
------解决方案--------------------
呵呵,昨天也遇到一个类似的问题。现在已经清楚了。
对于引用而言,如果引用的是一个临时变量,那么这个临时变量的生存期会不少于这个引用的生存期。(可参见C++标准[class.temporary]) 也就是说,直到main函数结束时,引用r的生存期结束,r所引用的临时变量的生存期才结束,此时需要调用它的析构函数。
而指针没有这个特例,因此在函数调用所在的语句结束时,就可以析构临时变量。
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout < < "执行构造函数创建一个对象\n ";x=i;}
A(A&){cout < < "执行复制构造函数创建一个对象\n ";}
~A(){cout < < "执行析构函数!\n ";}
int get() {return x;}
void set(int i){x=i;}
private:
int x;
};
A func( );
int main()
{
A* r = &func();
cout < < "调用完毕,main函数中\n ";
cout < <r-> get() < <endl;
r-> set(88);
cout < <r-> get() < <endl;
return 0;
}
A func( )
{
cout < < "跳转到func函数中!\n ";
A a(23);
return a;
}
输出:
跳转到func函数中!
执行构造函数创建一个对象
执行复制构造函数创建一个对象
执行析构函数!
执行析构函数!
调用完毕,main函数中
-858993460
这是使用指针来接收函数返回的对象。接下来是引用。
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout < < "执行构造函数创建一个对象\n ";x=i;}
A(A&){cout < < "执行复制构造函数创建一个对象\n ";}
~A(){cout < < "执行析构函数!\n ";}
int get() {return x;}
void set(int i){x=i;}
private:
int x;
};
A func( );
int main()
{
cout < < "main函数中\n ";
A &r=func();
cout < < "调用完毕,main函数中\n ";
cout < <r.get() < <endl;
r.set(88);
cout < <r.get() < <endl;
return 0;
}
A func( )
{
cout < < "跳转到func函数中!\n ";
A a(23);
return a;
}
输出:
main函数中
跳转到func函数中!
执行构造函数创建一个对象
执行复制构造函数创建一个对象
执行析构函数!
调用完毕,main函数中
-85899360
88
执行析构函数!
我们看到用引用的方式结果第二个析构函数最后才执行,而指针的话则在func函数中就都已经执行完毕了,为什么会有这个区别,引用或者指针都各自接收的是复制构造函数复制出的对象还是原始对象??请高手指教,谢谢。
------解决方案--------------------
呵呵,昨天也遇到一个类似的问题。现在已经清楚了。
对于引用而言,如果引用的是一个临时变量,那么这个临时变量的生存期会不少于这个引用的生存期。(可参见C++标准[class.temporary]) 也就是说,直到main函数结束时,引用r的生存期结束,r所引用的临时变量的生存期才结束,此时需要调用它的析构函数。
而指针没有这个特例,因此在函数调用所在的语句结束时,就可以析构临时变量。