c   primer plus总结_第1页
c   primer plus总结_第2页
c   primer plus总结_第3页
c   primer plus总结_第4页
c   primer plus总结_第5页
已阅读5页,还剩187页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录 目录 1 关于引用这就是说 y 的类型是和 x 一样的。 并且,连修饰符也是一样的。值得一提的是这个表达式如果加上括号的话, 那它代表一个左值,那么此时的 y 就是一个 x 类型的引用了。 不过,decltype 关键字也不能完全解决问题,因为有的时候你希望直接返 回一个表达式,因为函数会自动去计算这个表达式并把这个结果返回给主调函 数,而且这么写比较方便。很显然这个时候你用不着 decltype 关键字,当然你 这个应用场景也无法使用 decltype 关键字。 那该怎么办呢?那就引出下一个议题。 C+是如何确定泛型函数中以表达式作为 return 语句的返回 值的类型的? C+11 为此提出了一个解决方案,那就是使用尾返回类型,具体形式如下 图所示: 函数默认的返回类型是 auto 的,但是它只不过是个占位符而已,为那个真 正的返回类型占个座罢了。然后这个真正的返回类型可以使用 decltype 来判断 出来。如下图所示: 由此看得出来,这个-后的类型才是函数真正的返回类型啊。 C+中一个头文件中通常应该包含哪些内容? 函数的声明、宏定义、常量、结构体声明、类声明、泛型声明、内联函数。 C+中 register 变量存在的意义? 首先一点就是它的存取速度比普通的自动变量要快。另外,C+11 也说这 个就是明确表明你要使用一个自动变量,这是咋回事呢?这是因为有可能同名 的变量是一个外部变量,这又说明了什么呢?我不知道这说明了什么,但是经 过查一些网页的资料,我知道 auto 已经不是自动变量的明确声明了,取而代之 的是 register。再换句话说就是 register 变量一定是自动变量,但是 auto 变量不 一定是自动变量了。 它不能用于全局变量。 当 register 用于局部变量时,就无法再使用解引用操作符语句中的 obj 会随之消亡。但是, 为了捕获异常,obj 的消亡就显得不合理了,所以 C+实际上是复制了一个 obj 给异常机制使用。所以即便 catch 中的参数是个引用也无法避免 COPY 的发生。 另外,这也给使用异常类构造函数直接构造默认对象带来了方便,如下图所示: 为什么在 catch 参数中要使用引用呢? 因为异常类很可能是一整个继承体系,并且父类的指针和引用可以指向子 类,所以你用一个父类的引用作为 catch 参数就可以指向任何异常子类类型, 省事! 如果你非要写很多 catch 的话,那就按照子类在上父类在下的次序安排 catch 快吧,因为这样的话可以特定的 catch 块精确地匹配相应类型。这是在你 能够把握程序可能抛出哪些异常的情况下才使用的。 捕获任何异常的 catch 如下图所示: 上图中的 exception 函数,其实是类 exception 的构造函数,throw 它就会抛 出一个无名的 exception 对象。 测试代码及结果如下: 如上图所示在 catch 中加入 3 个点就能捕获任何异常,所以很多时候 C+ 习惯这样写: 即把 catch()写在最后面,起到一个兜底的作用。如果你很清楚需要使用 的异常类继承体系,那你完全可以用父类的引用来捕获异常,起作用与差不 多,但是一定要记住,使用父类引用是基于动态绑定,你要确保子类中有你想 要的 virtual 函数才行。 C+中的异常类 exception 在这里要说一下,处理异常你可以使用 exception,你也可以使用自定义的 异常类,或者不使用类。但是,你最好使用 exception 类,其方法就是添加头文 件。 总而言之一句话,exception 是所有异常类的父类,所以你写个 catch(exception 才 对。不过,这会与初始化列表模版混淆。C+11 是这样处理的,如果你确实是 直接用大括号来进行容器对象的构造,那它调用的就是接受初始化列表的构造 函数,即,接受一个初始化列表作为参数。 这个初始化列表模版接受隐式类型转换,不过它的转换比较严格,即,列 表中的实参本身可以是某种类型而没有精确度的损失,当然,这是我的理解。 如下图所示: 像这个 5.5 本身就不是整形,它就不能被转换成整形,就会造成编译错误。 这个初始化列表模版主要用于处理大小不定的参数序列,把这个序列作为 整体传参,除此之外没啥用。它也可以被看做是容器,也有 begin 和 end,此外 还要#include 。 此外,initializer_list 允许你整个赋值,但不允许你更改其中的某个元素。 如下图所示: 如图所示,d1 的第一个元素不能被更改,但是 d1 作为一个整体可以被整 体更改,赋值。 Cout 打印浮点型数字的新旧标准的不同 新标准只打印整个数字的前六位,结尾的 0 全都省略,如果那六位中也包 含 0 也省略。它可以使用定点数和科学计数法表示,只有当大于等于 6 次方或 小于等于-5 次方时才使用科学计数法。 旧标准保留到小数点后 6 位,当然这里末尾的 0 全部省略。 Cout 的控制器的概念 什么按十六进制输出、按十进制输出,输出浮点数靠哪边对齐,输出精度 是多少都是由控制器来控制的。 很多控制器是由 iostream 提供的,还有一部分在 iomapip 头文件里面。有 关输入输出格式方面的语法实在是鸡肋,没啥理论性可言。 无论是输入还是输出都是通过置位来标识状态的。 I/O 与异常 一般 I/O 与异常没关系。 Cin 可以调用 exception()函数,如下图所示: 其中这个 exception 函数只与 eofbit、failbit、badbit 有关,如果是正常情况 就返回 goodbit。在流控制过程中,用于控制状态的有 clear 和 setclear 函数,不 过与异常有关的是 clear 函数。如果 clear 检查出 exception 返回的值确实与所涉 及的 3 个位一致,那说明流出现了异常,于是抛出异常,不过在默认情况下 exception 抛出的是 goodbit,即,没有异常。 Exception 可以不接受参数,也可以接受两个以上的参数,通过如下这种方 式: Cin 中的 ignore 函数 Ignore 的原型如下图所示: 这个函数跳过或者丢弃剩下的第一个参数所指定数量的字符,或者丢弃直 到第二个字符所指定位置的所有字符。 C+文件 I/O 它们是通过缓冲区实现的,当然它也是字节流的一种临时性的存储形式。 在默认模式下,你想一个文件写,C+会首先清空该文件内容。 文件对象会自动关闭文件连接,当文件对象生存期结束后。这个操作断开 对象与文件的联系,在断开连接的同时,C+也会把缓冲区中的全部字符推到 文件中去或者从文件中读进来。 Is_open 函数 这个函数用于判断文件是否成功打开。它不仅具有判断文件是否成功打开 的功能,而且能判断是否文件采用了合适的方式被打开。 在 C+有很多方式可以判断文件是否被成功打开,但是这种方式的特别之 处就是上面所说的。 C+打开多个连续文件 C+除了允许为不同的文件建立不同的对象以外还允许一个文件对象重复 使用,对于若干个文件。 文件 I/O 的 clear() 有些 C+代码需要 clear,但更多的不需要,直接 close 就行。 文件 I/O 模式 文件 IO 有很多模式,它们之间可以通过或操作符并列。 C+允许你这样建立文件对象。 C+中二进制文件与文本文件存储方式的不同 存储文本是分别用二进制存储每个文本字符。 二进制存储则是按照数值的每个部分进行存储的,比如说小数部分,指数 部分等。 文本可读可编辑,二进制存储快空间小精确。 以文本形式存储的文件存在一个转换的问题,因为各操作系统在存储文本 时的存储方式不尽相同。 使用文本模式存储二进制数据会引起问题,原因是 double 型数据的中间一 个字节与 ASC 码中的回车符具有相同的位模式,并且它俩对于文本末尾的判定 也不同。 C+中的 write 它可以把一块指定字节数的内存块拷贝到文件中去,一个字节一个字节地 复制,即,原字节是啥样就按照啥样复制过去。 其用法如下图所示: 第一个参数是某变量的地址,第二个参数是要复制的字节数。 C+中的 read 与 read 相对应,它用于从某文件逐字节复制到到地址上去。其用法如下图 所示: 当 read 用于 class,并且 class 不能含有 virtual 函数。如果 class 含有 virtual 函数,那么 class 中必须包含指向 virtual table 的指针,指针的值固然不会变, 但是 virtual table 每次不一定一样,所以这就会造成 read 过来的 class 无法正常 工作。 在这里要说明一点,一个 string 对象本身并不是字符串,只是一个指针而 不是数据,所以每当使用 read 或者 write 再次复制同一 string 对象的时候 string 指针所指之处就不一定是原数据了。 C+中文件的随机存取 即,定位到文件中的任意位置。由于文件操作是通过缓冲区来实现的,因 此随机存取的指针实际上是作用在输入和输出缓冲区上面。 涉及到随机存取的函数只有两个 seekg 和 seekp,前者用于操作输入文件指 针,后者用于操作输出文件指针。 Seekg 用法如下所示: 很显然这是在第二个参数指定位置进行偏移操作。 Seekg 还可有如下用法: 这个用法是把文件指针定位在文件中的某位置上,因为第一个 byte 被标记 为 0,所以实际上指向了文件中从开头开始的第 113 个字节。 Tellg 函数和 tellp 函数 这俩函数用于指示当前文件指针的位置,其位置是距离文件开始的偏移量, 单位是 byte。 Tellg 用于输入流,而 tellp 则用于输出流。 内部格式化 程序与 string 对象之间也可以进行 I/O 操作,其接口与正常的 I/O 字节流一 样。Sstream 用于支持 string 对象与程序之间的字节流。因为 sstream 继承自 ostream 和 istream。 Sstream 定义了一个 ostringstream,它继承自 ostream,你可以对 ostringstream 对象进行读写。Ostringstream 对象可以通过 str()函数转换成 string 对象,不过 str()一旦被使用 ostringstream 对象就无法写。 Istringstream 允许你通过 istream 方法从 istringstream 对象读取数据,并且 istringstream 还可以通过 string 对象进行初始化。如下图所示: 总结一句话就是 istringstream 和 ostringstream 能处理 string 内部单个字符的, 它们提供了更细粒度的操作。 C+11 中的 初始化 它可以防止数值被截断,比如说你把一个 double 赋给了一个 int 必然会出 现 double 被截断的问题, 不允许此现象出现,它阻止此转换的发生。但是这 一原则并不是仅仅根据类型来判断的,它是根据类型中实际的数据来判断的, 比如说 double 的 1 就可以转换成 char 的 1,因为两者无需截断, 1 所占用的位 数在 char 允许范围之内。 C+11 中的 auto 它已经不再是一种存储类型了,而是一种类型的占位符,或者说类型的智 能判断器,它会根据右值的类型自动判断自身的类型,即,自适应类型。 C+11 中的新容器方法 Begin 和 end 是 STL 中旧有的方法,C+11 新提供了才 cbegin 和 cend,它 们对待它们所指的元素为 const 常量,这就是在 begin 和 end 的前面添加了个 c 的缘故。 Rbegin 和 rend 中的 r 代表的是 reverse 的意思,即,逆向。因此 rend 返回 的是第一个元素,而 rbegin 返回的是最后一个元素。而 crbegin 和 crend 则是在 它们的基础上加上了 const,在用法上也是把首末元素当做 const 常量来看待。 C+11 中的右值引用 显而易见就是右值的别名。在 C+中左值和右值的区别就在于左值是一个 有地址的变量,而右值是一个单纯的值。C+11 用&来表示右值的别名。如下 图所示: 第 3 句中 13 只不过是个数值,但是 r1 却代表了 13。 但是右值引用有个性质,比如第三行,当你把 13 赋给 r1,r1 是可被解引用 的。如下图所示: 右值引用是为了 move 语法而生的。 move 语法 move 存在的必要性。 当你处于某种目的需要产生临时对象时,系统会承担对象的构造、复制、 析构等一切开销,但是临时对象转眼即逝。但是如果分析整个过程,你会发现 同样的数据只不过是从一个地方移动到了另一个地方,那么为什么不保持数据 不动而只改动数据的所属呢?于是 C+11 产生了 MOVE 语法。 C+11 引入了新的 MOVE COPY 构造函数。它以右值引用作为参数,它只 负责调整数据的占有权,这有别于传统的 COPY 构造函数。另外,这个右值引 用不能是 const 的。 强迫使用 move 语法 这是在把 move 构造函数和 move 拷贝赋值操作符应用在左值时候要用到的, 这时候需要把左值转换成右值才行。 你可以选择使用 static_cast 转换,也可以选择使用 utility 头文件中提供的 move()函数,如下图所示: One 原来是左值,经过 move 转换以后就变成了右值就可以应用右值赋值 操作符。不过这是在你的类中已经声明了右值拷贝操作符的前提下。 在默认情况下 C+会提供一个默认的右值构造函数,这如同如果你什么都 不写 C+会提供一个默认构造函数一样。此外,C+还提供默认的右值拷贝赋 值操作符和右值拷贝构造函数。 C+11 中的默认函数控制 C+11 允许你有选择性地使用或不使用默认的函数实现。这是通过 default 和 delete 实现的,比如说你想使用默认的构造函数的实现,你可以如下做: 它代表你想使用 C+默认的构造函数代码,与之相反,看下图: 它代表你不想使用该函数,即,你不能使用拷贝赋值操作符了。 须知 default 只能用于编译器能自动生成代码的函数,这些函数很有限就那 几个。比如说,构造函数、COPY 构造函数、COPY 赋值操作符等。 Delete 则可以用于任何成员函数,它的作用是禁用某个函数,而不是删除 某个函数。 如图所示,如果没有 redo(int)的话,你向 redo 输入一个 int 实参,该实参会 被自动转换成 double 从而调用 redo(double)。但是当你使用 delete 禁用 redo(int) 时,你再重复同一操作,会出现错误,无可用函数。这是因为编译器知道能用 的只有 redo(int),但是它被禁用了,而压根不会去考虑 redo(double)。这就防止 了隐式类型转换。 C+11 中的代理构造函数 它用于定义正常构造函数中那些公共的,重复的代码。表面上看起来代理 构造函数和普通的构造函数并无区别,但是它可以被用于形参初始化列表之中。 红框所示的就是代理构造函数,它像正常构造函数一样拥有正常的形参初 始化列表。没有被红框标记的都是正常的构造函数,它们可以把代理构造函数 放在形参初始化列表所在的位置上。但是,代理构造函数并不仅仅起形参初始 化列表的作用,它负责还完成普通构造函数的代码实现。换句话说,其他的构 造函数可以实现独有的代码。 C+11 允许你继承父类构造函数 就是说它允许你在子类中使用 using 把父类的构造函数当成自己的成员函 数,但这不包括父类的 COPY 构造函数和 MOVE 构造函数。 它的用法如上图所示。当子类自身的构造函数没有合适的,但是父类的构 造函数的合适,那么这时 C+就会自动调用父类的构造函数。 但是,记住一点,那毕竟是父类的构造函数,因此它只能初始化父类的成 员,所以如果你想子类父类成员一起初始化,那还是用形参初始化列表吧,就 像下面这样。 C+11 允许你显式重写父类的 virtual 函数 该关键字指示某子类函数必须重写父类 virtual 同名函数,不重写就会报错。 这其实是显式地告诉作者子类函数是从父类的某个 virtual 函数重写而来的。如 下图所示: 那这有什么用呢?你的目的是想重写父类的 virtual 函数,但是现在由于你 子类的同名函数的原型不同,那么你实际做的其实是覆盖。为了不让你把重写 搞成覆盖,override 以一种显式地方式指示你重写父类 virtual 函数,防止你出 错。 而 final 的作用却与此不同,它不同于 JAVA 中的 final。JAVA 中的 final 相当于 C+中的 static,而在这里 final 的作用是禁止父类的 virtual 函数被子类 重写。用法如下所示: 实例如下: C+11 中的兰博达(LAMBDA)表达式 它像是一个比较复杂的表达式,但是完成的功能却像一个函数,它主要用 于 STL 计算。具体的作用如同函数对象一样,即把整个函数作为一个参数传到 某个 STL 算法中去参与计算,当然在这里应该是表达式。 上图上边的是 lambda 下面的是普通的函数。将下面函数的函数名和返回值 一起用中括号 替换就成了 lambda。Lambda 往往只包含一条 return 语句,而且 它还能根据 return 语句自动判断出返回值类型,当然如果你什么都不写,那肯 定是 void,不过这只是在整个 lambda 只包含一条 return 语句的前提下。 如果 lambda 函数体内不只包含一条 return 语句的话,你就需要手动指定了。 如下图所示: Lambda 的必要性 1、方便使用。因为它的定义就在所用之处,这不像函数一样。函数的一定 往往在别处,如果你想修改实现代码,你就必须到别处去修改,这比较麻烦。 2、简洁。它不像类那么多代码,它代码很少。另外,它还可以用别名代替, 如下图所示: 那么以后你就可以使用别名了。 你也可以把它当成普通函数使用,如下图所示: 它还可以放在某函数体内。 3,它可以被 inline。因为一个函数一旦被取地址,它就不会被 inline。这 个理由我不太理解。 4、它还有其他功能。Lambda 前边的是一个变量列表,有点像形参列表 的样子。在 中当你输入一个变量名时,相当于值传递;你输入一个&name 时, 相当于传递一个引用;你只输入一个&,那么所有变量都是传递引用;你只输 入一个= ,那么传递的都是值。 这些也可以混搭。比如说ted,&ed 代表 ted 是值传递,而 ed 则传递的是 引用,& ,ted代表除了 ted 是值传递,其他传递的都是引用。=,&ed代表除 了 ed 是引用传递以外,其他的都是值传递。 一个例子如下所示: 其实把 lambda 函数教程 lambda 表达式更贴切,因为它的确是个表达式。 封装器 WRAPPERS 封装器有很多种,它实质上是个模版。 书中提出了一个概念,叫 callable 类型,啥叫 callable 类型?说实话我也不 知道,但是可以猜一猜。Callable 英文的意思是随时可偿还的,随时可支付的。 它的一个典型代表就是把函数的返回值赋给某个变量的情况。如下图所示: Callable 可以被称为可回收类型,那就这样吧。 书中举的例子是,一个模版接受了函数对象或者函数指针再或者 lambda 表 达式作为参数,这个参数有些特殊,因为它看起来有点像函数,那就直接叫它 函数吧,这个函数接收相同类型的参数并且返回相同类型的参数。模版每接受 一次这样的函数参数就实例化一次,且各实例各不相同,但是这是没有必要的, 因为函数参数的参数和返回值都是同样的类型,只用一个实例就够了,那么多 实例实在是浪费,且低效。 像这样的函数参数就叫做 callable 参数,如下图红框所示: 书中是用函数封装器解决这一问题的。 如上图所示,这是一个函数封装器,它生成了一个对象 fdci,类型就是 double(char,int)其中,char 和 int 是参数类型,double 是返回值类型。 然后每个函数封装器对象指向一个或者是函数或者函数对象或者 lambda 表 达式。这样的话像下图所示的模版实例就是同一个了。 但是,上述一个函数对应一个函数封装器对象的写法比较麻烦,于是产生 了下面的写法。 1、函数封装器可以直接接收实参,这个参数就是函数、函数指针、函数对 象或者 LAMBDA 表达式。 2、你也可以直接在函数模版的类型参数位置上放置模版函数封装器类型的 参数。如下图所示: 由上图可见这俩类型是相同的。 另外,使用函数封装器必须要引入头文件 functional。 C+11 中可变(Variadic)参数模版 类似于可变参数列表,它为函数模版和类模版提供了一种可接受多个参数 的途径,它可以使函数接受任意数量任何类型的参数。 这个可变参数模版,有 4 个关键因素:1、模版参数包;2、函数参数包; 3、解包;4、递归。 它把模版的类型与参数分开来考虑,如下图所示: T 是模版的参数列表,而 value 则被当做函数的参数列表来看待。当你实例 化一个函数模版,就是向模版传一个实参时,实参的类型实例化了 T,实参的 值实例化了 value。 模版的可变参数列表语法如下所示: 这个感觉就像在原来的模版参数写法上的 typename 后面加上三个点,又因 为此时 Args 代表了函数参数的类型,此时也要在 Args 后面加上三个点。此时 的 Args 被称为类型包,而 args 被称为参数包,当然具体的名字可以随便取。 你一旦完成了这个可变参数列表的模版,就可以像下图这样使用它: 解包是指什么意思呢?你通过一个可变参数列表把一大堆的参数传进来, 但是你如果想对这个参数列表中的某个参数进行操作时该怎么指示这个参数呢, 那就需要解包。 这里 show_list1 是个迭代的过程,通过在函数内 show_list1 的参数 args 后 面加上三个点就可以把参数列表整体传进来。但是这会造成一个无限递归,所 以这个不好。 因此该技术提出了一种解决办法,那就是每次迭代都处理第一个参数,如 此往复总有那么一个时刻会把参数处理完。那么它的处理方式如下所示: 实例如下: 在 main 函数中的使用方法如下所示: 但是如上面的声明式所示,该函数模版使用的是值传递,这对于大型的参 数而言效率太低,于是该可以使用 const 修饰符在参数声明上。 C+11 中的同步编程 这主要是为了迎合现在多线程编程的时代发展而设计的。简而言之就是 C+的多线程处理机制 Thread_local 用于声明具有线程生存期的变量,即随着线程的消亡而消亡。 原子操作库在 atomic 头文件中。 其他支持多线程的库包括 thread、mutex、condition_variable、future 头文件。 C+11 提供的其他库 Random 头文件提供了比 rand 功能更加丰富的随机数产生器,包括各种进 制。 Chrono 头文件处理生存期。 Tuple 头文件支持 tuple 模版,它是一种 pair 的产生器。 Ratio 头文件支持有理数的运算和显示,它支持用最宽的整形数表示有理数 的整数和小数部分。 Regex 头文件支持正则表达式,它允许你选择喜欢的正则表达式种类。 低级编程 相对于高级编程而言,低级编程更加依赖于硬件,它往往指位和字节级别 的编程,主要应用于嵌入式编程,也可用来提升程序效能。 POD(Plain Old Data),简单的旧数据,指标量、没有构造函数的旧式结构 体、基类、私有数据、虚拟函数等。POD 在以字节为单位进行复制这方面来说 是安全的。C+11 可以把应用旧标准 C+98 而开发出来的程序去除一些限制但 仍然保留 POD 特性以便于以字节进行复制。 共用体也发生了变化。C+11 允许共用体带有构造函数和析构函数,在其 他方面也添加了新的限制,比如说不允许虚拟函数。共用体经常用于最小化内 存占用。 C+11 中的内存对齐。alignof 操作符提供了对某种类型在内存对齐方面的 说明。Alignas 可以用于控制内存对齐。 Constexpr 机制允许编译器把一个编译期表达式计算成为一个常量值。在低 级编程方面这个机制允许 const 量存储在只读内存区,这一点在嵌入式编程中 尤其有用。无论是不是 const 变量,只要这个变量在运行期被初始化的,都存 储在内存的随机存储区中。 C 语言中的 stdint.h 和 C+中的 cstdint 支持扩展类型。 C+11 支持二进制标签,这个标签可以通过标签操作符转换成一个整型值。 C+11 提供了 static_assert 用于测试编译期表达式的真假,这类似于 assert,但与之不同,assert 用于判断运行期的表达式。 Static_assert 主要用于简 化编译期发生的模版的实例的调试工作。 C+11 还支持元编程。关于这一点 Effective C+中曾提过模版元编程。 Boost 中的 lexical_cast 它提供了一种将数值转换成字符串的方式,它的用法类似于 static_cast,如 下图所示: 但是它不提供对数值的精确度控制,像浮点数的小数部分。当然你也可以 用 lexical_cast 把字符串转换成数字,但前提是这个字符串是数字字符串。 高位存储(Big Endian)和低位存储(Little Endian) INTER 使用的低位存储,其他处理器一般使用高位存储。所谓低位存储就 是内存中的高位存储的是数字的低位,内存低位存储的是数字的高位。所谓高 位存储是指内存高位存储的是数字的高位,内存低位存储的是数字的低位。 比如说 0Xabcd,在低位存储中就是 0xcd,0xab,而在高位存储中则是 0xab,0xcd。 C+保留字 C+中前面有俩下划线或者单下划线后面跟大写英文字母的名称可能用于 任何用途,把前面有一个下划线用于全局变量。 所以,你在定义变量名字的时候前面不要带有下划线。 C+函数签名的概念 Function signature 意为函数签名,它等于函数名 +形参列表。 移位操作符 都是移位操作符用于位操作,须知这俩操作符都是二元操作符,右 边的是移动的位数,对于左移而言,它移了几位就相当于乘了 2 的几次方。但 是对于右移而言补位是 0 的话,就相当于乘了 2 的负几次方。 C+位操作 &是按位与,是按位异或,所以 15&4 相当于 1111&0100=0100=4,154=11110100=1011=11,所以由此可见 4 所在的位置虽 然是个整形,但是它实际上代表的是二进制数的 1 的位置,比如说 4 代表 2 的 2 次方,即第 2+1 个位置。而位运算符左边的是正常的整数。当然其实这两边 都可以转换成普通的二进制数字然后逐位进行位运算。 在本书中 P1240 内容讲的是位运算的技巧。 C+中指向成员变量的指针 它用类对象或者指针调用该指针,从而间接调用类成员。它并不是说把指 针作为类成员,它是一种在类外声明的用于指向类内部成员的特殊指针。 如上图所示 inches 是 Example 的类成员,那么如果你想声明指向 Example 成员的指针就必须把指针的类型限定为 Example,就上图那样声明。它的有效 与否是以对象或者类对象指针有效为前提的。 同一个指针可以改变指向。 其使用方法如下所示: 你也可以声明一个指向类成员函数的指针,并像下图这样使用它: C+11 中的 alignof Alignof 用于测试某种类型的数据在某种系统中的对齐方式,即,它在内存 中的对齐方式最少占用多少字节,现在姑且这个字节数命名为 T。那么该类型 的变量在内存中所占用的字节数肯定是 T 的整数倍。 C+11 中的 noexcept 它有俩用途。 1、表示某函数不抛出异常。2、它可以作为一个单目运算符,它以一个表 达式为参数,并在表达式不可能抛出异常时返回 TRUE,否则返回 FALSE。关 于第二种用法,请看下图: 在这里 halt 是不可能抛出异常的,而 hilt 可能抛出异常。那么如果你用 noexcept(hil

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论