C++ Primer 笔记

来源:互联网 发布:软件app开发 编辑:程序博客网 时间:2024/05/16 18:34

强制类型转换
cast-name(expression);
1)dynamic_cast 支持运行时类别指针或引用所指向的对象。
2)static_cast 编译器隐式执行的任何类型转换都可以由static_cast显式完成。
3)reinterpret_cast 通过为操作数的位模式提供较底层的重新编译。
强制类型转换关闭或挂起了正常的类型检查,尽量避免使用。如:
这里写图片描述
程序员必须永远记住pc所指向的是真实对象是int型,而非字符数组,任何假设pc为普通字符指针的应用,都有可能带来运行时错误。如
string str(pc); //有怪异行为
此外,旧式强制类型转换依赖于所涉及的数据类型,具有与上面三种显式转换一样的形为;编译器根据实际情况应用相关合适的转换。

标准IO库
IO 类型在三个独立的头文件中定义:iostream 定义读写控制窗口的类型,
fstream 定义读写已命名文件的类型,而 sstream 所定义的类型则用于读写存
储在内存中的 string 对象。
这里写图片描述
出于某些原因,标准库类型不允许做复制或赋值操作。两层含义:(1)只有支持复制的元素类型可以存储在vector或其它容器类型里;(2)形参或返回类型也不能为流类型,如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。
一般情况下,如果要传递IO对象以便对它进行读写,可以用非const引用的方式传递这个流对象这里写图片描述
流必须处于无错误状态才能用于输入输出。
所有的流对象都包含一个条件状态成员,该成员由setstate和clear操作管理。这个状态成员为iostate类型,这是由各个iostream类分别定义的和机器相关的整形。该状态成员以二进制位bit的形式使用。
badbit 标志着系统级的故障,如无法恢复的读写错误。如果出现了这类错误,则该流通常就不能再继续使用了。
如果出现的是可恢复的错误,如在希望获得数值型数据时输入了字符,此时则设置failbit标志,这种导致设置failbit的问题通常是可以修正的。
eofbit是在遇到文件结束符时设置的,此时同时还设置了failbit。
流的状态由bad、fail、eof和good操作提示。如果bad、fail或者eof中的任意一个为true,则检查流本身将显示该流处于错误状态。类似地,如果这三个条件没有一个为true,则good操作将返回true。

endl:用于输出一个换行符并刷新缓冲区;
ends:在缓冲区中插入空字符NULL,然后刷新它;
flush:刷新流

在每次输出操作执行完后,用 unitbuf 操作符设置流的内部状态,从而清空缓冲区。
如果需要刷新所有输出,用nuitbuf操作符。这个操作符在每次写操作后都刷新流。
cout << unitbuf << “first” << ” second” << nounitbuf;
等价于:
cout << “first” << flush << ” second” << flush;
1. 文件的输入输出
由于历史原因,IO 标准库使用 C 风格字符串而不是 C++strings 类型的字符串作为文件名。
如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现在的文件,然后打开(open)另一个文件。
2. 读文件中文件流的状态
如果程序员需要用文件流读写多个文件,必须在读另一个文件之前调用clear清除该流的状态。
3. 文件打开模式
这里写图片描述
out、trunc 和 app 模式只能用于指定与 ofstream 或 fstream 对象关联
的文件;in 模式只能用于指定与 ifstream 或 fstream 对象关联的文件。所有
的文件都可以用 ate 或 binary 模式打开。ate 模式只在打开时有效:文件打
开后将定位在文件尾。以 binary 模式打开的流则将文件以字节序列的形式处
理,而不解释流中的字符。
以out模式打开的文件会被清空。当文件同时以in,out打开时不清空。
打开模式的有效组合
这里写图片描述
4. 字符串流的操作
这里写图片描述

顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素。
这里写图片描述

关联容器类型
这里写图片描述

三种迭代器
1)插入迭代器(insert iterator):迭代器适配器,与容器绑定在一起,实现在容器中插入元素的功能。形参为一个迭代器和一个指向容器的引用。
• back_inserter,创建使用 push_back 实现插入的迭代器,形参为指向容器的引用的迭代器适配器。
• front_inserter,使用 push_front 实现插入。
• inserter,使用 insert 实现插入操作。
2)iostream迭代器(iostream iterator):与输入或输出流绑定在一起,用于迭代遍历所关联的 IO 流。
虽然 iostream 类型不是容器,但标准库同样提供了在 iostream 对象上使用的迭代器:istream_iterator 用于读取输入流,而 ostream_iterator 则用于写输出流。
3)反向迭代器(reverse iteraor):反向遍历。所有容器类型都定义了自己的reverse_iterator类型,由 rbegin 和 rend 成员函数返回。

  1. const必须同时出现在声明和定义中。
  2. inline在声明和定义处指定都是合法的。
  3. 不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用;或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。一般用于编写相互依赖的类。
  4. 为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用。
  5. const对象只能使用const成员,非const对象可以使用任一成员。
  6. 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
  7. 友元的关系不能传递。(A是B的朋友,B是C的朋友,但不一定A是C的朋友)。
  8. 友元以friend声明,它只能出现在类定义的内部,但是友元可以继承(这是我在VS编译器中测试的结果,在C++ Primier中说其不可以继承)。
  9. 但是友元可以继承(这是我在VS编译器中测试的结果,在C++ Primier中说其不可以继承)。

Static (静态)类成员
1. 在类外给static成员数据赋值,或定义成员函数时不必要再指定static。
2. 因为 static 成员不是任何对象的组成部分,所以 static 成员函数不能被声明为 const。保证对象正好定义一次的最好办法,就是将 static 数据成员的定义放在包含类非内联成员函数定义的文件中。

构造函数
1. 类类型的数据成员总是在初始化阶段初始化。
2. 没有默认构造函数的类类型的成员,以及 const 或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。
3. 成员被初始化的次序就是定义成员的次序。
4. 尽可能避免使用成员来初始化其他成员
5. C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).
6. 1)抑制由转换构造函数定义的隐式转换
声明为explicit,来停止隐式转换的上下文中使用构造函数。
2)如果真的需要转换,则显式的进行。
通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为 explicit。
7. 当将该类型的对象传递给函数或函数返回该类型的对象时,将隐式使用复制构造函数。
8. C++支持两种初始化形式:直接初始化和复制初始化。复制初始化使用=,而直接初始化将初始化放在圆括号中。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象:
9.

0 0
原创粉丝点击