C++ string的构造函数

Posted on 2019-08-12 18:38  asiarabbit  阅读(8152)  评论(0编辑  收藏  举报

C++ string类有多种构造函数,今天刚好看书碰到了,所以记录总结以下。

很多东西之所以用不到,是因为不知道。合适的地方使用合适的工具能大大提高效率。这是学习的一个意义。

string的一般构造方法包括字符串构造string("abc")和拷贝构造string(str). 除此之外还有一些不常见但是可能会很有用的版本。

  1. 将构造的对象初始化为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" 
  2. 将构造的对象初始化为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."
  3. 创建一个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对象。