带你玩转std::string类(二)、成员函数

带你玩转std::string类(二)、成员函数,第1张

成员函数
成员类型描述
构造函数构造字符串对象
析构函数字符串析构函数
赋值构造函数字符串赋值
构造函数
std::string::string

c++98

//default (1)	
string();
//copy (2)	
string (const string& str);
//substring (3)	
string (const string& str, size_t pos, size_t len = npos);
//from c-string (4)	
string (const char* s);
//from sequence (5)	
string (const char* s, size_t n);
//fill (6)	
string (size_t n, char c);
//range (7)	
template <class InputIterator>
  string  (InputIterator first, InputIterator last);

c++11

//default (1)	
string();
//copy (2)	
string (const string& str);
//substring (3)	
string (const string& str, size_t pos, size_t len = npos);
//from c-string (4)	
string (const char* s);
//from buffer (5)	
string (const char* s, size_t n);
//fill (6)	
string (size_t n, char c);
//range (7)	
template <class InputIterator>
  string  (InputIterator first, InputIterator last);
//initializer list (8)	
string (initializer_list<char> il);
//move (9)	
string (string&& str) noexcept;

构造字符串对象
 构造一个字符串对象,根据使用的构造函数版本初始化它的值:
(1) empty string constructor (default constructor)
 构造一个长度为零字符的空字符串。
(2) copy constructor
 构造str的副本。
(3) substring constructor
 复制str的从字符位置pos开始并跨越len个字符的部分(或者直到 str 的结尾,如果str太短或len是string::npos)。
(4) from c-string
 复制s指向的以 null 结尾的字符序列(C 字符串)。
(5) from buffer
 从s指向的字符数组中复制前n 个字符。
(6) fill constructor
 用字符c的n个连续副本填充字符串。
(7) range constructor
 以相同的顺序复制[first,last)范围内的字符序列。
(8) initializer list
 以相同的顺序复制il中的每个字符。
(9) move constructor
 获取str的内容。
 str处于未指定但有效的状态。
 上面的所有构造函数都支持成员类型allocator_type的对象作为末尾的附加可选参数,这与字符串无关(上面未显示,请参阅basic_string 的构造函数以获取完整签名)。

参数

str
 另一个字符串对象,其值要么被复制,要么被获取。
pos
 str中作为子字符串复制到对象的第一个字符的位置。
 如果这大于str的长度,则抛出out_of_range。
 注意:str中的第一个字符由值0(不是1)表示。
len
 要复制的子字符串的长度(如果字符串较短,则复制尽可能多的字符)。string::npos的值表示直到str结束的所有字符。
s
 指向字符数组的指针(例如c-string)。
n
 要复制的字符数。
c
 用于填充字符串的字符。字符串中的n 个字符中的每一个都将被初始化为该值的副本
first, last
 输入迭代器到范围内的初始和最终位置。使用的范围是[first,last),其中包括first和last之间的所有字符,包括first指向的字符,但不包括 last 指向的字符。
 函数模板参数InputIterator应该是一个输入迭代器类型,它指向可转换为char类型的元素。
 如果InputIterator是整数类型,则将参数转换为正确的类型,以便使用签名 (5) 代替。
il
 一个initializer_list对象。
 这些对象是从初始化列表声明器自动构造的。
size_t是无符号整数类型。

例子
// string constructor
#include 
#include 

int main()
{
	std::string s0("Initial string");

	// constructors used in the same order as described above:
	std::string s1;
	std::string s2(s0);
	std::string s3(s0, 8, 3);
	std::string s4("A character sequence");
	std::string s5("Another character sequence", 12);
	std::string s6a(10, 'x');
	std::string s6b(10, 42);      // 42 is the ASCII code for '*'
	std::string s7(s0.begin(), s0.begin() + 7);

	std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
	std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
	std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
	return 0;
}

输出:

s1: 
s2: Initial string
s3: str
s4: A character sequence
s5: Another char
s6a: xxxxxxxxxx
s6b: **********
s7: Initial
迭代器有效性

移动构造函数 (9)可能会使与str相关 的迭代器、指针和引用无效。

数据竞争

移动构造函数 (9)修改str。

异常安全

没有分配器参数 (9, first) 的移动构造函数从不抛出异常(不抛出保证)。
在所有其他情况下,如果抛出异常,则不会产生任何影响(强烈保证)。
如果 s 是空指针,如果 n == npos,或者 [first,last) 指定的范围无效,则会导致未定义的行为。
如果 pos 大于 str 的长度,则抛出 out_of_range 异常。
如果 n 大于 s 指向的数组,则会导致未定义的行为。
如果生成的字符串长度超过 max_size,则会引发 length_error 异常。
如果函数在尝试分配存储时失败,则会引发 bad_alloc 异常。

析构函数
std::string::~string
~string();

字符串析构函数
销毁字符串对象。这将使用其分配器释放字符串分配的所有存储容量。

迭代器有效性

所有迭代器、指针和引用都无效。

数据竞争

所有迭代器、指针和引用都无效。

异常安全

不抛出保证:从不抛出异常。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/676201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存