![](/img/trans.png)
[英]Why Instantiating a object and a pointer of object behaves differently when I create a thread in constructor?
[英]Why std::string object when constructed with default constructor behaves differently?
我嘗試了以下程序:
#include <iostream>
#include <string>
int main ()
{
std::string str;
str[0] = 'o';
str[1] = 'k';
std::cout << str.length();
std::cout << "as a whole :";
std::cout << str << std::endl;
std::cout << "character by character :";
std::cout << str[0] << str[1] << std::endl;
return 0;
}
我不明白為什么我不能使用 object 變量作為一個整體打印字符串,以及為什么長度返回為0
,因為很明顯我已經使用下標運算符添加了字符,因為這將返回 char 引用,所以我知道這是合法的。
此外,我沒有得到任何異常。 所以就是這樣。 顯然, std::string
class 的幕后發生了很多事情,我知道我遺漏了一些東西。 有人可以幫我解決這個問題嗎?
我不明白為什么我不能將整個字符串打印出來 [...] ...
因為您正在經歷未定義的行為。
這個
std::string str;
構造一個帶有0
個 memory 分配的默認字符串。 意思是通過std::string::operator[]
進行修改將導致asses out of bounds undefined behavior 。 因此,任何事情都可能發生。 在您的情況下,長度返回0
。
[...] 顯然我已經使用下標運算符添加了字符,因為這將返回 char 引用,所以我知道這是合法的。
不,由於上述原因,您沒有。 作為參考, std::string::operator[]
返回對指定位置 pos 的字符的引用。 不執行邊界檢查。 如果 pos > size(),則行為未定義。
作為可能的修復,您可能希望在訪問元素之前std::string::resize
。
#include <string>
std::string str;
str.resize(2);
str[0] = 'o';
str[1] = 'k';
// ... now it has defined behaviour
或std::string::push_back
每個字符到字符串中。
#include <string>
std::string str;
str.push_back('o');
str.push_back('k');
// ... now it has defined behaviour
您有一個長度為0
的字符串,然后您嘗試使用下標運算符修改其內容。 這是未定義的行為,因此在這一點上,不能保證特定的結果。 如果您使用at()
代替,它會暴露錯誤並引發異常。
為什么長度返回為 0
它從0
開始,你沒有做任何事情來添加它(例如push_back
或+=
)。 但是話又說回來,由於您之前所做的是未定義的行為,因此這里可能發生任何事情。
此外,我沒有得到任何異常。
您可以嘗試使用std::string::at
,當您嘗試時會拋出std::out_of_range
異常。
您沒有向空字符串str
添加任何內容。 相反,您正在嘗試編輯空字符串的不存在元素。 std::string
的下標運算符不會自動添加元素。 (與std::map
不同)此外,不能保證下標運算符會引發一些異常。 如果你想要安全下標操作,你可以使用std::string::at
function。
您可以使用+=
運算符將 append 用於您的字符串。
str += 'o';
str += 'k';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.