您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 笔记

2015-11-13 16:16 302 查看
强制类型转换

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 成员函数返回。

const必须同时出现在声明和定义中。

inline在声明和定义处指定都是合法的。

不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用;或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。一般用于编写相互依赖的类。

为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用。

const对象只能使用const成员,非const对象可以使用任一成员。

在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

友元的关系不能传递。(A是B的朋友,B是C的朋友,但不一定A是C的朋友)。

友元以friend声明,它只能出现在类定义的内部,但是友元可以继承(这是我在VS编译器中测试的结果,在C++ Primier中说其不可以继承)。

但是友元可以继承(这是我在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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: