C++ Primer 第五版 中文版
洌泉_就这样吧
Less is more.
展开
-
【C++ Primer 第五版】 目录-第Ⅰ部分
第一章 开始1.1 编解一个简单的C++程序 1.1.1 编译、运行程序1.2 初识输入输出1.3 注释简介1.4 控制流 1.4.1 while 语句 1.4.2 for语句 1.4.3 读取数量不定的输入数据 1.4.4 if语句1.5 类简介 1.5.1 Sales_item类 1.5.2 初识别成员函数1.6 书店程序小结术语表第Ⅰ部分 C++基础第2章 变量和基本类型2.1 基本内置类型 2.1.1 基本内置类型 2.1.2 类型转换原创 2021-05-12 16:07:04 · 551 阅读 · 0 评论 -
【C++ Primer 第五版】函数指针
函数指针指向的是函数,而不是对象函数的类型由其返回类型和形参类型共同决定,与函数名无关bool lengthCompare(const string &, const string &);bool (*ptr)(const string &, const string &);//替换函数名即可如果上述指针没有括号,则表示函数ptr返回值类型是bool*如果将函数名作为一个值使用,则自动转换为指针可以直接使用函数调用函数,而无须解引用指针pf = lengthC原创 2021-06-07 17:31:09 · 117 阅读 · 0 评论 -
【C++ Primer 第五版】函数指针
函数指针指向的是函数,而不是对象函数的类型由其返回类型和形参类型共同决定,与函数名无关bool lengthCompare(const string &, const string &);bool (*ptr)(const string &, const string &);//替换函数名即可如果上述指针没有括号,则表示函数ptr返回值类型是bool*如果将函数名作为一个值使用,则自动转换为指针可以直接使用函数调用函数,而无须解引用指针pf = lengthC原创 2021-06-07 17:30:30 · 104 阅读 · 0 评论 -
【C++ Primer 第五版】函数匹配
调用函数时需要确定选用哪个重载函数首先确定对应的重载函数集,要求与被调用的函数同名,且声明在调用点可见,这些函数为候选函数判断能被实参调用的函数,要求形参数量与调用的实参数量相等,且类型相同,或能转换成形参的类型,这些函数称为可行函数寻找自家匹配,根据调用实参来寻找形参类型与实参类型最匹配的那个可行函数,基本思想是:实参类型与形参类型越接近,则匹配越好优先考虑没有内置类型转换的,如果没有最佳匹配,就会出错调用重载函数应避免强制类型转换最佳匹配顺序:精确匹配通过const转换实现的匹配原创 2021-06-07 17:11:35 · 78 阅读 · 0 评论 -
【C++ Primer 第五版】特殊用途语言特性
1 默认实参默认实参是指函数调用的时候反复出现的值调用默认实参的函数,可以包含该实参,也可以省略该实参一旦某个形参被赋予默认值,则它后面的所有形参都需要有默认值给定作用域中一个形参只能被赋予一次默认实参不能修改已经声明过、存在的默认值,但可以添加默认实参局部变量不能作为默认实参,只要表达式的类型可以转换为形参所需的类型,该表达式就能作为默认实参2 内联函数内联函数可以避免函数调用的开销内联机制用于优化规模较小、流程直接、频繁调用的函数,很多编译器不支持内联递归函数如果一个函数是内联的,那原创 2021-06-07 16:59:07 · 76 阅读 · 0 评论 -
【C++ Primer 第五版】函数重载
重载:同一作用域内的几个函数的名字相同但形参列表不同函数接受的形参类型不一样,但执行的操作非常类型,编译器可以根据传递的实参类型推断想要的是哪个函数void print(const char *cp);void print(const int *beg, const int *end);void print(const int ia[], size_t size);函数名字仅仅是让编译器知道调用哪个函数,函数重载可以减轻程序员记名字的负担main函数的不能重载定义重载函数重载的函数的形原创 2021-06-07 16:09:57 · 140 阅读 · 0 评论 -
【C++ Primer 第五版】返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用函数的地方,包括两种形式return;return expression;1 无返回值函数没有返回值的return语句只能用在返回类型是void的函数中返回void函数不要求非得有return语句,这类函数最后会隐式执行如果void函数想要提前退出,可以使用return语句如果使用return语句的第二种形式,expression必须是另一个返回void的函数2 有返回值函数有返回值函数的返回值类型必须和函数的返回类型相同,或者能原创 2021-06-04 16:28:32 · 196 阅读 · 0 评论 -
【C++ Primer 第五版】参数传递
每次调用函数时都会重新创建它的形参,并传入实参对形参进行初始化形参初始化与变量初始化一样形参的类型决定了形参和实参交互的方式,如果形参时引用类型,则它将绑定到对应的实参上,否则将实参的值拷贝后赋给形参当形参时引用类型,则称它对应的实参被引用传递或者函数被传引用调用与其他引用一样,引用形参也是它绑定对象的别名当实参拷贝给形参时,则形参和实参时两个相互独立的对象,这样的实参被值传递,或者函数被传值调用1 传值参数初始化一个非引用类型的变量,初始值被拷贝给变量,对变量的改动不会影响初始值传值参数的原创 2021-05-27 17:20:14 · 108 阅读 · 1 评论 -
【C++ Primer 第五版】函数基础
1 函数介绍函数是一个命名了的代码块,通过调用函数执行相应的代码,函数可以有0个或多个参数,而且通常会产生一个结果,可以重载函数,一个函数名对应不同的几个函数典型的函数定义包括:返回类型(return type)、函数名字、由0个或多个形参(parameter)组成的列表以及函数体形参以逗号隔开,位于一对圆括号内函数执行的操作在语句块中说明,该语句块称为函数体(function body)调用运算符来执行函数调用运算符的形式是一对圆括号,作用于一个表达式,表达式是函数或者指向函数的指针圆括号内原创 2021-05-25 16:26:35 · 183 阅读 · 0 评论 -
【C++ Primer 第五版】try语句块和异常处理
异常是指存在于运行时的反常行为,超出了函数正常功能的范围,典型的异常包括失去数据库连接以及遇到意外输入C++语言的异常护理包括:throw表达式,异常检测部分使用throw表达式表示它遇到了无法处理的问题try语句块,异常处理部分使用try语句块处理异常,try语句块以关键字try开始,并以一个或多个catch子句结束,catch也称为异常处理代码一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息1 throw表达式Sales_item item1, item2;原创 2021-05-25 15:08:46 · 174 阅读 · 0 评论 -
【C++ Primer 第五版】跳转语句
跳转语句用于中断当前的执行过程,C++语言提供了4种跳转语句,break、continue、goto、return1 break语句break语句负责终止离它最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行break语句只能出现在迭代语句或switch语句内部2 continue语句continue语句终止最近的循环中的当前迭代,并立即进行下一次迭代continue语句只能出现在for、while和do while循环的内部,或者嵌套在此类循原创 2021-05-25 14:27:06 · 108 阅读 · 0 评论 -
【C++ Primer 第五版】 迭代语句
迭代语句通常称为循环,while和for语句在执行循环体之前检查条件,do while语句先执行循环体,再检查条件1 while语句while (condition) statement当不确定迭代多少次,使用while比较合适想在循环结束后访问循环控制变量也应该使用whilevector<int> v;int i;while (cin >> i) v.push_back(i);auto beg = v.begin();while (beg !=原创 2021-05-25 11:22:47 · 118 阅读 · 0 评论 -
【C++ Primer 第五版】条件语句
C++提供两种按条件指向的语句,一种是if语句,根据条件决定控制流,另一种是switch语句,根据计算得到的整型表达式的值来选择执行路径1 if 语句if语句的作用是判断一个指定条件是否为真,根据判断结果来决定是否执行另外一条语句,if语句可以有else分支,也可以没有if (condition) statementelse statement2if语句的condition必须用圆括号包围condition可以是表达式,也可以是初始化了的变量condition中的内容必须能转原创 2021-05-25 11:04:06 · 158 阅读 · 1 评论 -
【C++ Primer 第五版】语句作用域
可以在if、switch、while和for语句的控制结构内定义变量,这些变量只能是内部可见while (int i = get_num()) // 每次迭代时创建并初始化i cout << i << endl; i = 0; // 错误,在循环外部无法访问i练习:找出例子中的问题while (string::iterator iter != s.end()){/*...*/} // 每次循环则重新定义迭代器,无法起到迭代效果while (bool stat原创 2021-05-25 10:36:26 · 93 阅读 · 0 评论 -
【C++ Primer 第五版】简单语句
C++大多数语句都以分号结束表达式ival+5,末尾加上分号变成表达式语句1 空语句最简单的语句是只有一个分号的空语句常见情况是,空语句会使用在循环中while (cin >> s && != sought) ;// 空语句使用空语句应该加上注释,让读者知道是有意省略别漏写分号,也别多写while (iter != svec.end()) ; // while 循环体是空语句,会产生无限循环 ++iter;// 递增运算不属于循环一部分 2原创 2021-05-25 10:29:08 · 104 阅读 · 0 评论 -
【C++ Primer 第五版】运算符优先级表
结合律和运算符功能用法左 ::全局作用域::name左 ::类作用域class::name左 ::命名空间作用域namespace::name结合律和运算符功能用法左 .成员选择object.member左 ->成员选择pointer->member左 []下标expr[expr]左 ()函数调用name(expr_list)左 ()类型构造type(expr_list)...转载 2021-05-25 10:12:58 · 146 阅读 · 0 评论 -
【C++ Primer 第五版】类型转换
C++中某些类型可以相互转换,则它们之间是有关联的double和int的数相加,C++会做隐式转换,避免损失精度,整型转换为浮点型隐式转换情况:int类型提升为较大的整数类型非布尔值转换成布尔值初始化时,初始值转换成变量的类型,赋值语句中,右侧运算对象转换成左侧运算对象的类型算术运算或关系运算的运算对象有多种类型,需要转换成同一类型函数调用也会发生类型转换1 算术转换一种算术类型转换成另外一种算术类型整型提升赋值把小整数类型转换成较大的整数类型无符号类型不小于带符号类型,带符号的运原创 2021-05-25 09:36:33 · 457 阅读 · 0 评论 -
【C++ Primer 第五版】逗号运算符
含有两个运算对象,按照从左向右的顺序依次求值逗号运算符真正的结果是右侧表达式的值逗号运算符常常被用在for循环中vector<int>::size_type cnt = ivec.size()// 将把从size到1的值赋给ivec的元素for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix, --cnt){ ivec[ix] = cnt;}练习:4.31 前置和后置的递增运算符后置的递增运原创 2021-05-24 15:48:05 · 137 阅读 · 0 评论 -
【C++ Primer 第五版】sizeof运算符
sizeof运算符返回一条表达式或一个类型名字所占的字节数sizeof满足右结合律,所得值是size_t类型的常量表达式sizeof使用形式为:sizeof (type);sizeof expr; // 返回表达式结果类型的大小sizeof运算符无须作用于具体对象,只需得到类成员的大小char类型,得到结果为1引用类型,得到被引用对象所占空间大小指针,得到指针本身所占空间大小解引用指针,得到指针指向对象的所占空间大小,指针不必有效数组,得到整个数组所占空间大小string或vect原创 2021-05-24 11:23:06 · 100 阅读 · 0 评论 -
【C++ Primer 第五版】位运算符
1 位运算符简介位运算作用于整数类型,并把运算对象看成是二进制位的集合位运算符提供检查和设置二进制位的功能位运算符包括:~:位求反,~expr<<:左移,expr1 << expr2>>:右移,expr1 >> expr2&:位与,expr1 & expr2^:位异或,expr1 ^ expr2|:位或,expr1 | expr2位运算对象如果是小整型,会被自动提升1 移位运算符对运算对象执行基于二进制的移动操作右原创 2021-05-24 11:15:43 · 163 阅读 · 0 评论 -
【C++ Primer 第五版】条件运算符
1 概念条件运算符(?:)允许把简单的if-else逻辑嵌入到单个表达式中,条件运算符的形式如下:cond ? expr1 : expr2运算顺序为:先求cond的值,如果条件为真对expr1求值并返回该值,否则对expr2求值并返回该值条件运算符只计算两个表达式其中一个2 嵌套条件运算符finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass"原创 2021-05-20 11:09:41 · 135 阅读 · 0 评论 -
【C++ Primer 第五版】成员访问运算符
1 概述点运算符和箭头运算符都可以用于访问成员点运算符获取类对象的一个成员表达式ptr->mem等价于(*ptr).memstring s1 = "a string", *p = &s1;auto n = s1.size(); // 运行string对象s1的size成员n = (*p).size(); // 运行p所指对象的size成员n = p->size(); // 等价于(*p).size()解运算符优先级低于点运算符,所以执行解运算的子表达式需原创 2021-05-20 10:34:10 · 474 阅读 · 0 评论 -
【C++ Primer 第五版】递增和递减运算符
递增运算符++和递减运算符–作用是为对象加1或减1操作的一种简洁的书写形式递增和递减运算符有两种形式,前置版本和后置版本前置版本:先加1或减1,再作为求值结果int i = 0, j;j=++i; // j=1,i=1,前置版本得到递增后的值后置版本:同样加1或减1,求值结果是递增或递减之前的值int i = 0, j;j=++i; // j=0,i=1,前置版本得到递增前的值建议,养成前置版本的习惯,不用担心性能,也复合编程初衷混用解引用和递增运算符auto pbeg =原创 2021-05-19 15:57:48 · 118 阅读 · 0 评论 -
【C++ Primer 第五版】赋值运算符
赋值运算符左侧运算对象必须时一个可修改的左值如果左侧运算对象是内置类型,那么初始值列表只能最多包含一个值对于类类型,由类本身决定,例如vector,可以赋予多个值vector<int> vi;vi = {0,1,2,3,4,5};赋值运算满足右结合律赋值运算返回的是其左侧运算对象赋值运算优先级较低,所以条件语句中赋值部分通常加上括号切勿混淆相等运算符和赋值运算符复合赋值运算符,等价于a= a op b算术运算符:+=,-=,*=,/=,%=位运算符:<<=原创 2021-05-19 15:07:24 · 110 阅读 · 0 评论 -
【C++ Primer 第五版】逻辑和关系运算符
1 逻辑和关系运算符介绍逻辑和关系运算符的返回值都是布尔类型,值为0的运算符表示假,否则表示真对于两类运算符来说,运算对象和求值结果都是右值逻辑非:!小于/小于等于:</<=大于/大于等于:>/>=相等/不相等:==/!=逻辑与:&&,当且仅当两个运算对象都为真时结果为真逻辑或:||,只要两个运算对象中的一个为真结果就为真2 逻辑运算符短路求值:先求左侧再求右侧逻辑与,当且仅当左侧为真时才计算右侧逻辑或,当且仅当左侧为假时才计算右侧逻原创 2021-05-19 14:57:58 · 146 阅读 · 0 评论 -
【C++ Primer 第五版】算术运算符
优先级:一元运算符>乘除>加减优先级高的运算符比优先级低的运算符组合得更紧密算术运算符都满足左结合律,优先级相同时从左往右组合对大多数运算符来说,布尔类型的运算对象将被提升为int类型,参与运算时将被提升为整数值1,求负后是-1当计算结果超过该类型所能表示的范围会溢出,不一定会报错,但是溢出后值的结果是不确定的,应避免溢出错误作用于算术类型的对象时,整数相除结果仍为整数+、-、*、/对应加法、减法、乘法、除法运算符%俗称为取余或取模运算符,负责计算得到两个整数相除所得的余数,参与取原创 2021-05-19 14:24:13 · 99 阅读 · 0 评论 -
【C++ Primer 第五版】 表达式基础
1 基本概念表达式是由一个或多个运算对象组成,求值得到结果字面值和遍历时最简单的表达式一个运算符和一个或多个运算对象组合起来可以生成复杂表达式C++包含一元运算符、二元运算符、三元运算符一元运算符:作用于一个运算对象的运算符,如取地址符&和解引用符*二元运算符:作用于两个运算对象的,如相等==和乘法*三元运算符:作用于三个运算对象函数调用也是一种特殊的运算符,且数量没有限制运算符具有优先级进而结合律,及运算对象的求值顺序运算对象不同时,有时会强制转换,通常会被提升重载运算符原创 2021-05-19 14:04:51 · 80 阅读 · 0 评论 -
【C++ Primer 第五版】多维数组
严格来说,C++语言没有多维数组,所谓的多维数组其实是数组的数组,即数组的元素仍为数组1 多维数组定义int ia[3][4]; // 大小为3的数组,每个元素是含有4个整数的数组int arr[10][20][30]; // 大小为10的数组,每个元素是大小为20的数组,这些数组的元素含有30个整数的数组,所有元素初始化为0二维数组,第一维度成为行,第二维度成为列2 多维数组的初始化允许使用花括号括起来的一组值初始化多维数组,与普通数组类似int ia[3][4] = { // 三个元原创 2021-05-18 16:22:32 · 87 阅读 · 0 评论 -
【C++ Primer 第五版】 数组
1 定义和初始化内置数组数组与vector类似,都是存放类型相同对象的容器访问对象可以通过器所在位置进行访问与vector不同,数组大小确定不变,不能随意向数组增加元素默认情况下,数组元素会默认初始化int arr[10]; //含有10个整数的数组int *parr[10]; // 含有10个整型指针的数组定义数组必须指定数组类型,不能使用auto数组元素为对象,不存在引用的数组数组可以进行列表初始化,初始值不能超过指定大小int arr[5] = {0,1,2};//等价于 int原创 2021-05-18 15:54:01 · 97 阅读 · 0 评论 -
【C++ Primer 第五版】迭代器
1 迭代器介绍与指针不同,迭代器不是取地址符,有迭代器的类型拥有返回迭代器的成员迭代器拥有begin和end的成员,begin成员返回第一个元素,end成员返回最后一个元素的下一个位置,即不存在的尾后如果容器没有元素,则begin和end返回是相同的采用auto关键字,可以不在意迭代器的准确类型*iter 返回迭代器所指元素的引用iter->mem 解引用,获取成员,等价于(*iter).mem++iter 指示容器下一个元素–iter 指示容器上一个元素iter == iter2原创 2021-05-17 14:55:24 · 180 阅读 · 0 评论 -
【C++ Primer 第五版】标准库类型 vector
1 vector介绍vector表示对象的集合,包含的对象类型都相同,且有对应索引来访问对象vector 容纳着其他对象,所以也被称作为容器使用vector要包含头文件 #include C++包含类模板和函数模板,vector是一个类模板编译器根据模板创建类和函数的过程称为实例化2 定义和初始化vector对象vector<T> v1; // v1是空vector,元素类型是Tvector<T> v2(v1); // v2中包含有v1所有元素的副本vector&原创 2021-05-17 14:53:00 · 136 阅读 · 0 评论 -
【C++ Primer 第五版】标准库类型 string
1 初始化stringstring支持可变长字符串,vector支持可变长集合标准库迭代器常用于访问string和vector中的元素内置数组是更基础的类型,string和vector是内置数组的抽象使用string类型必须包含string头文件,且string定义在命名空间std中,即需要#include <string>using std::string;string s1; // 默认初始化,s1是一个空字符串string s2 = s1;原创 2021-05-17 14:51:03 · 108 阅读 · 0 评论 -
【C++ Primer 第五版】命名空间的using声明
使用using声明就无须专门的前缀(形如命名空间::)也能使用相应函数,形式如下:using namespace::name;示例代码:#include <iostream>using std::cin;int main(){ int i; cin >> i; // 正确,cin与std::cin含义相同 // cout << i; // 错误,没有对应的using声明,要使用完整名字 std::cout <<原创 2021-05-17 14:49:00 · 125 阅读 · 0 评论 -
【C++ Primer 第五版】自定义数据结构
1 允许用户自定义数据结构以关键字struct开始,紧跟类名和类体,类体由花括号包围形成新的作用域类体右侧的花括号必须接上分号,而类体后面可以紧跟变量名对该类型对象进行定义struct Sales_data{ std::string bookNo; unsigned units_sold = 0; double revenue = 0.0;};// 定义struct,并定义类对象struct Sales_data{ /*...*/} accm, trans, *sptr原创 2021-05-14 17:37:06 · 108 阅读 · 0 评论 -
【C++ Primer 第五版】处理类型
1 类型别名使用类型别名是为了使名字简单、易于理解和使用定义类型别名的方法由两种传统方法是使用关键字typedeftypedef double wages;C++ 11标准的新方法,使用别名声明using SI = Sales_item;采用using作为别名声明,紧跟别名和等号类型别名和类型名字在等价2 指针、常量和类型别名typedef char *pstring; // 定义指向char的指针const pstring cstr = 0; // cstr是指向char的常量指原创 2021-05-14 16:48:31 · 102 阅读 · 0 评论 -
【C++ Primer 第五版】限定符
【C++ Primer 第五版】限定符1 初始化和const定义值不能改变的变量,使用const限定const对象创建后值不能改变,因此必须初始化默认状态,const对象仅在文件内有效编译时,初始化定义const对象会进行替换相应值extern修饰的const常量可以定义1次,并被其他文件使用2 常量引用将引用绑到const对象,常量引用不能用作修改所绑定对象常量对象必须使用常量引用常量引用可以绑定任意表达式作为初始值常量引用可以绑定非常量对象3 指针和const指向常量的指针是c原创 2021-05-14 11:21:45 · 110 阅读 · 0 评论 -
【C++ Primer 第五版】复合类型
复合类型是指其他类型定义的类型C++有集中复合类型,引用和指针是其中两种复合类型变量的定义要复杂很多1 引用C++ 11包含左值引用和右值引用,一般的引用都是指左值引用引用为对象另外一个名字,用&d的形式来定义int ival = 1024;int &refVal = ival; // refVal指向ival,是ival别名int &refVal2; // 错误,引用必须初始化程序将引用和它的初始值绑定,而不是将初始值拷贝给引用完成初始化,则引用与初始值对象绑原创 2021-05-14 10:38:04 · 153 阅读 · 0 评论 -
【C++ Primer 第五版】变量
变量提供具名的、可供程序操作的存储空间C++变量都有数据类型,决定其所在内存大小和布局方式、储值范围C++中,变量和对象一般可以互换使用1 变量定义形式是 [类型说明符] [变量名],其中变量名可以多个由逗号隔开,最后以分号结束定义时候可以给变量赋初始值,称为初始化同一条定义语句中,可以用先定义的变量值去初始化后定义的其他变量double price = 120.99, discount = price * 0.8可以用函数返回值来初始化变量虽然初始化和赋值都是用=号,但其实二者是完全不原创 2021-05-13 17:05:47 · 85 阅读 · 0 评论 -
【C++ Primer 第五版】基本内置类型
1 C++语法特征简述理解语法特征的实现细节是学习并掌握编程语言的第一步最基本的特征包括:整型、字符串等内置类型变量,用来为对象命名表达式和语句,用于操作上述数据类型的具体值if或while等控制结构,这些结构允许我们有选择性地执行一些语句或重复地执行一些语句函数,用于定义可供随时调用的计算单元大多数语言可自定义数据类型进行扩展,并将有用的功能进行封装为库函数Python是在程序运行时检测数据类型,而C++是一种静态数据类型语言,在编译过程中就进行检查,编译器直到程序每个变量对应的数据原创 2021-05-13 16:05:02 · 123 阅读 · 0 评论 -
【C++ Primer 第五版】书店程序
#include <iostream>#include "Sales_item.h"int main(){ Sales_item total;// 保存下一条交易记录的变量 // 读入第一条交易记录,并确保有数据可以处理 if (std::cin >> total){ Sales_item trans; // 保存和的变量 // 读取并处理剩余交易记录 while (std::cin >> tr原创 2021-05-13 14:42:00 · 360 阅读 · 0 评论