C++ Primer学习笔记(二)

第三章 标准库类型

1.string对象比较操作是区分大小写的,即同一个字符的大小写形式被认为是两个不同的字符;

Using namespace std;

Using std::cin;

两种using的使用方法;

String类型的输入操作符:

读取并忽略开头的所有的空白字符(空格、换行、制表符),读取字符直到再次遇到空白字符。

While(cin>>s)死循环,一直读入字符;

Getline(输入流对象,string对象)可以读取中间带空格的字符串;返回的字符串会丢掉原来行尾的换行符,需要自行添加。

String 对象和字符串字面值混合连接操作时,+两侧必须要有一个是string对象;连续出现+时,string对象在左侧,按照从左至右的顺序进行运算。

String的操作函数.size()返回值类型是unsigned的string::size_type类型。

String对象中的字符获取可通过下标获取;

  1. 一个容器中的所有对象都必须是同一种类型的;

Vector是一个类模板,创建vector对象时候,需要说明类模板的数据类型:vector<int> vect_int;

 

Vector类型总是包括vector的元素类型;vector<int>::size_type h;

Vector的下标只能用来获取已经存在的元素,不能用做元素添加的功能使用;

V.Push_back(value)用作添加元素

3. 所谓的“缓冲区溢出”错误就是对不存在的元素进行下标操作的结果;

4.迭代器是一种检查容器内元素并遍历元素的数据类型,因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector类型也是这样;

5.每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值;注意和const iterator进行区分,这个是指所指向的地址为const,既一直指向容器的固定位置

6.任何改变vector长度的操作都会是以存在的迭代器失效;

7.在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值;

8.从string对象读入位集的顺序是从右向左;

9.string对象和bitset对象之间是反向转化的:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为0的位)。

 

 

第四章 数组和指针

1.如果没有显式提供元素初值,则数组元素会像普通变量一样初始化:

在函数体外定义的内指数组,其元素均初始化为0;

在函数体类定义的内置数组,其元素无初始化;

不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组元素提供显式初始化;

数组维数必须用值大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量,枚举常量或者其他用常量表达式表达初始化的整型const对象。

例如:const unsigned arrray_size=3;

Int ir[array_size]={1,2,2};

 

一个数组不能由另外一个数组初始化,也不能将一个数组赋值给另一个数组;

下标访问数组元素,所属类型为size_t;

防止下标越界产生的缓冲区溢出;

 

1指针是指向某种类型对象的复合数据类型,适用于数组的迭代器;每个指正都有个数据类型,该数据类型决定了指针指向对象的数据类型;

3.C++语言无法检测指针是否未被初始化,也无法区分有效地址和由指针分配到的存储空间中存放的二进制位形成的地址;

4.指针只能初始化或赋值为0值常量表达式(std::NULL);类型匹配的对象地址;另一对象末的下一地址;同类型的另一有效指针;

5. C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址;

6. void*指针只支持几种有限的操作:与另一个指针进行比较:向函数传递void*指针或从函数返回void*指针;给另一个void*指针赋值;不允许使用void*指针操纵它所指向的对象;

7.允许把非const对象的地址赋给指向const对象的指针;

8.可以修改const指针所指向的值,不能保证指向const的指针所指对象的值一定不能修改;

9. 可以把指向const的指针理解为“自以为指向const的指针”;

10.任何企图给const指针赋值的行为(即使给原指针赴会同样的值)都会导致编译时的错误;

举例如下:

 

  1. 11C风格字符串是以空字符null结束的字符数组

Cstring实现在c++中操作c风格字符串;

标准函数库strncat、strncpy比strcat、strcpy更安全(内存大小导致的泄漏);尽可能使用标准库string;

12.与数组变量不同,动态分配的数组将一直存在,直到程序显式释放它为止;

13. 每一个程序在执行时都占有一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆;

14.可以使用跟在数组长度后面的一对空圆括号,对动态分配的数组元素做值初始化;

15. 如果我们在自由存储区中创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化,唯一的方法是对数组做值初始化;

16. C++允许定义类类型的const数组,但该类类型必须提供默认构造函数;

17.调用new动态创建长度为0的数组是合法的;new创建长度为0的数组时,new返回有效的非零指针。该指针与new返回的其他指针有所不同,它不支持解引用操作,因为毕竟没有指向任何元素,但可以进行比较操作,可以进行加减零值或减去自身得到零值。

Delete [ ] name_of_pointer;释放new动态创建的数组,缺少[],编译器不报错,但是运行会导致内存泄漏,运行出错

18.可使用C风格字符串对string对象进行初始化或赋值;

string类型的加法操作需要两个操作数,可以使用C风格字符串作为其中的一个操作数,也允许将C分隔字符串用作复合赋值的右操作数;

在要求C风格字符串的地方不可直接使用标准库string类型对象;

标准库string提供了函数c_str,实现将string对象转变成C风格字符串数组并以null结尾的数组首地址指针;

19.严格来讲,C++中没有**数组,通常所指的**数组其实就是数组的数组;

20.如果表达式只提供了一个下标,则结果获取的元素是该行下标索引的内层数组;

21.定义指向多为数组的指正,其实就是指向数组的数组,指向第一内层的数组的指针,

例如:数组为 T name_of_array[row_size][col_size]

则定义的指针为 T (*name_of_pointer)[col_size]; name_of_pointer=name_of_array;

 

猜你喜欢

转载自blog.csdn.net/qq_34935373/article/details/90377828
今日推荐