C++ string類有多種構造函數,今天剛好看書碰到了,所以記錄總結以下。
很多東西之所以用不到,是因為不知道。合適的地方使用合適的工具能大大提高效率。這是學習的一個意義。
string的一般構造方法包括字符串構造string("abc")和拷貝構造string(str). 除此之外還有一些不常見但是可能會很有用的版本。
- 將構造的對象初始化為s的前n個字符,s不夠n個時將相鄰的內存單元的內容當作s的一部分繼續復制:
string(const char *s, size_type n, const Allocator &a = Allocator()); root [17] string ett("Telephone home.", 4) (std::string &) "Tele"
- 將構造的對象初始化為s的后n個字符,也就是從s指向的內存的第n個字節開始復制:
string(const string &str, size_type pos,size_type n = npos, const Allocator &a = Allocator()); root [15] string att("Telephone home.") (std::string &) "Telephone home." root [16] string et(att, 4) (std::string &) "phone home."
- 創建一個n個字符的string對象:
string(size_type n, char c, const Allocator &a = Allocator()) root [6] string(10, 'a') (std::string) "aaaaaaaaaa"
可以看出1和2構造函數的主要區別在於是用字符串常量還是string對象做第一個參數。
另一個區別是,2中的第三個參數是要復制的字符個數,和1的第二個從參數不同的是,如果npos過大的話,它會在復制完str后停止:
root [0] string att("Telephone home.") (std::string &) "Telephone home." root [4] string (att, 4, 100) (std::string) "phone home." root [5] string ("Telephone home.", 4, 5) (std::string) "phone" root [1] string ("Telephone home.", 4, 100) (std::string) "phone home."
上述代碼中因為第三個參數是int,所以所有的構造函數都自動和2匹配,並且將字符串常量初始化為臨時string對象。