新概念:连续输入的数据区分、字符串字面量连接、对象初始化、输入检测
连续输入是根据数据类型以及空白间隔来区分不同数据的。假设有这样一段代码:
int i;
std::string s;
std::cin>>i>>s;
我们输入的数据是:123abc,那么std::cin能够自动区分出这是两个数据,并将123赋给变量i,将abc赋给变量s。如果我们输入的数据是:123 456,那么std::cin会将123赋给变量i,而456将作为字符串赋给变量s。
字符串字面量可以用多个“”对来连接,但是中间只能是空白间隔。例如我们写
std::string s = "abc"
"def";
和写
std::string s = "abcdef";
是等同的。有些时候我们的字符串字面量可能会非常长,那么我们使用多个“”来分行写将会便于我们阅读,也可以进行一些段落或者行的区分等等。
内置类型对象未初始化时值未定义,自定义对象默认使用缺省构造进行初始化。例如:
std::string s; s将会是一个空字符串,而
int i; i的值我们是无法预知的。
所以我们对待内置类型的对象,通常是在声明这个对象的时候进行初始化,避免由于以后忘记初始化而导致一些莫名其妙的错误或者异常。如果内置类型作为自定义类型的成员,那么我们应该在我们自定义类的构造函数初始化列表中将其初始化,这些都是良好的编码习惯,我们应该学习并养成这样的习惯。
对于输入检测(即判断输入操作成功与否),std::cin遇到输入数据类型不匹配、文件结束符或者硬件故障就会导致我们的检测为假。所谓数据类型不匹配就是类似这样的输入:
int i;
std::cin>>i;
我们输入:a
我们输入了一个字符,而我们期望的是接受一个整型,那么数据类型就不匹配了,如果我们进行了输入检测if (std::cin>>i),那么判断条件将会为假。
我们将输入设备都看作“文件”,包括我们熟悉的键盘。在windows下,标准输入设备的文件结束符是一个组合键:ctrl+z。只要我们输入这样一个组合键,那么std::cin也会使我们的检测为假。
新设施:std::vector、std::sort、std::max、std::setprecision
当我们要存储一批相同类型的数据的时候我们就可能会需要一个容器,那么std::vector就是标准库为我们提供的这样一种设施。它具备动态增长的特性,我们几乎可以不用关心它是否能够容下我们全部的数据。并且我们可以通过标准库提供的std::sort对std::vector中的数据进行排序,代码简洁明了:std::sort(vec.begin(), vec.end());。标准库提供的std::max返回两个数据中较大的一个,而std::setprecision则是控制输出流的精度。
新技术:模板中的typedef
标准库提供的很多设施都是模板类或者模板函数,有些时候我们也要编写我们自己的模板。然而模板是可以将类型作为参数的,这样我们的模板参数就具有了类型不确定性。但是我们有些时候往往需要取得模板类的参数类型,那么typedef就是一个很好的技术。例如:
template<typename T>
class Container{
public:
typedef T element_type;
};
typedef Container<int> IntContainer;
我们定义了一个将作为容器的模板类,模板参数就是我们容器能够容纳的元素类型。当我们需要知道某个容器的元素类型的时候,我们只需要使用IntContainer::element_type得到其元素类型。这里IntContainer::element_typ等同于int。
下一课:C++课堂第4章 组织程序和数据 希望我的课堂对大家学习C++有所帮助