第三章 字符串、向量和数组
这一章主要介绍了string、vector、迭代器和数组,也是较为基础的一章,但是在刷算法题目的时候经常可以用到一些里面的操作,所以一些基本的知识需要熟练运用。
(1)标准库类型string表示可变长的字符序列,其初始化的方式有很多种,主要是直接初始化和拷贝初始化。值得一提的是,其可以通过getline(is,s) 从输入流对象is中读取一行赋给s,并返回s,可以保持每一行输入时候的空白。
(2)标准库类型vector表示类型相同的对象集合,也可以称为容器。vector只能容纳对象作为其元素,但是因为引用不是对象,所以不能包含引用。
vector初始化的方式 https://blog.csdn.net/puliao4167/article/details/82941081
(3)push_back是把一个值当作vector对象的尾元素压到尾部,如果要插入头部,要用b.insert(b.begin(),5)。vector对象的下标运算符可用于访问已经存在的元素,而不能用于添加元素。
(4)要区分清楚是列表初始化还是元素数量。
vector<int> v1(10) //10个元素
vector<int> v2{10} //有一个元素10
vector<int> v3(10,1) //有十个元素,每个元素值为1
vector<int> v4{10,1} //有两个元素,分别是10和1
vector<string> v5("hi") //错误,无法初始化
vector<string> v6{"hi"} //列表初始化,有一个元素hi
vector<string> v7{10} //有十个元素
vector<string> v8{10,"hi"} //有十个元素,值为"hi"
(5)迭代器。begin成员负责返回指向第一个元素的迭代器,end成员负责返回指向容器尾元素下一个位置的迭代器。
(6)指针数组:本质为数组,里面的值都是指针类型。int * a[3]
数组指针:本质为指针,指向某个类型的数组。 int (*a)[3]
第四章 表达式
(1)表达式有一个或者多个运算对象组成,对表达式求值将得到一个结果。
(2)%,参与取余运算的运算对象必须是整数类型
(3)*a++,表示输出当前值并将a向前移动一个元素
(4)运算对象可以按照任意顺序求值,如果一个子表达式改变量某个运算对象的值,另一个子表达式又要使用这个值的话,就有可能产生冲突错误。
(5)sizeof *p;会返回p所指类型的空间大小
(6)显式转换,一般用static_cast<type>。
第五章 语句
此章比较基础,大部分和C的语句是一样的。新增了try-catch处理异常,还有新增了范围for语句for(auto a: string s),在这里不做过多阐述。
第六章 函数
(1)局部对象的生命周期。对于普通局部变量对应的对象来说,当函数控制路径经过变量定义语句时常见该对象,当到达定义所在的块末尾时销毁他,典型的就是形参,在函数开始时为形参申请存储空间,因为形参定义在函数体作用域之内,所以一旦函数中止,形参就会被销毁。而static定义的局部静态对象的生命周期贯穿函数调用及之后的时间,局部静态变量在程序执行路径第一次经过对象定义语句时初始化,并且直到程序终止才会被销毁。
(2)为来编写处理不同数量实参的函数,C++11提供两种解决方法:①如果所有的实参类型相同,可以传递一个initializer_list的标准库类型②如果实参类型不同,可以采用可变参数模板。
(3)函数重载和函数重写的区别。重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同(形参数量和形参类型),方法体也不相同,最常见的重载的例子就是类的构造函数。函数重写也叫做子类的方法覆盖父类的方法,要求返回值、方法名和参数都相同,子类抛出的异常不能超过父类相应方法抛出的异常。(子类异常不能超出父类异常),子类方法的的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)。
(4)内联函数(inline)。内联函数优点在于可以避免函数调用的开销,适用于优化规模较小、流程直接、频繁调用的函数。
(5)constexpr函数,用于常量表达式的函数,函数的返回值类型及所有形参的类型都是字面值类型,函数体中必须有一条return语句。
(6)函数指针。函数指针指向的是函数而非对象,函数的类型由他的返回类型和形参类型共同决定,与函数名无关,所以想要申明一个函数指针,就只需要用指针替换函数名即可。
bool lengthCompare (const string &,const string &);
变成函数指针为:
bool (*pf) (const string &,const string &);
pf是一个指向函数的指针,该函数的参数有两个const string的引用,返回值是bool类型。下面三种函数调用等价。
bool b1=pf("hello","chs");
bool b2=(*pf)("hello","chs");
bool b3=lengthCompare("hello","chs");
第七章 类
(1)构造函数。每个类都分别定义它的对象被初始化的方式,类通过一个或者几个特殊的成员函数来控制其对象的初始化过程,这些函数就是构造函数。构造函数名字和类名一样,且没有返回类型。默认构造函数就是无需任何实参的构造函数。只有当类没有声明任何构造函数的时候,编译器会自动地生成默认构造函数,否则如果要自己定义默认构造函数,则要加上
default_constructor = default;
(2)类可以允许其他类或者函数访问他的非公有成员,方法是令其他类或者函数成为他的友元,friend关键字加到函数声明语句即可。
(3)可变数据成员mutable,即使在一个const成员函数内,也可以改变他的值。
(4)委托构造函数。一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程
(5)隐藏类型转换。如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,同时只能运行一部类类型转换。同时利用explicit关键字可以抑制隐式类型转换,同时其只对一个实参的构造函数有效。
(6)静态成员。①静态成员可以是不完全类型,特别是静态数据成员的类型可以就是他所属的类类型,而非静态数据成员则受到限制,只能声明为所属类的指针或引用。②静态成员可以作为默认实参,非静态成员不行,因为其是属于对象的一部分。