c++primer说函数不能返回局部对象的指针或引用。
const string &manip()
{
string ret;
if(!ret.empty())
return ret; //错误返回局部对象的引用
else
return "empty"; //错误 “empty”是一个局部临时量
}
在essential c++看到了这样的代码,函数可以返回局部变量的char 指针 和const char *,这是为什么呢?
#include <iostream>
#include <string>
using namespace std;
class num_sequence{
public:
virtual const char *what_am_i( ) const// 返回值char * 和const char*可以编译通过
{
return "num_sequence";
}
};
int main()
{
num_sequence p;
std::cout<<p.what_am_i();
}
把函数返回值有const char改为char 也可以编译通过,但不能通过char指针修改字符串的内容。
virtual char *what_am_i( ) const//把函数返回值有const char*改为char *也可以编译通过
{
return "num_sequence";
}
问题2我好像了解了,类似于char* p= “safdsaf”;也是不能通过指针修改rodata里的内容的。
const string &manip()
{
string ret;
if(!ret.empty())
return ret; //错误返回局部对象的引用
else
return "empty"; //错误 “empty”是一个局部临时量
}
上面两个都是返回的临时变量(return "empty
"先构建一个临时的string
,再返回),在函数调用结束的时候就**析构了。所以是不安全的。编译是可以通过的,但是对于返回的结果,因为已经析构,所以是不应该使用的。
virtual const char *what_am_i( ) const// 返回值char * 和const char*可以编译通过
{
return "num_sequence";
}
上面返回的是一个指针,指向字符串"num_sequence",这个字符串是在全局静态区,是一直存在的,不是临时的,所以没有问题
实际上是不论返回的是char*
还是const char*
你都是不能修改的,因为其指向的是一个常量字符串。强行修改会在运行时报错。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。