64,646
社区成员
发帖
与我相关
我的任务
分享
CString f1();
void f2(const cahr* p);
f2(f1());
#include <iostream>
#include <conio.h>
class A1
{
public:
A1(int) { std::cout << "construct A1" << std::endl; };
~A1() { std::cout << "destruct A1" << std::endl; };
};
class A2
{
public:
A2(int) { std::cout << "construct A2" << std::endl; };
~A2() { std::cout << "destruct A2" << std::endl; };
};
class A3
{
public:
A3(int) { std::cout << "construct A3" << std::endl; };
~A3() { std::cout << "destruct A3" << std::endl; };
};
class A4
{
public:
A4(int) { std::cout << "construct A4" << std::endl; };
~A4() { std::cout << "destruct A4" << std::endl; };
};
A1 func1(void)
{
std::cout << "func1() called." << std::endl;
return(0);
};
A2 func2(const A1 &)
{
std::cout << "func2() called." << std::endl;
return(0);
};
A3 func3(const A2 &)
{
std::cout << "func3() called." << std::endl;
return(0);
};
A4 func4(const A3 &)
{
std::cout << "func4() called." << std::endl;
return(0);
};
int main(void)
{
{
std::cout << "-----------------start calls *1." << std::endl;
func4(func3(func2(func1())));
std::cout << "-----------------end calls *1." << std::endl;
}
{
std::cout << "-----------------start calls *2." << std::endl;
auto const & q = func4(func3(func2(func1())));
std::cout << "-----------------end calls *2." << std::endl;
}
_getch();
return 0;
}
执行结果:
-----------------start calls *1.
func1() called.
construct A1
func2() called.
construct A2
func3() called.
construct A3
func4() called.
construct A4
destruct A4
destruct A3
destruct A2
destruct A1
-----------------end calls *1.
-----------------start calls *2.
func1() called.
construct A1
func2() called.
construct A2
func3() called.
construct A3
func4() called.
construct A4
destruct A3
destruct A2
destruct A1
-----------------end calls *2.
destruct A4
const char* psz = f();
这个错误,进而怀疑以前习以为常的CString返回值是否存在隐患,那么现在清楚了,有问题的只是上面那种用法,习以为常的返回CString是没问题的。同时也体会到MFC CString到const char*的隐式类型转换是有误导嫌疑的,还是stl::string必须用c_str()比较恰当。
我明白了。我有这个疑问是因为首先在自己的代码里发现了
const char* psz = f();
这个错误,进而怀疑以前习以为常的CString返回值是否存在隐患,那么现在清楚了,有问题的只是上面那种用法,习以为常的返回CString是没问题的。同时也体会到MFC CString到const char*的隐式类型转换是有误导嫌疑的,还是stl::string必须用c_str()比较恰当。谢谢了const char* psz = f();
执行完成后就释放掉了,所以你后面再想用f()的返回值就可能会出错了。CString f();
使用:
const char* psz = f();