随笔分类 -  02_C++&C

摘要:C++的创始人认为C语言的类型转换运算符太过于松散。他采取了更加严格的限制允许的类型转换。并添加了4个类型转换运算符。 这部分特性比较高阶,我把它归于奇技淫巧的范畴。这里简单介绍一下,以后实际有用到再深入研究。 struct Data { double data[200]; }; struct Ju 阅读全文
posted @ 2019-03-02 00:04 Grooovvve 阅读(333) 评论(0) 推荐(0)
摘要:一、先讨论异常被引发后,可能导致的问题 意外异常: 如果它是在带异常规范的函数中引发的,则必须与规范列表中的某种异常匹配,否则为意外异常。在默认情况下,这将导致程序异常终止(虽然C++11摒弃了异常规范,但仍支持它,且有些现有的代码使用了它)。 未捕获异常: 如果异常不是在函数中引发的,则必须捕获它 阅读全文
posted @ 2019-02-26 09:01 Grooovvve 阅读(386) 评论(0) 推荐(0)
摘要:异常、类和继承以三种方式相互关联。 首先,可以像标准C++库所做的那样,从一个异常类派生出另一个。 其次,可以在类定义中嵌套异常类声明来组合异常。 第三,这种嵌套声明本身可以被继承,还可以作为基类。 接下来用一个例子进行相关的探索; 以下这个头文件声明了一个Sales类,它用于存储一个年份以及一个包 阅读全文
posted @ 2019-02-26 09:00 Grooovvve 阅读(212) 评论(0) 推荐(0)
摘要:C++异常的主要目的是为了设计容错程序提供语言级支持。 即异常使得在程序设计中包含错误处理功能更加容易,以免事后采取一些严格的错误处理方式。 异常的灵活性和相对方便性激励着程序员在条件允许的情况下在程序设计中加入错误处理功能。 总之,异常是这样一种特性,类似于类,可以改变你的编程方式。 较新的C++ 阅读全文
posted @ 2019-02-26 08:59 Grooovvve 阅读(488) 评论(0) 推荐(0)
摘要:虽然throw-catch机制类似于函数参数和函数返回机制,但是还是有些不同之处。 其中之一是函数fun()中的返回语句将控制权返回到调用fun()的函数A中, 但throw语句将控制权向上返回到第一个这样的函数:包含能够捕获相应异常的try-catch组合。 另一个不同之处是,引发异常时,编译器总 阅读全文
posted @ 2019-02-26 08:58 Grooovvve 阅读(193) 评论(0) 推荐(0)
摘要:异常规范 异常规范的理念看似有前途,但实际的使用效果并不好。 忽视异常规范之前,您至少应该知道它是什么样的,如下所示: double harm(double a) throw(bad_thing); //may throw bad_thing exception double harm(double 阅读全文
posted @ 2019-02-26 08:57 Grooovvve 阅读(745) 评论(0) 推荐(0)
摘要:通常,引发异常的函数将传递一个对象。这样做的重要优点之一就是,可以利用不同的异常类型来区分不同的函数在不同的情况下引发的异常。 对象可以携带信息,程序员可以根据这些信息来确定异常的原因。 同时,catch块可以根据这些信息来决定采取什么样的措施。 下面是针对函数引发的异常而提供的一种设计: 可以将b 阅读全文
posted @ 2019-02-26 08:56 Grooovvve 阅读(252) 评论(0) 推荐(0)
摘要:下面介绍如何使用异常机制来处理错误。 C++异常是对程序运行过程中发生的异常情况的一种响应。 异常提供了将控制权从程序的一部分传递到另一部分的途径。 对异常的处理有3个组成部分: 1)引发异常 throw 2)使用处理程序捕获异常 catch 3)使用try块。 try 程序在出现问题时将引发异常, 阅读全文
posted @ 2019-02-26 08:55 Grooovvve 阅读(326) 评论(0) 推荐(0)
摘要:一种比异常终止更灵活的办法是,使用函数的返回值来指出问题。 例如,ostream类的get(void)成员通常返回下一个输入字符的ASCII码,但到达文件尾时,将返回EOF。 对hmean()来说,这种方法不管用。任何数值都是有效的返回值,因此不存在可以指出问题的特殊值。 在这种情况下,可以使用指针 阅读全文
posted @ 2019-02-26 08:54 Grooovvve 阅读(983) 评论(0) 推荐(0)
摘要:异常是相对较新的C++功能,有些老式编译器可能没有实现。另外有些编译器可能默认关闭这一特性,需要使用编译器选项来打开它。 这里先讨论一个基本问题: 2.0 * x * y / (x+y) 如果y是x的负值,则上述公式将导致被零除。这是一种不允许的运算。很多新式编译器通过生产一个表示无穷大的特殊浮点值 阅读全文
posted @ 2019-02-26 08:53 Grooovvve 阅读(960) 评论(0) 推荐(0)
摘要:编译器生成的成员函数 编译器会自动生成一些公有的成员函数——特殊成员函数。 1、 默认构造函数 提供构造函数的动机之一是确保对象总能被正确地初始化。如果类包含指针成员,则必须初始化这些成员。最好提供一个显式默认构造函数,将所有的类数据成员都初始化为合理的值。 如果定义了某种构造函数,编译器将不会定义 阅读全文
posted @ 2019-02-23 12:49 Grooovvve 阅读(195) 评论(0) 推荐(0)
摘要:如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现?这个问题的答案取决于派生类的属性。如果派生类也使用动态内存分配,那就需要注意学习新的小技巧。 派生类不适用new //Base Class Using DMA class baseDMA { private: char 阅读全文
posted @ 2019-02-23 12:47 Grooovvve 阅读(502) 评论(0) 推荐(0)
摘要:abstract base class,ABC 抽象基类 有时候is-a规则并不像看上去那么简单,例如圆和椭圆的关系。圆是椭圆的特殊情况。椭圆可以派生出圆。但是椭圆的数据成员及方法对于圆来说是信息冗余。圆类继承椭圆类会显得很繁琐。 如果把圆和椭圆分开定义,这种方法效率不高,因为它忽略了圆类和椭圆类的 阅读全文
posted @ 2019-02-23 12:46 Grooovvve 阅读(638) 评论(0) 推荐(0)
摘要:public和private来控制对类成员的访问。 还存在另外一个访问类别,这种类别用关键字protected表示。protected和private相似,在类外只能用公有类成员来访问protected部分中的类成员。但是它们之间的区别体现在基类派生的类中。派生类的成员可以直接访问基类的保护成员,但 阅读全文
posted @ 2019-02-23 12:44 Grooovvve 阅读(178) 评论(0) 推荐(0)
摘要:程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问题。 将源代码中的函数调用解释为特定的函数代码块被称为函数名联编(binding)。 在C语言中,这非常简单,因为每个函数名对应一个不同的函数。 但是在C++中由于函数重载的缘故,这项任务非常复杂。编译器必须查看函数参数才能确定使用哪个函 阅读全文
posted @ 2019-02-23 12:43 Grooovvve 阅读(410) 评论(0) 推荐(0)
摘要:有时候希望同一个方法在派生类和基类中的行为是不同的。换句话说,方法的行为取决于调用该方法的对象。这种较复杂的行为称为多态——具有多种形态。即同一种方法其行为随上下文而异。有两种重要的机制可用于实现多态公有继承: 在派生类中重新定义基类的方法。 使用虚方法。 如果要在派生类中重新定义基类的方法,通常应 阅读全文
posted @ 2019-02-23 12:38 Grooovvve 阅读(250) 评论(0) 推荐(0)
摘要:面向对象编程的主要目的之一是:提供可重用的代码。尤其是项目很庞大的时候,重用测试过的代码比重新编码代码要好得多。 C++提供了更高层次的重用性。其中之一就是继承这个概念。 一些厂商提供了类库。类库由类声明和实现构成。类库通常是由源代码组成的,这意味着可以对其进行修改,以满足需求。但是也可以用类继承的 阅读全文
posted @ 2019-02-23 12:35 Grooovvve 阅读(397) 评论(0) 推荐(0)
摘要:如果两种类只是数据类型不同,而其他代码是相同的,与其编写新的类声明,不如编写一种泛型(独立于类型的)栈。然后将具体的类型作为参数传递给这个类。这样就可以使用通用的代码生成存储不同类型值的栈。 可以使用typedef处理这样的需求,但是有两个问题,一、每次修改类型都必须重新编辑头文件;二、在每个程序中 阅读全文
posted @ 2019-02-23 12:27 Grooovvve 阅读(289) 评论(0) 推荐(0)
摘要:继承使用时要注意,默认是私有派生。所以要公有派生时必须记得加关键字Public。 MI(Multi Inheritance)会带来哪些问题?以及如何解决它们? 两个主要问题: 从两个不同的基类继承同名方法; 从两个或更多相关基类那里继承同一个类的多个实例; 虚方法 Worker公有派生出Singer 阅读全文
posted @ 2019-02-23 12:24 Grooovvve 阅读(243) 评论(0) 推荐(0)
摘要:使用包含:易于理解,类声明中包含表示被包含类的显式命名对象,代码可以通过名称引用这些对象; 使用继承:将使关系更抽象,且继承会引起很多问题,尤其是从多个基类继承时。 私有继承所提供的特性确实比包含多。 通常,应使用包含来建立has-a关系;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应 阅读全文
posted @ 2019-02-23 12:22 Grooovvve 阅读(207) 评论(0) 推荐(0)