这篇笔记记录了我在学习C++常用基夲语法的学习过程基本只记录一些重难点,对概念的描述不是一开始就详尽和准确的而是层层深入的。第三章主要讲这么五个概念:
namespace嘚语句在现在3.10版本已经在头文件里用命名空间标识符来代替以前的做法。可见不在头文件中使用using语句是很标准的用法(这里的using 语句指嘚只是使用命名空间作用域的using语句,不包括using SI=int这种别名声明语句)
1.输入流中获取字符串 首先要强调是cin>>string的操作,这种操作就是从输入流中讀字符串值得注意的是这个过程会忽略掉开头输入的各种空白(我们说空白时是在说 空格,换行符制表符),读取输入流直到遇到字符後的第一个空白为止,另一种getline(cin,string);的操作则可以读一行也就是读入输入流的数据(包括空格,制表符)直到遇到换行符为止,这里输叺流中的换行符本身已经被读过了但是字符串里不保存这个换行符。下次再从输入流里读什么数据至少也要从这个换行符后面对输入流進行操作了
]中的数字也会被转换为string::type_size类型。这里要强调的是string::type_size是一个无符号类型使用这个类型和int型这种有符号的类型一起进行计算可能出現一些错误。
首次初始化变量a的值会被初始化为对象b序列中的第一个元素,迭代之后每次访问下一个元素直到序列被完全访问结束。
str){}這样的语句则使a成为了str对应的每个元素的"别名",从而可以修改str
使用范围for循环遍历多维数组,为了不手动打类名也为了防止外层数组的名被auto类型转化成指针,要在对外层数组的访问上都加上&绑定
当我们在C++里面谈论容器这个概念时,我们应该知道容器是用来存储和组织一类特定对象的集合下面提到的标准库类型vector,就是一个容器
类模板一般用于按照模板规定好的规则生成不同的类。我们无需很麻烦的一个┅个写类的定义只需使用模板,给出指定的少量信息类模板就会帮助我们自动生成一个我们可以直接使用的类。vector也是一个类模板
通過类模板创建类的过程,或者通过类型创建对象的过程就叫做实例化。
当我们使用圆括号()初始化对象时IDE会认为我们在通过语句“構建”这个对象 ;当我们使用花括号{ }初始化对象时,IDE会认为我们在初始化对象
当我们使用等号=初始化对象时,我们就执行了“拷贝初始囮”;当我们不使用=初始化对象时我们就执行了“直接初始化”。
<string>s1={10};这样的语句是错误的因为=就应该是拷贝初始化了,然而10并不能够被轉化为string因此也无法赋值
为了访问容器的元素(有些容器可能不支持下标运算符),因此C++提供了迭代器这个概念来访问容器中的指定元素
ben=i1.begin();这个语句获取指向第一个字符的迭代器,使用auto end=i1.end();获取指向i1容器最后一个元素的下一个元素的迭代器术语“尾后迭代器”。两个迭代器可鉯相减但是两个迭代器相加后的行为是未定义的。
<int>命名空间中的迭代器类型写作vector<int>::iterator。因为这个叫做"vector<int>::iterator"的迭代器类型名太长了也不好记这裏我们使用auto推导这个类型。用成员函数cbegin和cend可以推导出底层const迭代器就是这个迭代器对迭代器指向的内容只读不写。第6章会详细说明
虽然數组不是直接支持迭代器的类型,但是可以引入<iterator>头文件使用begin(数组名)和end(数组名)的方式获得指向数组第一个元素和尾后第一个元素的指针。洇为大多数容器不支持下标运算符所以使用迭代器访问容器等结构中的元素是最好的方法。
*型的即指向int的指针,这样的指针有15个构荿了一个数组。虽然有指针数组但是不存在元素都是引用类型的数组。
a[n]={1,2,3};大括号里面的内容就是初始化列表n为数组大小,可以缺省缺渻时数组长度由初始化列表的元素个数决定。当初始化列表的值的个数比数组长度小数组剩下的元素被初始化为默认的值,比如对于有10個元素的int型数组如果只给出第一个元素的值,后几个元素将被初始化为0
a;这样的形式,a将会是和数组名属性一致的数组在大部分运算Φ,数组名都会被转化成相应的指针类型如*(ai+4)中,数组名ai是指向整个数组首元素的指针这个指针+4就是向右侧移动4位,指针原来指向第┅个元素移动4位就指向了数组中的第五个元素。然后指向的值就是ai数组第五个元素的值相当于ai[4]。
用string对象赋值字符数组(英文版124页)
*b=a.c_str();这樣的语句使string型的a被赋值给字符数组指针b返回结果是const是为了确保我们不会通过这个指针改动返回的字符数组的值。
书上的之后的代码都默認它们已经使用了正确的命名空间作用域关于书中使用到的命名空间作用域,书后的附录A1部分有列表标注了这些书中用到的命名空间作鼡域
2:默认初始化、值初始化、拷贝初始化、直接初始化和列表初始化:
本章介绍了这几种初始化概念,这里主要分析它们的区别默認初始化依赖于类的默认行为,函数外定义的类如果没有初始值将被默认初始化为这个类“0”这个概念对应的值。函数内定义的未初始囮的值执行默认初始化时有两种情况当这个类是C++内置类的时候,比如说int,float这个值不被初始化;当这个类是用户定义的或者是我们使用类模板定义的,将被构造函数初始化其中如果这个类的对象被隐式初始化为这个类意义上的零,对应的这种初始化的行为就叫做值初始化
拷贝初始化和直接初始化的区别只在于初始化语句带()、{}还是由=构成。使用小括号或者大括号初始化对象的行为叫做直接初始化使用=号初始化对象的行为叫做拷贝初始化,其中使用{}初始化对象的行为叫做列表初始化。特点是列表初始化的列表内容必须要和初始化对象的類型严格匹配