《C++Primer》第 5 版第 3 章笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CV2017/article/details/82723323

1. string 和 vector 是两种最重要的标准库类型,前者支持可变长字符串,后者则表示可变长的集合,还有一种标准库类型是迭代器,它是 string 和 vector 的配套类型,常被用于访问 string 中的字符或 vector 中的元素

2. std::cin 的意思是要使用命名空间 std 中的名字 cin,用到的每个名字都必须有自己的声明语句,而且每句话都得以分号结束

3. 头文件不应该包含 using 声明

4. cin、cout、end、istream、ostream、string 都是 std 命名空间里的7

5. 使用 string 类型必须首先包含 string 头文件,string 定义在命名空间 std 中

6. 如何初始化类的对象是由类本身决定的,多种初始化方式之间应该有所不同

7. 初始化 string 对象常用的一些方式

string s1; //默认初始化,s1 是一个空字符串,该 string 对象中没有任何字符
string s2(s1); s2 是 s1 的副本
string s2 = s1; //s2 是 s1 的副本,等价于 s2(s1)
string s3("value"); //s3 是字面值 value 的副本,除了字面值最后的那个空字符外
string s3 = "value"; //等价于s3("value"),s3 是该字符串字面值的副本,没有最后那个空字符,其他字符都被拷贝到新创建的 string 对象中
string s4(n,'c'); //把 s4 初始化为由连续 n 个字符 c 组成的串
string s4(10,'c');//s4 的内容是 cccccccccc

 8. = 等号拷贝初始化,反之则直接初始化int

 9, 初始化的值有多个时,只能使用直接初始化

10. 类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作

11. 可以使用标准库中的 iostream 来读写 int、double 等内置类型的值,也可以使用 IO 操作符读写 string 对象,string 对象会忽略开头的空白(即空格符、换行符、制表符等),并从第一个真正的字符开始读起,直到遇到下一处空白为止

#include <iostream>
#include "Sales_item.h"
using namespace std;

int main()
{
	string word;
	while (cin >> word) //读取未知数量的 string 对象
	{
		cout << word << endl;
	}
	
	return 0;
}

12. getline() 函数只要一遇到换行符就结束读取操作并返回结果,把所读的内容存入那个 string 对象中,换行符也被读进来了,但后面被丢弃了,得到的 string 对象中没有换行符

#include <iostream>
#include "Sales_item.h"
using namespace std;

int main()
{
	string line;
	while (getline(cin, line))
	{
		cout << line << endl;
	}

	return 0;
}

13. s.empty(),s 为空返回 true,否则返回 false,size() 函数返回 string 对象的长度(即 string 对象中字符的个数)

14. 所有用于存放 string 类型的 size 函数返回值的变量,都应该是 string ::size_type 类型的,其是无符号整型数,表达式混用带符号数和无符号数会产生意想不到效果,例如:假设 n 是一个负值的 int,则表达式 s.size() < n 的判断结果几乎是 true,这是因为负数 n 会自动转换成一个比较大的无符号值,一条表达式已经有了 size() 函数就不要使用 int 了,这样可以避免混用 int 和 unsigned 可能带来的问题

15. 比较 string 对象,这些比较运算符逐一比较 string 对象中的字符,并且对大小写敏感,同一字母的大小写是不同的,string 对象相等意味着它们的长度相同而且所包含的字符也全都相同,一对一对来比。允许把一个对象的值赋给另外一个对象

16. 两个 string 对象相加,是将两部分串接而成,将右侧的 string 对象加到左侧后面,+ 的两侧的运算对象至少有一个是 string,相加的结果为 string,不能把字面值直接相加,C++ 语言中的字符串字面值与 string 是不同的对象

17. cctype 头文件中定义了一些对字符处理判断的函数。例如 isalnum(c) 当c是字母或数字时为真

18. C++ 程序使用名为 cname 的头文件而不使用 name.h 的形式,标准库中的名字总能在命名空间中 std 中找到

19. 范围 for 语句:

//遍历 str 对象中的每个字符
for(char c: str对象)
{
    
}

//举例
string str("some string");
for(auto c: str)
{
    
}

20. 要改变 string 对象中字符的值,必须把循环变量定义成引用类型,依次绑定到序列的每个元素上,如果不用引用,相当于用拷贝复制副本,不能修改原 string 对象中字符的值

string s("HelloWorld!!!");
for (auto &c : s)
{
	c = toupper(c);
}
cout << s << endl;

21. 要访问 string 对象中的单个字符有两种方式:一种是使用下标,另外一种是使用迭代器,下标运算符【】接受的输入参数是 string::size_type 类型的值,这个参数表示要访问的字符位置,返回值是该位置上字符的引用,string 对象的下标从 0 计起,类似数组,s[s.size() - 1] 是最后一个字符,索引必须为整型值,只要 string 对象使用了下标,都要确定在那个位置确实有值

if (!s.empty()) //确保确实有字符需要输出
{
	cout << s[0] << endl;
}

22. 字符串常量与字符串变量,只要字符串不是常量,就能为下标运算符返回的字符赋新值

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s1 = "abc";//字符串变量 
	char* s2 = "abc";//字符串常量,先在常量区存储"abc",s2直接指向常量区的"abc" 
	char s3[] = "abc";//字符数组,先在常量区存储"abc",然后在栈区申请内存空间,将"abc"复制过来,s3指向栈区的"abc" 
	//  s1[0] = 'q';//正确,
	//  s2[0] = 'q';//错误,s2所指向内容是常量,不能修改 
	//  s3[0] = 'q';//正确 
	//  s1 = "abcd";//正确 
	//  s2 = "abcd";//正确,s2指向另外一个字符串常量 
	//  s3 = "abcd";//错误,s3是数组名,相当于指针常量,指向不能改变 
	cout << s1 << s2 << s3 << endl; 
	return 0;
} 

23.使用下标执行随机访问

#include <iostream>
#include <string>
using namespace std;

int main()
{
	const string hexdigits = "0123456789ABCDEF";
	cout << "Enter a series of numbers between 0 and 15"
		 << " separated by spaces. Hit ENTER when finished: "
		 << endl;
	string result;
	decltype(result.size()) n;
	while (cin >> n)
	{
		if (n < hexdigits.size())
		{
			result += hexdigits[n];
		}
	}
	cout << "Your hex number is:" << result << endl;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CV2017/article/details/82723323
今日推荐