09 2015 档案
摘要:一、 直接初始化和复制初始化 1.定义:直接初始化使用"( )"符号,如:string s("hello");复制初始化使用"="符号,如:string s="hello". 2.区别:对于内置类型,直接初始化和复制初始化没有差别:其操作都是"提供一个值,并且把这个值复制到新定义的对象中"(《C++
阅读全文
摘要:1. Virtual constructor 原则上构造函数不能为虚:虚函数用于实现"因类型而异的行为",也就是根据指针或引用所绑定对象的动态类型而调用不同实体,但构造函数用于构造对象,在对象构造之前自然没有动态类型的概念,虚与非虚也就无从谈起.所谓的的virtual-constructor实际上是
阅读全文
摘要:1. 要实现C++的每一个语言特性,不同的编译器可能采取不同的方法,其中某些特性(如标题所列)的实现可能会对对象的大小和其member functions的执行速度带来冲击. 2. 虚函数. 当通过对象指针或引用调用虚函数时,具体调用哪一个虚函数由指针或引用的动态类型决定,大部分编译器使用vtbls
阅读全文
摘要:1. "理想的程序库应该小,快速,威力强大,富有弹性,有扩展性,直观,可广泛运用,有良好支持,使用时没有束缚,而且没有'臭虫'".但实际上这种程序库是不可能实现的:要针对速度和大小做优化,往往要牺牲移植性;要有丰富的机能,结果可能不够直观......一个程序库往往要权衡各方面得失,采取折中的方法来实
阅读全文
摘要:1. 一般来说,重载了算数操作符(以下称"独身形式"),那么也就要重载复合赋值操作符(以下称"复合形式").要确保操作符的复合形式例如(operator+=)和独身形式(例如operator+)行为相一致,基于前者实现后者是一个好方法.例如: class Rational{ public: Rati
阅读全文
摘要:1. 正如条款19和条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换. 2.
阅读全文
摘要:1. 函数如果返回对象,就会产生临时对象(见条款19)的构造,析构等过程,考虑以下重载的operator*: class Rational{ public: int getNumerator(){return numerator;} int getDenomerator(){return denom
阅读全文
摘要:1. 所谓的C++临时对象并不是程序员创建的用于存储临时值的对象,而是指编译器层面上的临时对象:这种临时对象不是由程序员创建,而是由编译器为了实现某些功能(例如函数返回,类型转换等)而创建. 由于临时对象不是由程序员创建,其生存期由编译器掌控,因而也就不允许程序员对其进行更改,将其绑定到non-co
阅读全文
摘要:1. Over-eager evaluation("超急评估"):超前进度地做"要求以外"的更多工作,也就是在要求之前就把事情做下去.例如,以下class template用于表现数值数据的大型收集中心: template<class NumericalType> class DataCollect
阅读全文
摘要:1. lazy evaluationg实际上是"拖延战术":延缓运算直到运算结果被需要为止.如果运算结果一直不被需要,运算也就不被执行,从而提高了效率.所谓的运算结果不被执行,有时指只有部分运算结果被需要,那么采用拖延战术,便可避免另一部分不被需要的运算,从而提高效率,以下是lazy evaluat
阅读全文
摘要:1. 80-20法则:一个程序80%的资源用于20%的代码上(80%的执行时间华仔大约20%的代码身上,80%的内存被大约20%的代码使用,80%的磁盘访问动作由20%的代码执行,80%的维护力气花在20%的代码上面).80-20法则的重点不在于字面上的数字,而是强调"软件的整体性能几乎总是由其构成
阅读全文
摘要:1. 为了支持运行期处理exception,编译器需要做大量的簿记工作:确认如果发生异常所需要析构的对象,记录每个try语句块对应的catch子句及其能够处理的exception类型等.编译器还需要在运行期做一些对比工作:在exception抛出时适当析构对象并找出正确的catch子句等.可见exc
阅读全文
摘要:1. Exception specifications作为函数声明的一部分,用于指出(并不能限制)函数可能会抛出的异常函数.C++规定,一个拥有exception specification的函数指针只能被赋予一个有着相同或更为局限的exception specification的函数地址,因而编译
阅读全文
摘要:1. Boost是一个C++开发者集结的社群,也是一个可自由下载的C++程序库群,它的网址是http://Boost.org.C++组织和网站有很多,但Boost有两个特性是其他组织无可匹敌的:第一,Boost由C++标准委员会成员创设,因此和C++标准委员会之间有着独一无二的密切关系,作为一个"可...
阅读全文
摘要:1. TR1(Technical Report 1)是C++ 03标准的一个扩展,它并不属于C++ 03标准,只是一份草稿文件,用于指出下一版C++标准很可能吸收的特性.目前,它的大部分已被C++ 11采纳,成为官方标准.2. C++ 98列出的标准库的组成: STL(Standard Templ...
阅读全文
摘要:1. 编译器的警告可能给出很重要的信息,例如:class B{public: virtual void f() const; ...};class D:public B{public: virtual void f(); ...}; 由于B中的f是const成员函数,而D中...
阅读全文
摘要:1. placement new和place ment delete指的是正常的operator new和operator delete的重载版本,所谓的正常的operator new和delete,指的是拥有以下正常签名式的版本:void* operator new(std::size_t) th...
阅读全文
摘要:1. 实现定制的operator new和operator delete需要满足一定的要求. 以operator new而言:实现一致性operator new必须返回正确的值;内存不足时必得调用new-handling函数;必须有对付零内存需求的准备;需避免不慎掩盖正常形式的new;如果有能力供...
阅读全文
摘要:1. 替换标准库提供的operator new或operator delete通常基于以下三个理由: 1). 用来检测运行上的错误.将"new 所得内存"delete掉却不幸失败会导致内存泄露,多次对同一块"new所得内存"施行delete会导致未定义行为,如果让operator new持有一串动...
阅读全文
摘要:1. 当operator new无法满足某一内存分配需求时,它会先调用一个客户指定的错误处理函数(如果客户未指定,它就会抛出异常),所谓的new-handler.为了指定这个"用以处理内存不足"的函数,客户必须调用set_new_handler,那是声明于的一个标准库函数:namespace std...
阅读全文
摘要:1. 模板元编程(template mataprogramming,TMP)是编写C++程序并执行于编译期的过程,"所谓template mataprogram(模板元程序),是以C++写成,执行于C++编译器内的程序.一旦TMP程序结束执行,其输出,也就是从templates具现出来的若干C++源...
阅读全文
摘要:1. STL迭代器分类: input迭代器:只能一次一步向前移动,客户只可读取(不能涂写)且只能读取一次它们所指的东西,模仿指向输入文件的阅读指针.例如istream_iterators output迭代器:与input迭代器类似,但"一切只为输出",只能一次一步向前移动,客户只可涂写(不能读取...
阅读全文
摘要:1. 条款24举出一个Rational的例子,来说明为什么只有non-member函数才有能力"在所有实参身上实施隐式类型转换".Rational的定义如下:class Rational{public: Rational(int numerator=0,int denominator=1); ...
阅读全文
摘要:1. "智能指针"是行为像指针的对象,但它们能提供指针没有的功能:shared_ptr,weak_ptr,auto_ptr(见条款13)实现对堆内存的自动管理,STL的迭代器实现对整个容器的遍历等. C++内置类型指针(int*,char*等)的优势在于支持继承层次中派生类指针向基类指针的转换(当...
阅读全文
摘要:1. template是节省时间和避免代码重复的有效方法,而且在将类模板(class template)具现化时,编译器只具现化那些被用到的成员函数,这更加节省了空间.2. 正如两个函数存在代码重复时,倾向于把重复的代码抽出独立形成一个函数,然后让之前的函数调用这个函数,函数模板也可以这样,甚至类模...
阅读全文
摘要:1. 在继承模板基类时,C++拒绝在模板化基类(templatized base classes)内寻找继承而来的名称,例如,对于以下模板基类:templateclass Base{public: void fun(){ ... } ...private: .....
阅读全文
摘要:1. 在template的声明式中,typename的使用和class完全相同,即以下两种声明方式完全相同templatetemplate然而typename还有其他用途:指明嵌套从属类型名称.2. 嵌套从属类型名称:如果template中某个名称依赖于类型参数,那么它就是从属名称,如果这个从属名称...
阅读全文
摘要:1. 面向对象编程通常以显式接口(类中的函数原型)和运行时多态(虚函数和RTTI)解决问题,但在Templates及泛型编程的世界,尽管显式接口和运行时多态仍然存在,但隐式接口和编译时多态的重要性却明显提升.2.通常显式接口由函数签名式构成,而隐式借口并不基于函数声明式,而是有有效表达式组成.所谓泛...
阅读全文
摘要:1. 使用多重继承,派生类有可能从一个以上的基类继承相同名称,这回导致歧义.即使来自不同基类的相同名称各自的访问级别不同,也有仍然有可能造成歧义,因为C++的名称查找法则是先查找最佳匹配,然后再检查可取用性.可以使用作用域操作符明确指定所使用的名字属于那一个类.2. 如果多重继承继承的一个以上基类又...
阅读全文
摘要:1. public继承表明is-a的关系,要求接口的完全继承,而private继承表明"根据某物实现出的关系",要求仅仅继承实现,private继承有两个规则: 1). 经由private继承而来的基类的所有成员在派生类中都会变成private属性 2). 由于1),编译器不允许将派生类转为基类...
阅读全文
摘要:1. public继承体现is-a关系,要求接口的完全继承,而复合体现has-a或"根据某物实现出"的关系. 当复合发生在应用域(世界中的某些事物,如人,汽车,一张剪辑视频画面等)内的对象之间,表现出has-a关系,当发生在实现域(细节上的人工制品,如缓冲区,互斥器,查找树等)内,表现出is-im...
阅读全文
摘要:1. 重定义一个继承而来的non-virtual函数是应该避免的(见条款34,36),因此主要讨论为什么不重定义virtual函数的缺省参数值.2. virtual函数的特点在于动态绑定,也就是运行时确定调用的函数实体,但令人惊讶的是,无论函数是否virtual,其缺省参数都是静态绑定的,例如:cl...
阅读全文
摘要:1. public继承意味着is-a关系,即派生类是基类的一种,任何基类可以进行的操作派生类也应该可以进行,如果派生类对于某个函数的实现与基类不同,那么就应当这个函数设为virtual,如果基类中的某个函数是non-virtual的,那么也应该意味着派生类应该继承这个函数的实现,而不应该重定义它.2...
阅读全文
摘要:(参考自http://www.cnblogs.com/jerry19880126/p/3551836.html)1. 与java语言不同,对于C++,在创建类的对象时,编译器必须要在编译期间看到类定义,以确定要分配的内存大小,因此要定义一个类对象,文件常常要include包含类定义的头文件,这就引发...
阅读全文
摘要:1. 在一个继承层次中,不同的类要实现同一接口的不同实现,最先想到的可能是虚函数,假设一个存在一个继承体系,这个集成体系中的每一层都需要一个名为fun函数,那么可能会像这样实现:clase Base{public: ... virtual fun(int num){...}private...
阅读全文
摘要:1. C++对于函数成员的继承主要有三种: 只继承接口,不继承实现; 同时继承接口和实现,同时允许覆写实现; 继承接口和实现,同时不允许对实现进行覆写.2. 对于public继承,成员函数的接口应该总是被继承(由于is-a关系的存在),其中: pure-virtual函数的目的只是为了使派生...
阅读全文
摘要:1. C++基类和派生类的作用域为嵌套关系,同时存在作用域屏蔽规则,例如: class Base{ public: void fun(); ... private: int a; ... } class Derived:public Base{ ... } 那么Derived和Base之间的作用域关
阅读全文
摘要:1. public继承意味着"is-a"(是一个)关系,是接口的完全继承(不一定是接口实现的完全继承).例如B继承自A,如果采用public继承,那么意味着B是A的一种,因此A可以进行的操作B同样也可以进行(尽管实现可能不同).2. public继承的is-a含义(基类可以进行的操作派生类同样可以进...
阅读全文
摘要:1. inline函数既和带参宏一样不带来函数调用的额外开销,又具有和非inline函数相同的功能,也就是说,inline函数同时具备带参宏和非inline函数的优点. 此外,编译器优化机制通常针对于那些不含参数调用的代码,因此inline某个函数就有可能使编译器对它执行语句相关最优化.2. 虽然...
阅读全文
摘要:1.当异常被抛出时,"异常安全"函数有两个条件: 不泄露任何资源:从堆中申请的资源应该确保被释放 不允许数据败坏:函数不能对数据修改到一半而抛出异常以致数据被破坏. 解决"不泄露任何资源"很容易,只要使用资源管理类(如shared_ptr,见条款13)即可,"不允许数据败坏"是主要考虑的问题....
阅读全文
摘要:1. 所谓的handles指的是引用,指针,迭代器(可能与windows的句柄有所区别),返回一个handles会导致提供给用户对象内部数据的间接访问,这降低了成员变量的封装性,例如:class Demo{public: ... int* getPtr() const { ...
阅读全文
摘要:1. 转型语法有三种,C风格转型:(T)expression函数风格转型:T(expression)两种方式除了小括号位置不同没有差别,可以称为"旧式转型".C++提供四种新式转型: const_cast(expression): 将const变量引用或指针转为非const引用或指针,移除变量的常...
阅读全文