c++
文章平均质量分 62
eyetired
这个作者很懒,什么都没留下…
展开
-
C++语言99个常见编程错误 常见错误24:晦涩难懂的operator->
常见错误24:晦涩难懂的operator-> 内建的operator->是二元的,左操作数是一个指针,右操作数是一个class成员的名字,而重载版本的operator->则是一元的。 请注意,operator->的调用序列的触发(activation)总是包含operator->之定义的对象静态决定的,而且该调用序列总是终结于返回指向class对象的内建指针的调用...原创 2018-05-25 18:25:19 · 715 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误83:未能区分强聚合和弱聚合
常见错误83:未能区分强聚合和弱聚合 单靠C++语言本身无法区分强聚合关系(aggregation)或弱聚合关系(acquaintance)。而未能区分就会导致各式各样的软件缺陷,包括内存泄漏和别名问题。 抽象数据类型的用户一般都没有检视其实现的权限,因为这样的权限一旦开放就容易造成数据隐藏的破坏,还容易造成对特定实现的相关性。 直接使用C++代码来指定拥有权的有无是做不到的,我们只能转而依...原创 2018-05-28 18:44:15 · 545 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误88:对模板化的复制操作的认识误区
常见错误88:对模板化的复制操作的认识误区 对于模板成员函数的一个普通用途是用于实现构造函数。很多标准库中的容器组件都会有个模板化的构造函数,这样就允许使用一个元素序列来初始化该容器: 模板化的构造函数的运用使得容器能够接受任意类型的输入序列,若非如此,容器类型之实用性也就大打折扣。而标准库中的auto_ptr模板组件亦使用模板成员函数: 模板成员函数绝不会为完成赋值操作而实例化。money...原创 2018-05-29 19:23:41 · 229 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误89:持有class对象的数组
常见错误89:持有class对象的数组 当心持有class对象的数组,尤其是持有基类对象的数组。 数组的索引操作只是指针算术的缩写,因此array[i]等价于*(array+i)。不幸的是,编译器会基于“array指针指向有B对象的数组”的前提做指针的加法运算。如果派生对象具有更大的尺寸,或迥异的内存布局,那么索引操作将取得错误的地址。 用于访问持有基类对象的数组指针运算通常不能用于访问持有...原创 2018-05-29 19:37:11 · 292 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误90:非适当的容器类型值可替换性
常见错误90:非适当的容器类型值可替换性 对C++软件工程师而言,STL容器组件应该是容器应用的首先。不过,STL容器组件并不能满足所有的需求,因为它们为了发挥出强大的功能,不得不设置一定的限制。有关STL容器组件的一个有意思的事实是:由于它们都是以模板实现的,其结构和行为诸多方面都是编译时就决定了的。这种特点带来了短小精悍的实现,在编译时精确地转化成恰好合用的静态执行码。 但是,并不一定在编...原创 2018-05-30 08:50:51 · 218 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 变量的声明的语法
对“变量声明”的解释向来很模糊且自相矛盾,而理解它准确的含义对于正确的理解定义和阅读程序十分重要。变量声明告知编译器变量的外表特征。好像对编译器说:"我知道你以前没有看到过这名字,但我保证它一定在某个地方,它是X类型的变量。" 函数声明包括函数类型(返回值类型)、函数名、参数列表和一个分号。这些信息使得编译器足以认出它是一个函数声明并可识别出这个函数的外部特征。由此推断,变量声明应该是类型标...原创 2018-05-31 16:57:05 · 204 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 "Hello,World"
通过”<<“操作符把一系列的参数传递给cout对象。然后cout对象按从左向右的顺序将参数打印出来。输入输出流函数endl表示一行结束并在行末加上一个换行符。使用输入输出流,可将一系列的参数按顺序排起来,使类易于使用。 在C语言中,用双引号括起来的正文称为"字符串(string)"。标准的C++类库有一个专门用于正文处理的功能强大的string类,所以我们将使用更精确的属于”字...原创 2018-05-31 18:04:58 · 148 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 关于输入输出流
输出另外的格式,对于数值的输出格式有十进制、八进制、十六进制。 输入输出流利用iostream操作符,可以将数字分别以十进制、八进制和十六进制打印出来(操作符不进行打印操作,但它改变输出流的状态)。浮点数的格式由编译器自动确定。此外,通过(显式)类型转换(cast),任何字符都能转换成char类型(char是保存单字符的数据类型),发送到流对象。显式类型转换看起来像函数调用:char()带上字...原创 2018-06-01 23:13:34 · 141 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 字符数组的拼接
C预处理器的一个重要功能就是可以进行字符数组的拼接(character array concatenation)。如果两个加引号的字符数组邻接,并且它们之间没有标点,编译器就会把这些字符数组连接成单个字符数组。当代码lie表宽度有限制时,字符数组的拼接就特别有用。//: C02:Concat.cpp// From Thinking in C++, 2nd Edition// Availab...原创 2018-06-02 10:53:45 · 712 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 读取输入数据
输入输出流类提供了读取输入的功能。用来完成标准输入功能的对象是cin(代表"consoleinput",控制台输入)。con通常是指从控制台输入,但这种输入可以重定向来自其他输入源。 和cin一起使用的输入输出流操作符是“>>”。这个操作符接受与参数类型相同的输入。例如,如果设定了一个整形参数,它将等待从控制台传来的一个整数。//: C02:Numconv.cpp// From T...原创 2018-06-02 12:18:33 · 105 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误71:对非虚(成员)函数的遮掩
常见错误71:对非虚(成员)函数的遮掩 非虚(成员)函数指定了基类为根的继承谱系(或子谱系)中的不变量。做派生类设计的软件工程师不能改写非虚(成员)函数,虽然能,但不应该遮掩它们。 所谓一个class对象具有多态特质,是指它只有一个实现体,却兼具多种类型。以我们对抽象数据类型的理解,可以知道类型就是指一组操作,这些操作以该类型中可访问的接口表示。 遮掩基类类型中的非虚(成员)函数给继承谱系的...原创 2018-05-28 18:21:35 · 348 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误69:类型特征码
常见错误69:类型特征码 在面向对象思想中,对象的类型由其行为决定。 在C++语言中,我们绝对不会在采用面向对象思想的代码片段中依类型特征码进行逻辑分派(switch on type codes)。 对象的类型一经初始化指定,便矢志不渝。 如果在一些罕见的设计中确实要求严格类型特征码的话,最好遵循两个实现方面的指导原则。首先,不要以数据成员的形式存储特征码。使用虚函数代替它。因为其效果是将...原创 2018-05-28 17:19:44 · 559 阅读 · 0 评论 -
C++语言99个常见编程错误 26使用#define定义的伪函数(函数宏)
26使用#define定义的伪函数(函数宏) C语言中,#define经常被用来定义伪函数,避免函数调用的开销带来的效率的重要性被置于安全性之上。 在C++语言中,inline函数几乎在任何时候都是相对于伪函数而言更佳的选择。 宏被用作伪函数时,仍然饱受将其用于显式常量时所遭遇的作用域问题之苦。 execbump.cpp#include <iostream>// Unco...原创 2018-05-25 19:06:41 · 674 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误28:断言(assert宏)的副作用
常见错误28:断言(assert宏) 的副作用#define有很多种用法,定义在<cassert>中的assert有好处,鼓励多用--前提是用好但问题就在于能不能用好它。myassert.h#ifndef MYASSERT_H#define MYASSERT_H#include <iostream>// undefine standard assert so w...原创 2018-05-26 16:46:45 · 721 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误32:对以指涉物为指向常量的指针类型的类型为目标类型的类型转换的认识误区
常见错误32:对以指涉物为指向常量的指针类型的类型为目标类型的类型转换的认识误区 对目标类型为指涉物为常量的指针类型的类型的类型转换适应的令热愉悦的平凡情形对于目标类型为指涉物为指向常量的指针类型的(包括指涉级数多于2级,且最终指涉物为常量的指针类型的)类型转换而言就失灵了。考虑把一个指涉物为指向char类型(非常量)的指针转换成一个指涉物为指向char常量类型的指针的尝试:使用引用类型或标准库...原创 2018-05-26 18:04:33 · 176 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 字符串简介
虽然字符数组很有用,但它有一定的限制。简单地说它就是存放在内存的一组字符,如果要用它做什么事情,必须处理所有细节。例如,引号内字符数组的大小在编译时就确定了。如果想在这样的字符数组中添增字符,需要了解很多有关的知识(包括动态内存管理,字符数组的拷贝、连接等),才能完成添加任务。这正是我们所希望的有一种对象能替我们完成的事。 标准的C++string类就是设计用来处理(并隐藏)对字符数组的低级...原创 2018-06-02 23:41:53 · 115 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 文件的读写
在C语言中,完成打开和处理文件这样复杂的操作,需要对C语言有较深的了解。然而C++语言的iostream库提供了一种简单的方法来处理文件。 为了读而打开文件,要创建一个ifstream对象,它的用法与cin相同,为了写而打开文件,要创建一个ofstream对象,用法与cout相同。一旦打开一个文件,就可以像处理其他iostream对象那样对它进行读写,非常简单。 在iostream库中,一...原创 2018-06-03 09:26:38 · 133 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误47:赋值与初始化混淆
常见错误47:赋值与初始化混淆 从技术视角看去,赋值和初始化没啥关系。它们之间泾渭分明,用在不同的场合。所谓初始化,就是把一段生鲜存储(raw storage)变成一个对象的过程。对于一个class对象来说,这会涵盖搭建一系列内部机能,以支持虚函数和虚基类,运行时类型信息以及其他类型相关信息。而赋值,则是在一个有着合适定义的对象的某种状态上所做的一个变换,是该对象处于一个新的状态,赋值操作不触及...原创 2018-05-27 17:44:13 · 341 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误53:对于虚基类(子对象)进行默认初始化
常见错误53:对于虚基类(子对象)进行默认初始化 (一个class对象中的)虚基类的子对象和非虚基类的子对象,布局是不同的。非虚基类型子对象的典型布局会如同它是派生类类型一个普通数据成员一样。 而虚基类类型子对象仅在对象中出现一次,哪怕它在构成完整对象的class阶栅(lattice即继承谱系)中出现多次也不例外。 典型地,存放虚基类子对象的共享存储是附在完整对象之后的。 只有景深派生类才...原创 2018-05-27 18:29:09 · 363 阅读 · 1 评论 -
C++语言99个常见编程错误 常见错误55:运行期静态初始化次序
常见错误55:运行期静态初始化次序 所有C++代码中的静态数据都会被访问之前完成初始化。大多数情况下,此种初始化工作都会完成与二进制镜像(program image)已加载,而代码的执行还未开始的时刻。如果未给它们指定初始化物,它们就会被以全零模式(all zeros)初始化。 最好的预防运行期静态初始化困境的办法就是尽可能地减少外部链接的变量,包括静态的class数据成员。预防运行期静态初始化...原创 2018-05-27 18:48:01 · 404 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误56:直接与复制初始化
常见错误56:直接与复制初始化 标准允许编译器执行某种代码变换,去除这个临时对象的初始化和复制构造函数的调用,以产生和直接初始化一模一样的目标码。这是一个不平凡的优化,因为代码的实际行为改变了。大多数C++编译都会做代码变换,但标准并没有强制要求这么做。 代码变换需要了解编译器是在校验过原始代码的语义之后才实施变换的。 为了让代码更简单,更具可移植性,一个较佳的做法是在class对象,或“有...原创 2018-05-28 08:56:22 · 351 阅读 · 0 评论 -
C++语言99个常见编程错误 常见错误67:未能采用RAII(资源获取即初始化)习惯用法
常见错误67:未能采用RAII(资源获取即初始化)习惯用法 很多新入行的C++软件工程师都体会不到构造函数和析构函数美妙绝伦的对称性。绝大多数此类软件工程师都活在语言为他们准备的温室中,不用为指针和(手动)内存管理操心。安全可靠。难得糊涂。所谓编程也只不过就是精确地按照语言设计者替人们一手安排好的路子亦步亦趋。 可喜的是,C++语言十分重视一线的实践者,为语言的用法提供了很大的灵活性。 RA...原创 2018-05-28 16:20:44 · 245 阅读 · 0 评论 -
C++编程思想 第1卷 第2章 调用其它程序
在Unix shell脚本或DOS批处理文件中,石油标准输入输出读写的程序。用标准的C语言system()函数,C/C++程序可调用任何程序。system()函数在头文件<cstdlib>中已声明://: C02:CallHello.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEcke...原创 2018-06-02 12:31:34 · 147 阅读 · 0 评论