首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ c_str() 回傳 const char* 卻能直接輸出字串:operator<< 多載機制揭秘

     編輯:程式設計疑難解答

現象

std::string a = "hello";
std::cout << a.c_str(); // 輸出 "hello" 而非位址

明明 `c_str()` 回傳 `const char*`,為何不印位址?

原因:std::ostream 對指標的特化多載

  • `std::basic_ostream` 針對 `const char*`、`const signed char*`、`const unsigned char*` 提供了非成員函式模板特化(或重載),行為定義為:將指標視為 C 風格字串,輸出直到遇到 `\0`。
  • 若要輸出位址,需轉型為 `const void*`:std::cout << static_cast<const void*>(a.c_str())。

標準草案相關簽名

template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const char* s);

延伸:其他指標型別

  • `int*`、`MyClass*` 等無特化多載,會走向通用 `operator<<(const void*)`,輸出位址。
  • 若想自訂類別支援 `<<` 輸出,應實作 `friend std::ostream& operator<<(std::ostream&, const MyClass&)`,而非指標版本。

總結

`c_str()` 確實回傳指標,但 `std::cout` 針對 `const char*` 有特殊多載,將其視為 C 字串處理。這是 C++ 標準庫為了相容 C 風格字串輸出而刻意設計的便利性特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved