Exceptional C++
扮猪吃饺子
努力的人,运气不会太差。
展开
-
条款6:GotW#2 临时对象(Temporary Objects)
试想你正在阅读另一个程序员写好的函数代码,而这个函数中却有至少三个地方用到了不必要的临时对象,你能发现几个,程序员又该如何修改?string FindAddr(list<Employee> l,string name){ for(list<Employee>::iterator i = l.begin(); i != l.end(); i++) { if...原创 2018-12-28 07:25:43 · 139 阅读 · 0 评论 -
条款30:GotW#28 “Fast Pimpl”技术(The “Fast Pimpl” Idiom)
如下采用了一些称为“降低依赖”或“效率”方面的捷径,在很多时候颇有吸引力,但它不是好主意。有一个极好的习惯可以成功同时实现这两个目标:【问题】标准的malloc()个new()调用的开销很大,在下面的代码,程序员最初在class Y中设计了一个类型X的成员://尝试#1//文件y.h#include "x.h"class Y{ /*...*/ X x_;};//文件...原创 2019-03-08 07:37:48 · 206 阅读 · 0 评论 -
条款32~34:接口原则(the Interface Principle)
一开始简单而令人困惑的问题:类里面有什么?也就是,什么组成了类及其接口?更深层次问题是:它怎么和C风格的面向对象编程联系起来? 它怎么和C++ Koenig lookup联系起来?如何Myers Example的例子联系起来? 它怎么影响我们分析class间的依赖关系以及设计对象模型?第一个问题,“类里面有什么?”:回顾一下class的传统定义:一个clas描述了一组数据以...原创 2019-03-15 07:45:36 · 146 阅读 · 0 评论 -
条款37:GotW#25 auto_ptr
【问题】考虑如下代码:哪些是好的,哪些是安全的,哪些是合法的,哪些是非法的?auto_ptr<T> source(){ return auto_ptr<T>(new T(1));} void sink(auto_ptr<T> pt){ }void f(){ auto_ptr<T> a(source); sink(s...原创 2019-03-21 07:43:50 · 123 阅读 · 0 评论 -
条款35:GotW#5 内存管理(Memory Management)(一)
【问题】C++拥有几个不同的内存区域,用来存储对象或其它类型的值,每一个区域都有各自的特点。请说出尽可能多的内存区域的名称,并分析每一个区域的特征,描述存储在其中的对象的生存周期。【解答】下面总结出了C++主要的内存区域。注意,有些名称(比如heap)可能与C++标准的叫法不一样。[常量数据(const data)区]:常量数据区存储字符串等在编译期就能确定的数据。类对象不能...原创 2019-03-18 07:24:02 · 147 阅读 · 0 评论 -
条款36:内存管理(Memory Management)(二)
【问题】下面的代码摘自某个程序,这个程序有一些类使用了自己的内存管理方案。请尽可能找出与内存有关的错误,并回答其注释中附加题://1.为什么B的delete还有第二个参数?//为什么D的delete却没有第二个参数?class B{public: virtual ~B(); void operator delete(void*,size_t) throw(); void o...原创 2019-03-20 07:20:09 · 240 阅读 · 0 评论 -
条款38:GotW#11 对象等同问题(Object Identity)
【问题】测试语句“this != &other”是一个防止自赋值(self-assignment)常用手法。那么要达到这个“防止自赋值”目的,现有的语句是否必要的和/充分的呢?为什么?为什么不?如果答案是否定的,你又该如何修改?要“防范Murphy”(程序本身出错)和“防范Machiavelli”(恶意程序员绞尽脑汁攻击我们的代码之间)的区别。T& T::operator...原创 2019-03-25 07:20:52 · 195 阅读 · 0 评论 -
条款39:GotW#19 自动转换(Automatic Conversions)
【问题】标准的string不具备向const char*自动转换的能力。它应该有吗?【背景】把string作为C风格的const char*来进行访问很有用。实际上,string也确实有一个成员函数c_str()专门来完成这个任务——返回const char*。下面是客户代码的区别:string s1("hello"),s2("world");strcmp(s1,s2); //...原创 2019-03-25 07:40:07 · 182 阅读 · 0 评论 -
条款40:GotW#22 对象的生存期(Object Lifetimes)(一)
【问题】评论下面的程序片段。#2处的代码安全并且合法吗?请你给出解释:void f(){ T t(1); T& rt = t; //#1 使用t或者rt做一些事情 t.~T(); new (&t) T(2); //#2 使用t或者rt做一些事情 //t 再次被销毁}【解答】#2处的代码是安全且合法的(如果只考虑这部分代码的话),但是:函数作为...原创 2019-03-26 07:16:47 · 153 阅读 · 0 评论 -
条款41:GotW#23 对象的生存周期(Object Lifetimes)(二)
【问题】请评价如下的错误的惯用手法:T& T::operator = (const T& other){ if(this != &other) { this->~T(); new (this) T(other); } return *this;}1.代码试图达到什么样的合法目的?修改上述代码中的编码错误。2.假设修正了所有的错误...原创 2019-03-27 07:20:06 · 154 阅读 · 0 评论 -
条款42:GotW#1 变量的初始化(Variable Initialization)
【问题】下面四条语句有什么区别吗?SomeType t = u;SomeType t(u);SomeType t();SomeType t;【解答】SomeType t;这是调用的是默认构造函数初始化。SomeType t();这个只是函数声明,这个函数没有参数并返回类型为SomeType。SomeType t(u);这里直接初始化,即有参构造。SomeT...原创 2019-03-27 07:34:11 · 194 阅读 · 0 评论 -
条款45:GotW#26 Bool
【问题】除了wchar_t(它是C中的一个typedef)之外,bool是自从ARM以外唯一一个C++新添的内置类型。如果不添加这个bool,能否用已有的数据达到相同的效果呢?如果能,请给出一个实现,如果不能,请说出可能的实现方法都有哪些缺陷?【解答】不能,bool明确添加作为C++的基本类型(并保留true和false关键字)没因为它们(bool型和true,false)没法通过现有...原创 2019-04-01 07:31:21 · 122 阅读 · 0 评论 -
条款43:GotW#6 正确使用const(Const-Correctness)
【问题】const是编写安全代码的强有力工具,还有利于编译器的优化处理。你应该尽可能的使用它,你该如何尽可能使用它?在如下程序代码中对其添加或者删除const关键字:class Polygon{public: Polygon():area_(-1){} void AddPoint(const Point pt) { InvalidateArea(); points_...原创 2019-03-28 07:18:31 · 224 阅读 · 0 评论 -
条款46:GotW#27转移调用函数(Forwarding Functions)
【问题】转移调用函数在需要将工作传递gei其他函数或对象时很有用的工具,特别是当传递工作需要搞笑完成的时候。评论下下面的转移调用函数。你可以修改它吗?如果是的话,怎么改呢?//file f.cpp#include "f.h"/*...*/bool f(X x){ return g(x);}【解答】有两个主要的提高效率的方法,第一个应该总被采用,第二个需要权衡。...原创 2019-04-02 07:14:56 · 149 阅读 · 0 评论 -
条款44:GotW#17 类型转换(Casts)
【问题】标准C++中新风格的转换与旧风格的C转换相比,具有更强大的功能和安全性。你对它了解多少?本条款中,使用如下的类和全局变量。class A {public: virtual ~A(){}/*...*/};class B : virtual private A{/*...*/};struct C: A {/*...*/};struct D:B,C {/*...*/};A a1...原创 2019-03-29 07:51:58 · 162 阅读 · 0 评论 -
条款31:GotW#30 名称搜索(Name Lookup)
当你调用一个函数的时候,到底调用的是哪个?其答案取决于“名称搜索”,但你肯定会发现其细节非常令人吃惊。【问题】在下面代码中,调用时哪个函数?为什么?分析一下:namespace A{ struct X; struct Y; void f(int); void g(X);};namespace B{ void f(int i) { f(i); //哪一个f()...原创 2019-03-11 07:23:54 · 152 阅读 · 0 评论 -
条款25:GotW#13 面向对象程序设计(Object-Oriented Programing)
C++是一个威力强大的语言,提供了许多高级的面向对象设计,包括封装、异常处理、继承、模板、多态、强类型检查以及一个完整的模块系统。讨论这句话。解答:本条款的目的是诱发思考主要的C++特性。用来阐明以下三个主要问题:不是每个人都认同OO的意义。几乎每个人都同意继承和多态是OO概念,大部分人还会加上封装。一些人会加上异常,也许没人提到模板。对于什么是OO特性什么不是,每个人观点都不同。...原创 2019-02-27 07:17:17 · 141 阅读 · 0 评论 -
条款7: GotW#3 使用标准库(Using the Standard Library)
一旦程序员使用标准库算法而不是编写自己的算法版本时,首先可以避免GotW#2中的多少个缺陷?原始的错误版本:string FindAddr(list<Employee> l,string name){ for(list<Employee>::iterator i = l.begin(); i != l.end(); i++) { if(*i == n...原创 2018-12-29 06:39:11 · 126 阅读 · 0 评论 -
条款2~3:GotW#29 不区分大小写的string
编写一个与标准的std::string类完全相同ci_string类,但是它与通常提供的扩展函数stricmp一样是不区分大小写的。ci_string应用能够如下使用:ci_string s("AbCde");//不区分大小assert(s == "abcde");assert(s == "ABCDE");assert(strcmp(s.c_str(),"AbCdE") == 0...原创 2018-12-25 07:23:44 · 444 阅读 · 0 评论 -
条款1 GotW#18: Iterators
以下程序至少有四个与iterator相关的问题:int main(){ vector<Date> e; copy(istream_iterator<Date>(cin), istream_iterator<Date>(), back_inserter(e)); vector<Date>::iterator first = ...原创 2018-12-24 07:03:47 · 161 阅读 · 0 评论 -
条款4~5:GotW#16 具有最大可复用的通用Containers
问题:为下面的定长(fixed-length)vector class实现拷贝构造和拷贝赋值操作,以提供最大的可用性(usability)。提示:请考虑用户代码可能会用它做哪些事情。template<typename T,size_t size>class fixed_vector{public: typedef T* iterator; typedef const...原创 2018-12-27 07:16:27 · 142 阅读 · 0 评论 -
条款8~17:GotW#8 挑战篇——异常安全处理(Challenge Edition - Exception Safety)
【问题】1.实现如下异常-中立(exception-neutral) container。要求:Stack对象的状态必须保持一致性;即使有内部操作抛出异常,Stack对象也必须可以析构;T的异常必须能够传递到调用者那里。template <class T>class Stack{public: Stack(); ~Stack(); Stack(const Stac...原创 2019-01-04 07:35:04 · 287 阅读 · 0 评论 -
条款18:GotW#20 代码的复杂性(Code Complexity)(一)
【问题】在没有任何其他附加信息的情况下,下面代码中有多少条执行路径?String EvaluateSalaryAndReturnName(Employee e){ if(e.Title() == "CEO" || e.Salary() > 100000) { cout << e.First() << " " << e.Last() ...原创 2019-01-07 07:28:37 · 254 阅读 · 0 评论 -
条款21:GotW#5 改写虚拟函数(Overriding Virtual Functions)
当你审查公司的旧代码时,可能偶然遇到不知哪个程序员编写的程序片段。写的人似乎对C++的特质有相当认识。那么这个程序员期望打印什么结果呢?实际结果如何呢?#include <iostream>#include <complex>using namespace std;class Base{public: virtual void f(int); virt...原创 2019-01-18 07:27:39 · 232 阅读 · 0 评论 -
条款19:GotW#21 代码复杂性(Code Complexity) (二)
【问题】让我们来考虑GotW#20里的那个函数,这个函数是异常安全(再出现异常时仍能正常工作)还是异常中立(能将所有异常都传递给调用者)?String EvaluateSalaryAndReturnName(Employee e){ if(e.Title() == "CEO" || e.Salary() > 100000) { cout << e.First(...原创 2019-01-09 07:50:12 · 190 阅读 · 0 评论 -
条款20: GotW#4 CLASS技术(Class Mechanics)
假如你正在检阅程式码,有位程序员写下这样的一个class,其中有些不好的风格,还有些错误。你可以找出多少个?哟能力修正它们吗?class Complex{public: Complex(double real,double imaginary = 0) :_real(real),_imaginary(imaginary) {} void operator+(Complex o...原创 2019-01-15 07:28:30 · 126 阅读 · 0 评论 -
条款22:GotW#14 Classes之间的关系(Class Relationships)(一)
网络应用程序有两种会话,各自都有其自身的消息协议。这两个协议具有相似性(某些运算、乃至某些讯息相同),因此这个程序员提成如下设计,在一个BasicProtocol类中封装了这些共同的计算和消息。class BasicProtocol{public: BasicProtocol(); virtual ~BasicProtocol(); bool BasicMsgA(/*...*/);...原创 2019-02-12 07:38:23 · 276 阅读 · 0 评论 -
条款26~28:GotW#7编译器的依赖性(Minimizing Compile-time Dependencies)
问题:大多数程序员使用#include包含多余的头文件。这会严重的影响并延长编译的时间,特别当一个被频繁使用的头文件包含了太多其他的头文件的时候,问题更加严重。在如下的头文件中,有哪些#include语句可以在不对程序产生副作用的情况下被直接去掉?其次,还有哪些#include语句可以在对程序进行适当修改后去掉?程序如何修改?(你不能改变X类和Y类的公共接口:也就是说,你对这个头文件所做的...原创 2019-03-04 07:45:44 · 151 阅读 · 0 评论 -
条款24:使用/滥用继承(Uses and Abuses of Inheritance)
以下template提供了list的管理功能,包括在特定位置上的处理元素的功能://Example 1template<class T>class Mylist{public: bool Insert(const T&,size_t index); T Access(size_t index) const; size_t Size() const; pr...原创 2019-02-26 07:14:57 · 213 阅读 · 0 评论 -
条款23:GotW#15 Classes之间的关系(Class Relationships)(二)
数据库处理程序通常需要处理给定表的每一个记录。首先,通常对这个表格执行第一次只读遍历来存储需要被处理的记录的信息,然后执行第二次遍历来改变这个记录。为了避免每次重新编写大量同样的逻辑代码,一个程序员试图在如下抽象类中提供一个泛型可重用的框架。目的是:抽象类应该封装重复性的工作,首先编译要做处理的表型,然后对相关的每一行进行操作,派生类负责提供特定的细节操作。//---------------...原创 2019-02-14 10:00:56 · 393 阅读 · 0 评论 -
条款29:GotW#24 编译级防火墙(Compilation Firewalls)
【问题】在C++中,如果类定义中的任何部分被改变(即使是私有成员),那么这个类所有的使用者代码都必须重新编译。问了降低这种依赖性,使用一种常见的技术就是利用一个不透明指针(opaque operator)来隐藏一部分实现细节:class X{public: /*公有成员*/protected: /*保护成员*/private: /*私有成员*/ class XImpl* ...原创 2019-03-05 07:40:39 · 335 阅读 · 0 评论 -
条款47:GotW#12 控制流(Control Flow)
【问题】所谓“妖藏巨细”。现在请你从下面代码中找出有关控制流的问题。#include <cassert>#include <iostream>#include <typeinfo>#include <string>using namespace std;//以下行来自另外一些文件char* itoa(int value,cha...原创 2019-04-04 07:19:43 · 194 阅读 · 0 评论