以下是内联(定义的内部头文件)静态成员函数。文字字符串“MyClass”是否始终保证在静态内存中?如果没有,这不会在堆栈中返回指针吗?
const char * className()
{
return "MyClass";
}
编辑:
这个怎么样?
const RWCString& className()
{
return "MyClass";
}
RWCString
是一个字符串类,它有一个带const char*
的隐式构造函数。
http://www.roguewave.com/portals/0/products/sourcepro/docs/11/html/toolsref/rwcstring.html
答案 0 :(得分:5)
不。这是完全定义的。字符串不在堆栈中。它在全球记忆中。所以它返回的指针是有效的。 (甚至更好:你宣布它为const
)
答案 1 :(得分:5)
第一个例子:
const char * className()
{
return "MyClass";
}
很好。 "MyClass"
是char const[8]
类型的文字,其生命周期在您的代码被调用之前开始,在代码完成后结束,因此没有问题。
然而,第二个例子不起作用。
const RWCString& className()
{
return "MyClass";
}
它要求在函数内构造类型RWCString
的对象,以便能够返回对它的引用。但是,无法通过引用返回在函数中构建为局部变量或临时变量的内容,因此您将获得未定义的行为(如果它编译)。
你可以非常简单地把它变成一个“好”的功能:
const RWCString& className()
{
static RWCString const N = "MyClass";
return N;
}
这里我创建了一个本地静态对象N
,它将在第一次调用函数时构造。因为static
它的生命周期延伸到调用之后所以可以返回对它的引用。
编辑:正如史蒂夫指出的那样,临时更适合这里的局部变量。