我只是好奇相同的型別轉換格式適用于 char、int 和許多其他格式,但為什么它不適用于字串,即(string) 'c'螢屏后面有什么問題?
#include <iostream>
using namespace std;
int main(){
char a = 'a';
cout << (char) 99 <<endl;
cout << (int) 'c'<<endl;
cout<< (string) 'c' " " <<endl; // why this does not work???
cout<< string (1, 'c') " " <<endl;
return 0;
}
uj5u.com熱心網友回復:
問題是沒有從 type 的物件到 typechar的物件的隱式轉換std::string。
你可以寫例如:
cout<< string( 1, 'c' ) " " <<endl;
要么
cout<< string( "c" ) " " <<endl;
或(使用 C 鑄造)
cout<< ( string )"c" " " <<endl;
要么
using namespace std::literals;
cout << "c"s " " << endl;
從這條線可以看出
cout<< string( 1, 'c' ) " " <<endl;
使用了建構式
basic_string(size_type n, charT c, const Allocator& a = Allocator());
uj5u.com熱心網友回復:
char, int, double, float,short等都是整數型別。它們是語言中的“已知”型別,具有固定的大小、固定的表示形式,并且不需要編譯器即可理解。編譯器可以毫無問題地將一個轉換為另一個(除了可能丟失資料的潛在縮小轉換 - 例如從 16 位整數轉換為 8 位 int)。
std::string,另一方面,是型別別。它不能被編譯器直接理解——需要對包含類的頭檔案進行編譯和理解。這引入了幾個要求,其中之一是需要一個函式來將型別轉換為您的類。如果你不寫一個函式來做這個轉換,編譯器會假設一個函式不存在,如果你嘗試使用它,編譯器會拋出一個錯誤。
您在這里的第三次列印是要求編譯器通過呼叫強制轉換函式將char型別轉換為 a 。std::string這個函式不存在,因此編譯器會拋出一個 fit 作為結果。
請注意,您的第四次列印確實有效,因為它呼叫了一個建構式,std::string該建構式需要一個長度和一個確實存在的字符。
uj5u.com熱心網友回復:
這不起作用,因為 std::string 沒有接受單個 char 作為引數的建構式。例如,此代碼在 g 9.3.0 上編譯:
#include <iostream>
using namespace std;
class mystring : public string {
public:
mystring(char c) :string({c}) {}
};
int main() {
char a = 'a';
cout << (char)99 << endl;
cout << (int)'c' << endl;
cout << (mystring)'c' " " << endl;
cout << string(1, 'c') " " << endl;
return 0;
}
輸出:
c
99
c
c
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448808.html
