
C++ Primer 中文版
文章平均质量分 63
xufei96
SDET .net C#
展开
-
第4章 数组和指针(7)
4.3 C风格字符串尽管C++支持C风格字符串,但不应该在C++程序中使用这个类型。字符串字面值的类型就是const char类型的数组。C风格字符串既不能确切地归结为C语言的类型,也不能归结为C++语言的类型。而是以空字符null结束的字符数组。数组的名字即是指向该数组第一个元素的指针。1. C风格字符串的使用C++语言通过(const)char*类型的指针来操纵C风格字原创 2011-11-14 16:59:30 · 279 阅读 · 0 评论 -
第4章 数组和指针(6)
2. const指针const指针本身的值不能修改。 int i = 5; int *const p = &i;const指针也必须在定义时初始化。指针本身是const的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指向对象的值能否修改完全取决于该对象的类型。 int i = 5; int *const p = &i; *p = 4; cout 3. 指向con原创 2011-11-14 15:53:53 · 252 阅读 · 0 评论 -
第4章 数组和指针(5)
2. 解引用和指针算术操作之间的相互作用 int i[]= {1, 2, 3}; int *j = i; cout 3. 下标和指针在表达式中使用数组名时,实际上使用的是指向数组第一个元素的指针。使用下标访问数组时,实际上是使用下标访问指针。 int i[]= {1, 2, 3, 4, 5}; int *j = &i[1]; cout 4. 计算数组的超出末端指原创 2011-11-14 15:29:08 · 285 阅读 · 0 评论 -
第4章 数组和指针(9)
4.3.2 新旧代码的兼容1.混合使用标准库类string和C风格字符串可以把C风格字符串用在任何可以使用字符串字面值的地方。可以使用C风格字符串对string对象进行初始化或赋值。string类型的加法操作需要两个操作数,可以使用C风格字符串作为其中的一个字符串。也允许将C风格字符串用作复合赋值操作的右操作数。在要求C风格字符串的地方不可直接使用标准库string类型对象原创 2011-11-15 16:27:08 · 278 阅读 · 0 评论 -
第5章 表达式(1)
C++提供了一元操作符(unary operator)和二元操作符(binary operator)两种操作符,C++还提供了一个使用三个操作数的三元操作符(ternary operator)。5.1 算术操作符一元操作符具有直观的含义,它对其操作数取负。操作溢出时,其结果值"截断",将符号位的值由0设为1,于是结果变为负数。 int i = 100; cout 5.原创 2011-11-16 14:23:47 · 327 阅读 · 0 评论 -
第5章 表达式(2)
5.5 自增和自减操作符因为前置操作返回加1后的值,所以返回对象本身,这是左值。而后置操作返回的则是右值。只有在必要时才使用后置操作符。 int i, j, k = 0, m = 0; i = k++; //0 j = ++m; //1 cout 5.6 箭头操作符C++语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->).点操作符用于获取类类原创 2011-11-16 15:20:44 · 293 阅读 · 0 评论 -
第4章 数组和指针(8)
4.3.1 创建动态数组数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道长度,数组只在定义它的块语句内存在。虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度。与数组变量不同,动态分配的数组将一直存在,直到程序显式释放它为止。每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存原创 2011-11-15 15:01:34 · 331 阅读 · 0 评论 -
第5章 表达式(4)
5.12 类型转换C++并不是把两个不同类型的值直接加在一起,而是提供了一组转换规则,以便在执行算术操作之前,将两个操作数转换为同一数据类型。这些转换规则由编译器自动执行,无需程序员介入——有时甚至不需要程序员了解。因此,它们被称为隐式类型转换(implicit type conversion).隐式类型转换中,左操作数的类型占主导地位。如果赋值操作的左右操作类型不相同,则右操作数会被转换原创 2011-11-17 10:55:44 · 273 阅读 · 0 评论 -
第6章 语句(1)
6.1 简单语句程序语句最简单的形式是空语句(null statement):; // null statement使用空语句时应该加上注释,以便任何读这段代码的人都知道该语句是有意省略的。6.2 声明语句对象或类的定义或声明也是语句,经常被称为声明语句(declaration statement)。6.3 复合语句(块)复合语句(compound statement原创 2011-11-17 14:24:43 · 279 阅读 · 0 评论 -
第6章 语句(2)
6.6 switch语句6.6.1 使用swicth如果表达式与其中一个case标号值相匹配,则程序从该标号后面的第一个语句开始依次执行各个语句,直到switch结束或遇到break为止。如果没有发现匹配的case标号(并且没有default标号),则程序从switch语句后面的第一条语句继续执行。break语句中断当前的控制流。对于swicth的应用,break语句将控制跳出swit原创 2011-11-17 15:14:15 · 316 阅读 · 0 评论 -
第6章 语句(3)
6.7 while语句当条件为真时,while语句反复执行目标语句。6.8 for循环语句6.8.1 省略for语句头的某些部分for语句头中,可以省略init-statement(初始化语句)、condition(循环条件)或者expression(表达式)中的任何一个(或全部)。如果不需要初始化或者初始化已经在别处实现了,则可以省略init-statement。省略co原创 2011-11-17 17:07:07 · 283 阅读 · 0 评论 -
第6章 语句(4)
6.13 try块和异常处理throw表达式(throw expression),错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw引发(raise)了异常条件。try块(try block),错误处理部分使用它来处理异常。try语句块以try关键字开始,并以一个或多个catch子句(catch clause)结束。在try块中执行的代码所抛出(throw)的异常,通原创 2011-11-18 09:56:39 · 248 阅读 · 0 评论 -
第7章 函数(1)
7.1 函数的定义函数由函数名以及一组操作数类型唯一地表示。函数的操作数,也即形参(parameter),在一对圆括号中声明,形参与形参之间以逗号分隔。函数执行的运算在一个称为函数体(function body)的块语句中定义。每一个函数都有一个相关联的返回类型(return type)。int gcd(int i, int j){ while(j) { int temp = j原创 2011-11-18 14:01:41 · 272 阅读 · 0 评论 -
第7章 函数(2)
7.2 参数传递形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值;如果形参为引用类型,则它只是实参的别名。7.2.1 非引用形参普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值。非引用形参表是对应实参的局部副本。对这类形参的修改仅仅改变了局部副本的值。一旦函数执行结束,这些局原创 2011-11-18 14:56:38 · 313 阅读 · 0 评论 -
第7章 函数(3)
7.2.2 引用形参与所有引用一样,引用形参直接关联到其所绑定的对象,而并非这些对象的副本。定义引用时,必须用与该引用绑定的对象初始化该引用。引用形参完全以相同的方式工作。每次调用函数,引用形参被创建并与相应实参关联。void swap(int &i, int &j){ int tmp = i; i = j; j = tmp;}1.使用引用形参返回额外的信息2. 利用cons原创 2011-11-18 17:06:42 · 281 阅读 · 0 评论 -
第7章 函数(4)
7.2.5 传递给函数的数组的处理非引用数组形参的类型检查只是确保实参是和数组元素具有同样类型的指针,而不会检查实参实际上是否指向指定大小的数组。任何处理数组的程序都要确保程序停留在数组的边界内。第一种方法是在数组本身放置一个标记来检测数组的结束,C风格字符串是一种字符数组,并且以空字符null作为结束的标记。处理C风格字符串的程序就是使用这个标记停止数组元素的处理。1. 使用标准原创 2011-11-21 13:38:24 · 259 阅读 · 0 评论 -
第7章 函数(5)
7.4 函数声明正如变量必须先声明后使用一样,函数也必须在被调用之前先声明。与变量的定义类似,函数的声明和函数的定义分离:一个函数只能定义一次,但是可声明多次。函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这三个元素被称为函数原型(function prototype),函数原型描述了函数的接口。函数原型为定义函数的程序员和使用函数的程序员原创 2011-11-21 14:58:34 · 273 阅读 · 0 评论 -
第7章 函数(7)
7.7 类的成员函数函数原型必须在类中定义。但是,函数体则既可以在类中也可以在类外定义。7.7.1 定义成员函数的函数体类的所有成员都必须在类定义的花括号里面声明,此后,就不能再为类增加任何成员。类的成员函数必须加声明的一般定义。类的成员函数既可以在类的定义内也可以在类的定义外定义。编译器隐式地将在类内定义的成员函数当作内联函数。类的成员函数可以访问该类的private成员。原创 2011-11-22 11:01:35 · 302 阅读 · 0 评论 -
第7章 函数(9)
7.7.4 类代码文件的组织通常将类的声明放置在头文件中。大多数情况下,在类外定义的成员函数则置于源文件中。C++程序员习惯使用一些简单的规则给头文件及其关联的类定义代码命名。类定义应置于名为type.h或type.H的文件中,type指在该文件中的类的名字。成员函数的定义则一般存储在与类同名的源文件中。7.8 重载函数出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称原创 2011-11-22 16:14:06 · 276 阅读 · 0 评论 -
第1章 快速入门(2)
1.3 关于注释注释不会增加可执行程序的大小,编译器会忽略所有的注释。C++中有单行注释和成对注释两种类型的注释。单行注释以双斜线(//)开头,行中处于双斜线右边的内容是注释,被编译器忽略。另一种界定符,注释对(/**/),是从C语言继承过来的。这种注释以"/*"开头,以"*/"结尾。编译器把落入注释对”/**/“之间的内容作为注释。 /*This is a comment*/原创 2011-11-01 13:42:18 · 267 阅读 · 0 评论 -
第1章 快速入门(3)
1.4.3 if语句#include "stdafx.h"#include int main(){ int i, j; std::cin >> i >> j; if(i > j) { int k = i; i = j; j = k; } std::cout << "The bigger number is " << j << std::endl;}1.4.4原创 2011-11-01 15:08:07 · 230 阅读 · 0 评论 -
第1章 快速入门(1)
1.1 编写简单的C++程序每个C++程序都包含一个或多个函数,而且必须有一个命名为main。函数由执行函数功能的语句序列组成。操作系统通过调用main函数来执行程序,main函数则执行组成自己的语句并返回一个值给操作系统。每个C++程序都必须含有main函数,且main函数是唯一被操作系统显示调用的函数。main函数的返回值必须是int类型,该类型表示整数。函数体是函数定义的最后原创 2011-11-01 13:01:35 · 328 阅读 · 0 评论 -
第2章 变量和基本类型(4)
2.3.4 变量初始化规则#include "stdafx.h"#include int num4;int main(){ std::cout << num4 << std::endl;}1. 内置类型变量的初始化内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体里定义的内置类型变量不进行自动初始化。除了用作赋值操作符的左操作数原创 2011-11-02 15:52:46 · 484 阅读 · 0 评论 -
第7章 函数(6)
7.5 局部对象在函数中定义的形参和变量的名字只位于函数的作用域中:这些名字只在函数体中可见。通常,变量名从声明或定义的地方开始到包围它的作用域结束处都是可用的。7.5.1 自动对象只用当定义它的函数被调用时才存在的对象称为自动对象(automatic object).自动对象在每次调用函数时创建和撤销。局部变量所对应的自动对象在函数控制经过变量定义语句时创建。如果在定义时提供了初原创 2011-11-21 17:24:34 · 269 阅读 · 0 评论 -
第7章 函数(8)
7.7.2 在类外定义函数成员stdafx.cppint Class1::Method2() const{ int i = 0; ++i; return i;}stdafx.hclass Class1{ public: int Method2() const;};用作用域操作符执行函数是类的作用域范围内定义的。7.7.3 编写Sales_item类的构造原创 2011-11-22 14:18:32 · 242 阅读 · 0 评论 -
第7章 函数(10)
7.8.4 实参类型转换为了确定最佳匹配,编译器将实参类型到相应形参类型的转换划分等级。转换等级以降序排列如下:(1)精确匹配(exact macth)。实参与形参类型相同。(2)通过类型提升(promotion)实现的匹配。(3)通过标准转换(standard conversion)实现的匹配。(4)通过类类型转换(class-type conversion)实现的匹配。原创 2011-11-22 16:52:03 · 283 阅读 · 0 评论 -
第8章 标准IO库(1)
8.1 面向对象的标准库C++中所提及的父类称为基类(base class),而继承而来的类则称为派生类(derived class)。IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于读写存储在内存中的string对象。在fstream和sstream里定义的每种类型都是从iostream头原创 2011-11-23 16:50:38 · 338 阅读 · 0 评论 -
第2章 变量和基本类型(1)
区别于Python,C++是静态类型语言,在编译时执行类型检查。结果是程序中使用某个名字之前,必须先告知编译器该名字的类型。2.1 基本内置类型C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型,另外还定义了一种称为void的特殊类型。void类型没有对应的值,仅在有限的一些情况下,通常用作无返回函数的返回类型。2.1.1 整型表示整数、字符和布尔值的算术类型合称为整型(原创 2011-11-02 10:14:26 · 312 阅读 · 0 评论 -
第2章 变量和基本类型(2)
2.2 字面值常量像42这样的值,在程序中被当作字面值常量(literal constant)。1. 整型字面值规则以0(零)开头的字面值整数常量表示八进制,以0x或0X开头的表示十六进制。定义长整型时,应该使用大写字母L。小写字母l和数字1很容易混淆。类似地,可通过在数值后加U和u定义unsigned类型。2. 浮点字面值规则通常可以用十进制或者科学计数法来表示浮点字原创 2011-11-02 13:24:00 · 298 阅读 · 0 评论 -
第2章 变量和基本类型(3)
2.3 变量C++是一门静态类型语言,在编译时会作类型检查。在C++中操作是否合法是在编译时检查的。静态类型检查使得编译器必须能标识程序中的每个实体的类型。因此,程序中使用变量前必须先定义变量的类型。2.3.1 什么是变量变量提供了程序可以操作的有名字的存储区。C++中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可应用在该变原创 2011-11-02 14:18:54 · 278 阅读 · 0 评论 -
第2章 变量和基本类型(6)
2.6 typedef名字typedef可以用来定义类型的同义词。typedef定义关键字typedef开始,后面是数据类型和标识符。标识符或类型名并没有引入新的类型,而只是现有数据类型的同义词。typedef名字可出现在程序中类型名可出现的任何位置。typedef通常被用于以下三种目的:为了隐藏特定类型的实现,强调使用类型的目的。简化复杂的类型定义,使其更易理解。允许一种原创 2011-11-03 11:01:57 · 283 阅读 · 0 评论 -
第8章 标准IO库(2)
8.2 条件状态IO标准库管理一系列条件状态(condition state)成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪种特定的错误。strm::iostate 机器相关的整型名,由各个iostream类定义,用于定义条件状态。strm::badbit strm::iostate类型的值,用于指出被破坏的流。strm::failbit strm::iostate类型原创 2011-11-24 12:24:13 · 325 阅读 · 0 评论 -
第8章 标准IO库(3)
8.3 输出缓冲区的管理8.3 输出缓冲区的管理每个IO对象管理一个缓冲区,用于存储程序读写的数据。系统将字符串字面值存储在与流关联的缓冲区中。下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:(1) 程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区。(2) 在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。原创 2011-11-24 14:11:18 · 317 阅读 · 0 评论 -
第2章 变量和基本类型(5)
2.4 const 限定符1. 定义const对象定义一个变量代表某一常数的方法仍然有一个严重的问题。即bufSize是可以被修改的。bufSize可能被有意或无意地修改。const限定符提供了一个解决办法,它把对象转换成一个常量。因为常量在定义后就不能被修改,所以定义时必须初始化。2. const对象默认为文件的局部变量与其他变量不同,除非特别说明,在全局作用域声明的cons原创 2011-11-03 09:41:28 · 265 阅读 · 0 评论 -
第2章 变量和基本类型(7)
2.9 编写自己的头文件一般类定义都会放入头文件(header file)。为了允许把程序分成独立的逻辑块,C++支持所谓的分别编译(separate compilation)。2.9.1 设计自己的头文件头文件为相关声明提供了一个集中存放的位置。头文件一般包含类的定义、extern变量的声明和函数的声明。使用或定义这些实体的文件要包含适当的头文件。保证所有文件使用给定实体原创 2011-11-03 14:15:52 · 274 阅读 · 0 评论 -
第8章 标准IO库(4)
8.4 文件的输入和输出fstream头文件定义了三种支持文件IO的类型:(1) ifstream,由istream派生而来,提供读文件的功能。(2) ofstream,由ostream派生而来,提供写文件的功能。(3) fstream,由iostream派生而来,提供读写同一个文件的功能。可使用IO操作符(>)在文件上实现格式化的IO。fstream类型除了继承下来的行为原创 2011-11-24 17:08:46 · 453 阅读 · 0 评论 -
第8章 标准IO库(5)
在打开文件时,无论是调用open还是以文件名作为流初始化的一部分,都需要指定文件模式(file mode)。每个fstream类都定义了一组表示不同模式的值,用于指定流打开的不同模式。与条件状态标志一样,文件模式也是整型常量,在打开指定文件时,可用位操作符设置一个或多个模式。文件流构造函数和open函数都提供了默认实参设置文件模式。默认值因流类型的不同而不同。此外,还可以显式地以模式打开文件。原创 2011-11-25 15:28:14 · 285 阅读 · 0 评论 -
第3章 标准库类型(1)
3.1 命名空间的using声明使用using声明可以在不需要加前缀namespace_name::的情况下访问命名空间中的名字。一旦使用了using声明,我们就可以直接引用名字,而不需要再引用该名字的命名空间。#include "stdafx.h"#include using std::cout;using std::endl;int main(){ cout << "H原创 2011-11-03 16:22:32 · 321 阅读 · 0 评论 -
第8章 标准IO库(6)
8.5 字符串流iostream标准库支持内存中输入/输出,只要将流与存储在程序内存中的string对象捆绑起来即可。此时,可使用iostream输入和输出操作符读写这个string对象。标准库定义了三种类型的字符串流:istringstream, 由istream派生而来,提供读string的功能。ostringstream,由ostream派生而来,提供写string的功能。s原创 2011-11-25 17:01:24 · 336 阅读 · 0 评论 -
第3章 标准库类型(2)
3.2.3 string对象的操作1. string的size和empty操作string对象的长度指的是string对象中字符的个数,可以通过size操作获取。 string str("Anders"); cout empty()成员函数将返回bool值,如果string对象为空则返回true,否则返回false。2. string::size_type类型size操作返回原创 2011-11-04 13:22:17 · 260 阅读 · 0 评论