[英]C++, strings, and pointers
我知道這很簡陋但我對C ++一無所知。 有必要這樣做:
string *str = getNextRequest();
而不是
string str = getNextRequest();
為了在稍后的同一代碼塊中引用str? 如果是這樣,后者會產生什么類型的錯誤?
這完全取決於getNextRequest
的返回類型。
字符串可以在它們聲明的范圍內使用和重用。它們基本上包含一個可變的C字符串和一些處理信息,輔助方法等。
您可以非常安全地從函數返回一個字符串,編譯器將根據需要復制或移動它。 然后可以正常使用該字符串(此處為str
),而無需擔心使用范圍外的本地等。
有時候需要一個指向字符串的指針,但除非你將它用作out參數,否則這些指針很少見並且表明某些設計有些奇怪。
您使用哪個取決於getNextRequest()返回的內容。 如果它返回一個string *
,那么使用第一行,如果它返回string
則使用第二行。
所以如果getNextRequest的聲明是這樣的:
string getNextRequest();
然后
string str = getNextRequest();
是正確的。 如果聲明是這樣的:
string *getNextRequest();
然后你可以去
string *str = getNextRequest();
要么
string str = *getNextRequest();
string str = getNextRequest();
將創建getNextRequest
返回的string
的getNextRequest
。 如果要更改str
的內容並希望這些更改也在getNextRequest
返回的字符串中, getNextRequest
必須返回指針或引用。
如果這是你想要的,那么你應該將getNextRequest
定義為:
string& getNextRequest()
並使用它像:
string& str = getNextRequest();
string str * = getNextRequest();
正如@dasblinkenlight所指出的那樣,這將是一個語法錯誤
但要回答你原來的問題,是否有必要? 不可以。一般情況下,除非必須,否則不應使用指針。
特別是STL。 STL不是設計用於指針 - 它為您進行動態內存管理。 除非你有充分的理由,否則你應該總是使用vector<int> v
和string s
而不是vector<int>*
或string*
。
您可能需要提供有關此函數getNextRequest()的更多信息。 這個從哪里來? 圖書館? API? 目的?
如果函數的返回類型是字符串*(指向str的指針),則該字符串已分配給“堆”。 這意味着,從哪個代碼塊引用字符串並不重要。 只要你保持指針,你就可以訪問它。
如果函數的返回類型只是一個字符串(意思不是指針),它將返回值,而不是str的地址。 實質上,您將字符串“復制”到新變量中。 在這種情況下,變量將在堆棧上分配,並且只能在代碼塊的范圍內引用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.