我知道这很简陋但我对C ++一无所知。是否有必要这样做:
string *str = getNextRequest();
而不是
string str = getNextRequest();
为了稍后在同一代码块中引用str?如果是这样,后者会产生什么类型的错误?
答案 0 :(得分:10)
这完全取决于getNextRequest
的返回类型。
字符串可以在它们声明的范围内使用和重用。它们基本上包含一个可变的C字符串和一些处理信息,辅助方法等。
您可以非常安全地从函数返回一个字符串,编译器将根据需要复制或移动它。然后可以正常使用该字符串(此处为str
),无需担心使用范围外的本地人等。
有时需要指向字符串的指针,但除非你将它用作out参数,否则这些指针往往很少见,并指出一些设计奇怪。
答案 1 :(得分:0)
您使用的内容取决于getNextRequest()返回的内容。如果它返回string *
,则使用第一行,如果它返回string
,则使用第二行。
因此,如果getNextRequest的声明是这样的:
string getNextRequest();
然后
string str = getNextRequest();
是对的。如果声明是这样的:
string *getNextRequest();
然后你可以选择
string *str = getNextRequest();
或
string str = *getNextRequest();
答案 2 :(得分:0)
string str = getNextRequest();
将创建string
返回的getNextRequest
的副本。如果要更改str
的内容并希望这些更改也在getNextRequest
返回的字符串中,则必须返回指针或引用。
如果这是您想要的,那么您应该将getNextRequest
定义为:
string& getNextRequest()
并使用它:
string& str = getNextRequest();
答案 3 :(得分:0)
string str * = getNextRequest();
如@dasblinkenlight所述,这将是语法错误
但要回答你原来的问题,是否有必要?不可以。一般情况下,除非必须,否则不应使用指针。
特别是STL。 STL不是设计用于指针 - 它为您进行动态内存管理。除非您有充分的理由,否则应始终使用vector<int> v
和string s
而不是vector<int>*
或string*
。
答案 4 :(得分:0)
您可能需要提供有关此函数getNextRequest()的更多信息。这个从哪里来?图书馆? API?目的
如果函数的返回类型是字符串*(指向str的指针),则该字符串已分配给“堆”。这意味着,从哪个代码块引用字符串并不重要。只要你保持指针,你就可以访问它。
如果函数的返回类型只是一个字符串(意思不是指针),它将返回值,而不是str的地址。实质上,您将字符串“复制”到新变量中。在这种情况下,变量将在堆栈上分配,并且只能在代码块的范围内引用它。