从零开始的C++(八)

1.类和模版的补充:

1、本质:原本由程序员自己写的一些高度重复的函数改由编译器来写。

模版实例化:编译阶段生成函数;分为隐式调用和显示调用两种,隐式调用是由编译器根据传入参数的类型来决定模版的类型,显示调用是在函数调用处显示定义具体的类型。

当有编译器编写后和程序员自己编写的函数参数列表、名字完全一致,编译器优先用程序员编写的函数(可以认为编译器希望能偷懒,在已经有可以用的函数时就不会自己再写一个函数了)。但如果希望编译器来写一个函数并被调用,可以用显示调用。

类模版的定义、声明分离:

定义成员函数:类名::<类型>函数名(形参);此处"类名::<类型>"被称为类型(一般非模版的类类名和类型一致)。

如果把定义和声明在两个文件中编写,会报错(即不能有.h声明,.cpp定义)。

2.stl的一些常识:

1、stl全程是标准模板库。

2、stl是C++标准库的一部分。

3、主要包括容器、算法、迭代器、仿函数、适配器、空间适配器等。

3.string:

1、string不属于stl,但是C++标准库的一部分。

2、string的作用是管理字符数组。

3、string本质是模板,但在库内被实例化成专门处理char类型的字符数组的。

4、构造:string 对象名、string 对象名(字符串)、

5.string中实现了流插入、流删除、运算符重载、内部动态增长。

6、因为重载了+,所以可以实现对象=字符串1+字符串2(效果类似strcat)。(甚至可以实现s=s+s,此处s是string类型的对象)。

7、访问:长度:对象名.size();对象名[i],访问下标为i的元素;

8、遍历字符串:

法一:cout<<对象名;

法二:范围for     for(auto e:对象名) cout<

法三:迭代器 for(auto it=对象名.begin();it!=对象名.end();it++)  cout<<*it;

9、迭代器:

常见的有正向迭代器和反向迭代器,每个迭代器又对应了const修饰的对象和非const修饰的对象。

从零开始的C++(八)_第1张图片

begin一般指向第一个字符,end指向最后一个有效字符的下一位(一般指向'\0')。

一般遍历的时候判断结束的标志都是“!=对象名.end()”,且这个方法是所有容器通用的。如果用"<对象名.end()"对于string可以,但是对于别的容器可能会失败。

10、构造string:string 对象名(对象1,n,m),是取对象1的第n个字符开始的前m个,如果m过大超过对象1的长度,就只能取到对象1的尾部,如果忽略m默认是取到对象1的末尾(此处编译器默认m=npos ,const static size_t npos=-1,表示npos是无限大).

11、size和length都可以取string类型的对象的长度,length是对标c语言的strlen所编写的,size是在stl出现后所编写的,length只能用于string类型的对象,但size可以用于任意容器。

12、clear:作用是清空字符串,但是空间不会释放(可以通过capacity来判断,capacity大小不变则说明空间不会释放),释放空间一般都是析构函数的功能。

13、max_size:作用是确定字符串所能取到的最大长度,但有时可能不准,一般不怎么用。

14、c_str:注意都是小写字母,作用是返回对象中保存字符串的成员,这样C语言就可以使用字符串。

你可能感兴趣的:(c++,开发语言,算法,数据结构)