- 博客(44)
- 收藏
- 关注
原创 C++Primer 6.5节——特殊语言用途(内联函数和constexpr函数)
C++Primer 6.5节——特殊语言用途(内联函数和constexpr函数)一、内联函数1、内联函数的作用①将函数指定为内联函数,通常就是将它在每个调用点上“内联”地展开成具体的代码。②加快程序的运行速度。2、内联函数的定义:在函数的返回类型前面添加上inline关键字。二、constexpr函数1、constexpr函数的定义①contexpr函数是指能用于常量表达式的函数。②注意:函数的返回类型及所有形参的类型必须都是字面值类型,且函数体内必须有且只有一条return语句。③字面
2020-07-10 10:37:56 334
原创 C++Primer 6.5节——特殊语言特性(默认实参)
C++Primer 6.5节——特殊语言特性(默认实参)一、默认实参1、默认实参的定义①在函数调用的过程中,如果没有给出对应形参的实参,系统会自动将设定好的实参赋予形参,这个实参就称为函数的默认实参。②允许给一个或多个形参定义默认值,但注意的是,一旦我们给某个形参定义了默认值,其后面所有的形参都必须定义默认值。2、使用默认实参调用函数①我们在使用默认实参的时候,只需在函数调用时省略该实参。②函数调用时实参逐位赋值给形参,默认实参负责填补函数调用缺少的尾部实参。3、默认实参声明①函数的声明通
2020-07-10 09:17:05 239
原创 C++Primer 6.4节——函数重载(1)
C++Primer 6.4节——函数重载(1)一、函数重载1、函数重载的含义①如果同一作用域内的几个函数的名字相同,但是形参列表不同,我们称之为重载函数。②形参列表不同,指形参的数量或类型不同。③注意:不允许两个函数除了返回类型外其他所有的元素都相同。二、重载函数中的const形参需知的知识点:顶层const在拷贝时,不受什么印象。但底层const不能转换成其他类型,但是非常量可以转换成底层const。1、当形参是顶层const时①一个拥有顶层const的形参无法和一个没有顶层const形
2020-07-09 09:34:17 256
原创 C++Primer 6.3节——返回类型和return语句
C++Primer 6.3节——返回类型和return语句一、return语句1、return语句的两种形式①return;②return expression; //return的这种形式提供了函数的结果。③没有返回值的return语句只适用于返回类型是void的函数。但返回void的函数不一定要有return语句。④return语句将控制权从被调函数转移到主函数,并返回某个值。⑤一个返回是void的函数也可以使用第②种形式的return语句,但return的expression必须是另一
2020-07-06 16:53:59 277
原创 C++Primer 6.2节——参数传递 续处理命令行选项和含有可变形参的函数
C++Primer 6.2节——参数传递 续处理命令行选项和含有可变形参的函数1、给main函数传递实参①main函数可以是空形参,也可以有两个(可选的)形参。②当我们需要给main函数传递实参时,用户可以通过设置一组选项来确定函数所要执行的操作。如:int main(int argc,char *agrv[]) {…}//第二个形参是一个数组,其元素是指向C风格字符串的指针,第一个形参agrc表示数组中字符串的数量。③最后一个指针之后的元素值保证为0。④具体传递实参的方法参照:向main函数
2020-07-02 10:51:56 138
原创 C++Primer 6.2节——参数传递 续数组形参
C++Primer 6.2节——参数传递 续数组形参1、数组形参①数组的两个性质:不允许拷贝数组以及使用数组时通常会将其转换成指针。②当给函数传递一个数组时,实际上传递的是指向数组首元素的指针。③数组形参的定义:(1)void print(const int*);(2)void print(const int[]);(3)void print(const int[10]);以上三个函数都是等价的,每个函数的形参类型都是const int*。④表示数组大小的三种方式(1)使用标记指定数组长
2020-07-02 10:25:28 153
原创 C++Primer 6.2节——参数传递
C++Primer 6.2节——参数传递1、形参和实参的关系①当形参是引用类型时,形参绑定在它对应的实参上,引用形参是它对应的实参的别名。②当形参是非引用类型时,将实参的值拷贝给形参,则实参和形参是两个独立的对象。2、传值参数①传值参数:将实参的值拷贝给形参。②函数对形参的所有操作都不会影响实参。③指针形参:当形参是个指针时,实参也是个指针,将实参拷贝给形参,拷贝的是指针的值,形参和实参是两个不同的指针。3、传引用参数①通过使用引用形参,允许函数改变一个或多个实参的值。改变引用形参就能改变
2020-07-02 09:19:59 142
原创 C++Primer 6.1节——函数基础 续
C++Primer 6.1节——函数基础 续1、局部对象①在C++语言中,名字有作用域,对象有生命周期。②局部变量:形参和函数体内定义的变量统称局部变量。它们对函数而言是局部的,仅在函数的作用域内可见。③全局变量:在所有函数体之外定义的变量,存在于程序的整个执行过程中。此类变量从创建开始,到程序结束后才会销毁。④自动对象:只存在于块执行期间的对象称为自动对象。⑤局部静态对象。(1)作用:有时候会将局部变量的生命周期贯穿其变量从创建到程序结束的时间。(2)声明周期:在程序的执行路径第一次经过对
2020-07-01 16:52:58 119
原创 C++Primer 6.1节——函数基础
C++Primer 6.1节——函数基础1、函数的含义①函数是一个命名了的代码块,我们通过调用函数来执行相应的代码块。②函数可以有0至多个参数,而且通常会产生一个结果。②可以重载函数,即同一个名字可以对应不同的函数。2、函数的形式①一个典型的函数包括:返回类型、函数名字、由0个或多个形参组成的列表以及函数体。3、调用函数①通过调用运算符()来执行函数,调用运算符作用与一个表达式,该表达式是函数或者指向函数的指针。圆括号内是一个用逗号隔开的实参列表。②函数的调用实现两项工作:一是用实参初始化
2020-07-01 16:29:08 112
原创 C++Primer 6.2.5||6.25练习
C++Primer 6.2.5||6.25练习题目:编写一个main函数,令其接受两个实参。把实参的内容连接成一个string对象并输出出来。解:首先按照书上写出如下程序。#include<iostream>#include<string>using std::string;using std::cin;using std::cout;using std::endl;int main(int argc,char **argv){string str;
2020-07-01 10:51:04 491
原创 C++Primer5.6节——try语句块和异常处理
C++Primer5.6节——try语句块和异常处理1、throw表达式①作用:程序异常检测部分使用throw表达式引发一个异常。②形式:throw表达式包含throw关键字和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。如 throw runtime_error(“wrong thing”);2、try语句块①作用:程序异常处理部分使用try语句块处理异常。②try语句的形式:try语句块以关键字开始,并以一个或多个catch子句结束。③catch子句的形式:catch语句包
2020-06-24 10:33:01 201
原创 C++Primer5.5节——跳转语句
C++Primer5.5节——跳转语句跳转语句中断当前的执行过程,跳转语句有break、continue、goto、return。1、break语句①作用:break语句负责终止离它最近的while、do while 、for或switch语句,并从这些语句的下一条语句开始执行程序。②作用范围:仅限于最近的循环或switch。2、continue语句①作用:continue语句终止最近的循环中的当前迭代并执行下一次迭代。②作用范围:和break语句相同的是,continue语句仅作用最近的循环
2020-06-24 09:46:47 120
原创 C++Primer5.4节——迭代语句
C++Primer5.4节——迭代语句迭代语句通常被称为循环,迭代语句有while,do while循环、传统for循环和范围for循环。1、while循环①形式:while(condition)statement;(1)condition不能为空。(2)定义在while条件或者循环体内的变量每次迭代都要经历从创建到销毁的过程。(3)先判断条件,条件为真后执行循环体内的语句,否则执行结束while循环。②使用的情况:当不确定要迭代多少次时,使用while循环比较合适。(1)如读取输入的内
2020-06-23 16:31:15 142
原创 C++Primer5.3——条件语句
C++Primer5.3——条件语句1、if语句①if语句含有两种形式(1)if(condition)statement;(2)if(condition)statement1;elsestatement2;②嵌套if语句③悬垂else(1)悬垂else:当if多于else时,不知道else跟哪个if匹配。(2)C++规定,else与它最近的尚未匹配的if匹配,从而消除了程序的二义性。2、switch语句①switch语句提供几种选项提供我们选择,选择符合条件的一个选项。②cas
2020-06-23 11:18:15 170
原创 C++Primer5.1&5.2——简单语句和语句作用域
C++Primer5.1&5.2——简单语句和语句作用域1、简单语句①表达式语句,是以分号结束的语句。作用是执行表达式并丢弃求值结果。比较普遍的情况是,表达式语句中的表达式在求值时附带其他效果,如给变量赋值或输出变量的值。②空语句(1)最简单的语句是空语句,空语句内只包含一个分号。(2)使用空语句时,应该加上注释让人知道这个空语句是有意义的。(3)不要漏写分号,也不要多写分号。③复合语句(块)(1)复合语句是指用花括号括起来的(可能为空的)语句和声明的序列,复合语句也被称作块。(
2020-06-23 10:29:25 164
原创 C++Primer难点解读
C++Primer难点解读关于while(cin>>a);这个语句一开始看的时候是有一些疑问的。一是对cin这个词不太了解,虽然书上解释了cin是输入流类型istream类型的对象,但是还是无法理解为什么从键盘输入的数据,为什么会存储在cin这个对象中去。二是对>>这个运算符不太了解,书上的解释是>>是输入运算符,但是在书后面会介绍这个符号其实是右移运算符,它的作用是将化为二进制的数据右移。而输入运算符>>是右移运算符的重载,也就是对这个>>
2020-06-23 10:01:48 1086
原创 C++Primer 4.11节类型转换——显示转换
C++Primer 4.11节类型转换——显示转换1、显示转换将对象显示地强制转换成另一种类型。2、命名的强制类型转换①形式: cast-name< type >(expression);cast_name可以是static_cast、dynamic_cast、const_cats、reinterpret_cast。type:是要转换成的类型expression:是要转换的值。3、static_cast底层const:表示指针指向的对象是一个常量。比如:const int *p
2020-06-18 15:26:18 144
原创 C++Primer 4.11节类型转换——难点
如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为。然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果上面这句话的分析如下:1、如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为。意思:非常量对象进行强制类型转换,除了转换成常量类型外,是可以对转换过后的非常量对象进行写操作的。2、然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果。意思:常量对象进行了const_cast类型转换,去掉了底层const,但是它还
2020-06-18 11:16:01 164
原创 C++Primer 4.11节——类型转换——隐式转换
C++Primer 4.11节——类型转换1、隐式转换转换的过程:首先类型转换规则设法将运算对象的类型统一后再求值,上述的类型转换是自动转换的,所以被称作是隐式转换。2、发生隐式转换的情况①在大多数表达式中,比int类型小的整型值首先提升成较大的整数类型。②在条件中,非布尔值转换成布尔类型。③初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象的类型转换成左侧运算对象的类型。④如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。⑤函数调用也会发生类型转换。3、算数
2020-06-18 09:30:39 277
原创 C++Primer 2.1节难点——把-1赋给8比特大小的unsigned char所得得结果是255
把-1赋给8比特大小的unsigned char所得得结果是2551、当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。2、unsigned char的表示范围是0~255,模就是256。3、把-1赋给8比特大小的unsigned char所得的结果是255,即-1%255=256。有两种方法可以解释(1)将-1加上模(256)的整数倍,使其相加后的值在0~255的区间内即可。(2)使用取模运算的方法,首先求整数商: c = a/b,然后计算取模后的
2020-06-17 21:27:48 503 1
原创 取模运算和取余运算的区别
取模运算和取余运算的区别下文取自于百度百科。对于整型数a,b来说,取模运算或者求余运算的方法都是:1.求 整数商: c = a/b;2.计算模或者余数: r = a - c*b.求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。例如计算:-7 Mod 4那么:a = -7;b = 4;第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入);
2020-06-17 17:00:08 597
原创 C++Primer 4.9&4,10——sizeof运算符和逗号运算符
C++Primer 4.9&4,10——sizeof运算符和逗号运算符1、sizeof运算符①sizeof运算符的作用:返回一条表达式或一个类型名字所占的字节数。②sizeof运算符满足右结合律,所得的值是一个size_t类型的常量表达式。③运算符的运算对象有两种形式:(1)sizeof (type); //sizeof返回的是某个类型的大小(2)sizeof expr; //sizeof返回的是表达式结果类型的大小。④C++新标准允许我们使用作用域运算符来获取类成员的大小。
2020-06-17 16:33:39 198 1
原创 C++Primer4.8节——位运算符
C++Primer4.8节——位运算符1、位运算符①位运算符作用于整数类型的运算对象,且把运算对象当作二进制的集合。②位运算符提供检查和设置二进制位的功能。③如果运算对象是“小整型”–char、bool型等,则它的值会自动提升成较大的整型–int、long型等。char型一般是8位,int型一般是32位。④强烈建议仅将位运算用于处理无符号类型。2、移位运算符①<<和>>两种移位运算符的内置含义是对其运算对象执行基于二进制位的移动操作——首先令左侧运算对象的内容按照右侧
2020-06-17 15:59:56 228
原创 C++Primer4.6&4.7——成员访问运算符和条件运算符
C++Primer4.6&4.7——成员访问运算符和条件运算符1、成员访问运算符①点运算符和箭头运算符都可以访问成员。(1)点运算符获取类对象的一个成员。(2)箭头运算符与点运算符有关,表达式ptr->men等价于(*ptr).men;注意:点运算符的优先级高于解引用符的优先级,所以括号不能省略。②运算对象和运算结果(1)箭头运算符作用的是一个指针类型的运算对象,结果是一个左值;(2)点运算符分两种情况;a、点运算符作用的是左值的运算对象,那么其运算结果就是左值。b、点运算符
2020-06-17 11:03:43 199
原创 C++Primer4.4&4.5——赋值和递增递减运算符
C++Primer4.4&4.5——赋值和递增递减运算符1、赋值运算符(1)赋值运算符的左侧运算对象必须是一个可修改的左值。(2)赋值运算的结果是它的左侧运算对象且是一个左值,结果的类型也是左侧运算对象的类型。(3)允许使用花括号括起来的初始值列表作为赋值语句的右侧运算对象。①若左侧运算对象是内置类型,那么初始值列表最多只能包含一个值,也可以为空。②若左侧运算对象是类类型,根据类内的定义,那么初始值列表可以包含多个值。(4)优先级是很低的。(5)满足右结合律。(6)复合赋值运算符
2020-06-17 10:31:13 220
原创 C++Prime4.2&4.3节——算数、逻辑和关系运算符知识点总结
C++Prime4.2&4.3节——算数、逻辑和关系运算符知识点总结1、算数运算符(1)优先级:下表是按优先级高低排前后运算符用法运算对象求值结果+(一元加法)+expr都为右值都为右值-(一元减法)-expr*expr1 * expr2/expr1 / expr2%expr1% expr2+expr1+exor2-expr1-expr2(2)结合律:所有算数运算符都符合左结合律。(3
2020-06-17 09:43:36 236
原创 C++Primer 表达式:(m/n)*n+m%n解答
C++Primer 表达式:(m/n)*n+m%n解答当m和n都是整数,且n不为0时,表达式(m/n)*n+m%n的求值结果都是m。注意:按一般的数学方法解决对上面这个结论是不成立,但在c++的运算中是成立的,这时跟c++的运算规则是有关的。c++的除法运算规则:当除数不为0时,两个整数相除的商一律向0取整(即将小数部分切除)。如4/3=1,按照一般计算是有小数部分的,但按规则要取整。标题表达式的中心思想:将m相除后所得的整数部分和小数部分经组合运算后再次得到m。①首先对m%n进行分析,得到的是
2020-06-15 10:37:34 1160
原创 C++Primer第4章表达式 4.1节基础
第4章—表达式 4.1节基础1、表达式(1)表达式的定义:表达式至少由一个或多个运算对象组成,对表达式求值将得到一个结果。复杂的表达式由一个运算符或多个运算符和一个运算对象或多个运算对象组成。(2)最简单的表达式:字面值和变量。2、运算符的种类(1)一元运算符:作用于一个运算对象的运算符,取地址符(&),解引用符(*)等。(2)二元运算符:作用于两个运算对象的运算符,如加减乘除运算符(+,-,/)等。(3)三元运算符:作用于三个运算对象的运算符。(4)多元运算符:函数调用是一种特殊的
2020-06-15 09:09:49 201
原创 C++Primer4.33节练习
C++Primer4.33节练习1、题目:someValue?++x,++y:–x,–y根据优先级和结合律对运算对象和运算符进行组合。得到的结果如下((someValue?++x,++y:–x),–y);因为条件运算符(?:)和逗号运算符都规定了运算对象的求值顺序,都是从运算符的左侧运算对象开始计算。在编译器上的程序如下①先设置好someValue的值——true或者false,x和y的值随意设置。②解析表达式,首先根据someValue的值判断条件,这里是true,所以选择的是++x,+
2020-06-12 09:15:20 210
原创 C++Primer第一章难点——1.2节初识输入输出
C++Primer第一章难点——1.2节初识输入输出1、iostream库(1)IO库的作用:因为C++语言本身并未定义任何输入输出的语句,后来程序员添加了一个IO库来提供IO机制。iostream为内置类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。(2)iostream库包含两个基础类型istream类和ostream类,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出(cin从键盘读取字符序列)或
2020-06-11 16:55:53 165
原创 C++Primer第4章 表达式——难点
C++Primer第4章 表达式——难点1、左值和右值(1)表达式的求值结果只有左值和右值两种。(2)当一个对象被用作右值的时候,用的是对象的值(内容)。右值是使用对象的值。(3)当对象被用作左值的时候,用的是对象的身份(在内存中的位置或地址)。左值是使用对象的存储空间难点 对象的值和对象的地址特性对象的值对象的地址含义存储在对象中的值,例如整型的1,字符型的a,某个对象的指针(地址)等存储对象的值的存储空间值类型右值,不允许右值替代左值左值,允许左值替代右值
2020-06-11 11:15:16 237
原创 C++Primer第三章知识总结
C++Primer第三章知识总结1、string和数组的比较(1)string和数组的定义和类型①string类型是可变长的字符序列,是C++标准库类型(是由C++标准库提供的一种程序员定义的类型)。②数组是相同类型对象的容器,是内置的复合类型(内置类型:是语言本身定义的类型),不是程序员定义的类类型。(2)string和数组对begin和end函数的使用①string类里有很多成员函数,其中包括begin和end函数;string对象可以通过点运算符来使用这些函数,假设一个string对象为s
2020-06-09 21:40:41 158
原创 C++Primer3.5节 数组
C++Primer3.5节 数组1、数组的定义(1)数组是存放类型相同的对象的容器,通过指针来访问这些对象,数组的元素数量是确定的。(2)数组是一种复合类型,数组的声明形如a[d],a是数组的名字,d是数组的维度即数组中元素的个数,维度必须是一个常量表达式。2、数组的声明声明的规则(1)默认情况下,类型修饰符从右往左一次绑定;形如①存放指针的数组: int *ptr[10]; //存放10个整型指针的数组(2)特殊情况下,由内向外阅读;形如①int (*parray)[10];
2020-06-08 22:13:56 136
原创 C++Primer3.4节迭代器知识点梳理
C++Primer3.4节迭代器知识点梳理1、迭代器的含义:(1)可能是迭代器概念本身(2)可能是容器定义的迭代器类型(3)可能是指某个迭代器对象。2、迭代器的作用:(1)迭代器类似于指针类型,可以使用迭代器来间接访问string对象的字符和vector对象的元素。(2)迭代器也能从一个元素移动到另外一个元素。3、迭代器的对象:是vector对象中的某个元素的地址或者string对象的某个字符的地址。4、迭代器的类型:(1)一般来说,我们并不清楚也不在意迭代器的类型是什么;(2)但实际
2020-06-04 17:14:35 214
原创 C++Primer3.3节标准库类型vector知识点梳理
C++Primer3.3节标准库类型vector知识点梳理1、标准库类型vector(1)定义:vector是相同类型的对象的集合;vector通常被称为容器;vector是一个类模板而非类型,由vector生成的类型必须包含vector中元素的类型,如:vector。(2)使用的前提:包含vector头文件和使用using来声明。如:#include< vector >using std::vector;(3)语法形式:vector< int> vec;(4)实例化:
2020-06-03 21:36:31 155
原创 C++Primer3.1&3.2标准库类型string知识点梳理
C++Primer3.1&3.2标准库类型string知识点梳理3.1 命令空间的using声明1、使用using声明的作用:安全方便地使用命名空间中的名字。2、具体形式:using namespace::name;3、作用域操作符的含义:编译器应从运算符左侧的名字所示的作用域中寻找右侧那个名字。4、使用规则:(1)每个独立的名字都需要using声明。(2)最好不要使用using namespace std;,因为有时候会编译错误。(3)头文件中不应包含using声明。3.2 标准
2020-06-03 10:15:29 189
原创 C++Primer2.6节自定义数据结构
C++Primer2.6节自定义数据结构数据结构:是互相之间存在关系的数据元素的集合。2.6.1 自定义数据类型1、定义:类是一种数据结构,使用关键字struct定义。具体形式:struct{…};2、类定义的规定:①类内部定义的名字必须唯一,但是可以与类外部定义的名字重复。②类定义时最后要加一个分号。③类体后面可以紧跟变量名以示对该类型对象的定义,所以分号必不可少。但通常类和对象是分开定义的。3、类的数据成员①作用:类的数据成员定义了类对象的具体内容。②定义的形式:定义类数据成员和定义
2020-05-29 11:18:36 197
原创 为什么自定义的类不能进行输入输出操作
在C++Primer2.6节中,书中介绍了当前的类只有数据成员,并没有定义输入输出的操作,所以该类的对象并不能进行输入输出操作。而该类对象的数据成员则可以进行输入输出操作,是因为这些数据成员是被double,unsigned,string类型定义的,而以上这些类型都定义了输入输出操作了吗,那这是怎么定义的呢?iostream库内有四个输入输出对象,>>和<<的意思是只有输入输出对象才能使用这两个符号吗,那输入输出对象要怎么定义呢?...
2020-05-29 09:40:24 469
原创 C++Primer2.5节 处理类型知识梳理
**C++Primer2.5节 处理类型知识梳理 **2.5.1 类型别名1、类型别名:是指给已存在的类型定义另一个名字,使其简单易懂,以便于记忆和使用。2、类型别名定义的形式:①传统的方法使用typedef来定义,例如;typedef int p; //p就是int的别名,可以用来定义int型的变量。typedef int *a;//a就是整型指针的别名,可以用a来定义指向整型对象的指针。②使用别名声明,具体形式:using 别名=已存在的类型;例如:using cn=const int;
2020-05-28 11:28:47 161
原创 C++Primer 设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。
首先是第一句话“设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。”解释:首先用一段程序来表示const int x=100;auto &y=x; //此时x是初始值,y的类型是const int&,也就是一个常量引用。从上面来理解“初始值的顶层常量属性仍然保留”,可以很容易理解到,当定义了类型为auto的引用后,即auto &y=x; 它的初始值x还是一个const int 型的对象,也就是一个顶层的const对象。程序实际运行如下:从上两图
2020-05-28 10:11:37 1440 9
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人