effective c++
鸟类学
这个作者很懒,什么都没留下…
展开
-
条款40:明智而审慎地使用多重继承
/*条款40:明智而审慎地使用多重继承*//*多重继承的缺点:1 可能导致调用歧义(相同名字的成员需显示指明) 2 钻石继承的最终子类会多份更高级基类的成员(虚继承,但会影响访问非最高基类的效率,和虚继承的来的类的体积变大) 3 最终子类需负责基类(不论直接或间接)的初始化工作 建议: 1 非必要不使用virtual base原创 2015-09-24 04:05:28 · 402 阅读 · 0 评论 -
条款50: 了解new和delete的合理替换时机
/*条款50: 了解new和delete的合理替换时机*/#includeusing namespace std;//替换编译器提供的operator主要三个最觉的理由// 1 用来检测运用上的错误 2 为了强化效能 3为了收集使用上的统计数据static const int signature = 0xDEADBEEF;typedef unsigned char Byte;void原创 2015-09-29 13:54:51 · 286 阅读 · 0 评论 -
条款48:认识template元编程
/*条款48:认识template元编程*/// Template metaprogramming (TMP,模板元编程):是以C++写成,执行于C++编译器内的程序#includeusing namespace std;/*templatevoid advance(IterT&iter,DistT d){ if(typeid(typename std::iterator_trait原创 2015-09-29 00:00:58 · 300 阅读 · 0 评论 -
条款49:了解new-handler的行为
/*条款49:了解new-handler的行为*/#includeusing namespace std;//operator new 当无法满足某一内在分配需求时,它会抛出异常,返回NULL指针,某些旧式编译器目前也还那么做,也可以当operator抛出异常之前先调用一个·客户指定错误处理函数(new-handler),但客户必须调用set_new_handler,那是声明于的标准程序库函原创 2015-09-29 12:49:47 · 315 阅读 · 0 评论 -
条款52:写了placement new 也要写Placement delete
/*条款52:写了placement new 也要写Placement delete*/#includeusing namespace std;//class Widget {};class Widget {public: //.. static void*operator new(std::size_t size, std::ostream&logStream)thr原创 2015-09-30 03:03:57 · 331 阅读 · 0 评论 -
条款45:运用成员函数模板接受所有兼容类型
/*条款45:运用成员函数模板接受所有兼容类型*///真实指针做得好的一点是支持隐式转换,子类指针->基类指针,非常对象指针->常对象指针#includeusing namespace std;class Top{};class Middle:public Top{};class Bottom:public Middle{};/*Top*pt1 = new Middle;//子类到基原创 2015-09-27 17:02:35 · 267 阅读 · 0 评论 -
条款44:将与参数无关的代码抽离template
/*条款44:将与参数无关的代码抽离template*///共性与变性分析,把两个类或函数中本质相同的代码进行抽离成另一个相同类别的结构中//在模板代码中,重复的部分是隐晦的//下面是一个支持矩阵运算的例子#include#includeusing namespace std;/*templateclass SquareMatrix{public: //.. void in原创 2015-09-27 16:12:19 · 335 阅读 · 0 评论 -
条款26: 尽可能延后变量定义的出现时间
/*条款26: 尽可能延后变量定义的出现时间*/#include#include#define MinimumPasswordLength 32using namespace std;void encrypt(const string &s){}string encryptPassword(const string &password){// using namespace st原创 2015-09-06 15:19:16 · 372 阅读 · 0 评论 -
条款47:请使用traits classes 表现类型信息
/*条款47:请使用traits classes 表现类型信息*///Traits 是一种技术,一个C++程序员共同遵守的协议,它的要求之一是:它对内置类型和用户自定义类型的表现必须一样好//advance 用来将某个迭代器移动某个给定距离#includeusing namespace std;templatevoid advance(IterT &iter,DistT d);//但s原创 2015-09-28 17:57:19 · 404 阅读 · 0 评论 -
条款46:需要类型转换时请为模板定义非成员函数
/*条款46:需要类型转换时请为模板定义非成员函数*/#includeusing namespace std;templateclass Rational{public: Rational(const T&numerator=0,const T&denominator=1):a(numerator),b(denominator){ } const T numerator()原创 2015-09-28 16:06:51 · 417 阅读 · 0 评论 -
条款43:学习处理模板化基类内的名称
*条款43:学习处理模板化基类内的名称*/#include#includeusing namespace std;class CompanyA{ //.. void sendCleartext(const std::string&msg);//未加密 void sendEncrypted(const std::string&msg);//已加密 //..};class Com原创 2015-09-27 12:59:52 · 282 阅读 · 0 评论 -
条款41:了解隐式接口和编译期多态
/*条款41:了解隐式接口和编译期多态*/// 重载函数(编译期多态)虚函数绑定(运行期多态)//类和模板都支持接口和多态,对于类而言接口是显式的,以函数签名为中心,多态则是通过虚函数发生于生运行期// 对于模板而言接口是隐式的,奠基于有效表达式,多态则是通过模板卡具现化和函数重载解析发生于编译期#includeusing namespa原创 2015-09-26 10:57:40 · 342 阅读 · 0 评论 -
条款55:让自己熟悉Boost
/*条款55:让自己熟悉Boost*//*boost是一个c++开发者集结的社群如果你想把你准备好的程序库加入boost里要考虑以下内容1 这一份设计和实现有多好?2 这些代码可跨编译器和操作系统吗?3 这个程序库有可能被它所设定的目标用户使用吗?4 文档是否清楚,齐备,而且精确?boost 程序库对付的主题非常繁多 区分数十个类目包括:1 字符串与文本处理,覆盖具备类型安全的原创 2015-09-30 11:01:00 · 321 阅读 · 0 评论 -
条款53:不要轻忽编译器的警告
/*条款53:不要轻忽编译器的警告*/#includeusing namespace std;class B {public: virtual void f()const;};class D :public B {public: virtual void f();};//如果我们写到这里进行编译有一个警告。。vs报错了。。编译器试图告诉你:B中的f并未在D中原创 2015-09-30 03:13:51 · 284 阅读 · 0 评论 -
条款38:通过复合塑模出has-a或“根据某物实现出
/*条款38:通过复合塑模出has-a或“根据某物实现出*//* &&几个概念&&软件中的程序中两个部分:1 应用域:程序中的对象其实相当于你所塑造的世界中某些事物,如人,汽车。。 2 实现域:其他对象则是纯粹是实现细节上的人工制品,如缓冲区,互斥锁。。当复合发生于应用域内的对象之间 表现出:has-a的关系原创 2015-09-21 13:56:49 · 387 阅读 · 0 评论 -
条款39:明智而审慎地使用private继承
/*条款39:明智而审慎地使用private继承*/#includeusing namespace std;class Person{};class Student :private Person{};//私有继承void eat(const Person&p){}void study(const Student&s){}class Timer{public: explicit原创 2015-09-21 14:49:11 · 369 阅读 · 0 评论 -
条款36:绝不重新定义继承而来的non-virtual函数
/* 条款36:绝不重新定义继承而来的non-virtual函数*/#includeusing namespace std;class B {public: void mf() { cout << "B::mf()" << endl; }};class D :public B {public: void mf() { cout << "D::mf原创 2015-09-20 02:16:29 · 388 阅读 · 0 评论 -
条款37:绝不重新定义继承而来的缺省参数值
/*条款37:绝不重新定义继承而来的缺省参数值*//*静态绑定就是在程序中被声明时所采用的类型*/#includeusing namespace std;/*class Shape {public: enum ShapeColor{Red,Green,Blue}; virtual void draw(ShapeColor color = Red)const = 0;原创 2015-09-20 03:14:38 · 262 阅读 · 0 评论 -
条款34:区分接口继承和实现继承
/*条款34:区分接口继承和实现继承*/#includeclass Shape {public: virtual void draw()const = 0; //声明一个纯虚函数的目的是为了让子类只继承函数接口 基类不必实现,但令人意外的,我们竞然可以为纯虚函数提供定义,但调用时它的唯一途径是明确指出其类名 //这种做法除了帮助你在鸡尾酒派对上留给大师级程序员一个深刻的印象原创 2015-09-19 03:43:48 · 334 阅读 · 0 评论 -
条款35:考虑virtual函数以外的其他选择
/*条款35:考虑virtual函数以外的其他选择*/#includeusing namespace std;/*class GameCharacter {//public: virtual int healthValue()const;//返回人物的健康指数,子类会根据具体的人物角色来计算,而且这里并未声明为纯虚,暗示我们将会有个计算健康指针的缺省算法 //但是不一定原创 2015-09-19 05:46:45 · 324 阅读 · 0 评论 -
条款 33 避免继承而来的名称
/*避免继承而来的名称*///一朵玫瑰叫任何名字还是一样芬芳-----莎士比亚//子类中查找一个成员的的名字的方法 1子类作用域 2 基类作用域 //3 内含基类的名字空间 4 全局#includeclass Base {public: int x;public: virtual void mf1() = 0; virtual void mf1(int); virtual v原创 2015-09-18 12:50:36 · 303 阅读 · 0 评论 -
款31:将文件间的编译依存关系降到最低
/*条款31:将文件间的编译依存关系降到最低*/#include#include//如果不加上下面三行会编译不过,然而这就是形成编译依存关系的源头#include"data.h"#include"address.h"using namespace std;class Person {public: /* namespace std{ 但这是不正确,而是一个bas原创 2015-09-17 03:42:09 · 449 阅读 · 0 评论 -
条款32:确定人的public继承塑模出来is-a关系
public 继承 意味着is-a,适用于 base classes身上的第一件事情一定也适用于derived classes身上,因为每一个derived classs 对象也都是一个base class对象原创 2015-09-17 04:21:22 · 253 阅读 · 0 评论 -
条款30 透彻了解inlining的里里外外
/*条款30 透彻了解inlining的里里外外*///1 过度热衷inlining会造成程序体积太大//2 inline只是对编译器的一个申请,不是强制命令,可以隐喻提出,可以明确提出//3 大多数的inlining都是在编译期完成,少部分是在连接期完成,更少数是在运行期完成//4 每种编译器评估是否可以做为inlining的标准并不一致,大部分编译器,拒绝循环,递归,虚函数(虚原创 2015-09-17 02:16:49 · 278 阅读 · 0 评论 -
条款51:编写new和delete时需固守常规
/*编写new和delete时需固守常规*///非附属对象必须有独立的大小 #includeusing namespace std;class Base{public: static void*operator new(std::size_t size) throw(std::bad_alloc); //..};// operator new (pseudocode):void原创 2015-09-29 15:56:27 · 281 阅读 · 0 评论 -
条款25 考虑写出一个不抛异常的swap函数
/*条款25 考虑写出一个不抛异常的swap函数*///异常安全性编程的脊柱#include#includeusing namespace std;/* 标准库的swap 实现方式namespace std{//效率低 template void swap(T&a, T&b){ T temp(a); a = b; b = temp; }}*/class Wid原创 2015-09-06 14:33:44 · 312 阅读 · 0 评论 -
条款16 成对使用new和delete时要采取相同形式
#include#includeusing namespace std;/* 单一对象 : object 对象数组 : n object object object ...... 一般编译器的对象数组前放了一个n用来保存对象数组的大小 */class NewDelete{public: NewDelete(){ cout << "NewDelete原创 2015-09-05 13:23:09 · 342 阅读 · 0 评论 -
条款11 在operator=中处理“自我赋值“
class Bitmap{...}; class Widget{ ... private: Bitmap*pb;//指向堆 }; Widget& Widget::operator=(const Widget&rhs){//不安全版本 delete pb;//*this 和rhs 有可能是同一对象 pb = new Bitmap(*rhs.pb); return *th原创 2015-09-04 22:02:41 · 242 阅读 · 0 评论 -
条款20:宁以 pass-by-reference to const 替换 pass by value
/*条款20:宁以 pass-by-reference to const 替换 pass by value */#include#includeusing namespace std;class Window{public: string name()const{ return "abc"; } virtual void display()const{ cout << "W原创 2015-09-05 15:51:05 · 226 阅读 · 0 评论 -
条款15 在资源管理类中提供对原始资源的访问
#include#include#include//智能指针using namespace std;class Resouce{public: Resouce(){ cout << "Resouce()" << endl; } ~Resouce(){ cout << "~Resouce()" << endl; } void dosomething(){ cout <原创 2015-09-05 01:39:00 · 333 阅读 · 0 评论 -
条款01 视c++为一个语言联邦
一 C++ 发展成了多重范型编程语言支持以下形式: 1 过程形式 2 面向对象形式 3 函数形式 4 泛型形式 5 元编程形式二 可以将c++简单的看成由四个次语言(sublanguage)组成: 1 C 2 Object-Oriented C++ 3 Temlate C++ 4 STL 三 如何理解与使用 1 c++并不原创 2015-09-01 19:46:40 · 370 阅读 · 0 评论 -
条款10 令operator=返回一个 reference to *this
标准库提供的类型string vector complex 都支持连续赋值的规律,在实现运算符重载进记得返回引用原创 2015-09-04 17:48:18 · 286 阅读 · 0 评论 -
条款 08 别让异常逃离析构函数
如果在一个析构函数中在销毁别几个同一对象时,这个对象在销毁时这个对象析构都抛出异常,这样同时作用的异常会导致不明确的行为解决1 捕获异常并草率结束程序(不好) 2 捕获异常并记录(吞下异常) (不好) 3 在类中提供一个普通函数(非析构函数)给客户一个机会处理class DBconn{public:...void close(){//客户使用原创 2015-09-04 17:09:29 · 299 阅读 · 0 评论 -
条款 04 make sure that objects are initialized before they're used
1 为普通内置类型进行初始化,否则c++不会保证初始化他们2 尽量使用成员初始化列表进行初始化工作 2.1 如果在构造函数本体内赋值 非内置类型有构造与拷贝构造开销,而初始化列表中只调用一次其自身的构造并也可以在其构造中调用缺省构造完成 2.2 常成员与引用型成员要在初始化列表中完成 2.3 类的成员变量总是以其声明次序而依次被初始化,虽然初始化列表允许以不同的次序出现,但还是应该原创 2015-09-03 19:12:13 · 308 阅读 · 0 评论 -
条款06 若不想使用编译器自动生成的函数 就该明确拒绝
如果不想用户复制你的独有的类ios_base,basic_ios和sentry的拷贝构造与拷贝赋值都被声明为私有且没有定义(没有实现的函数也可以不写形参)也可以使用这样的类来阻止拷贝构造与拷贝赋值发生class Uncopyable{protected:Uncopyable(){}//允许子类对象构造析构~Uncopyable(){}private:Uncopy原创 2015-09-03 19:43:59 · 387 阅读 · 0 评论 -
条款05 了解c++默默编写并调用哪些函数。。。
1 默认的拷贝构造,拷贝赋值,构造,析构都是public且内联,(析构是non-vitual,除非virtualness来自于base-class)2 默认拷贝赋值与拷贝构造函数都是采用逐字节复制,如果成员变量有引用或指针类型时要自定义处理原创 2015-09-03 19:28:47 · 253 阅读 · 0 评论 -
条款28 避免返回handles指向对象内部成分
/*条款28 避免返回handles指向对象内部成分*//*handles: 指针,引用,迭代器*///设计一个矩形类,为了对象尽可能小,把点放在一个助的struct 内#include#includeusing namespace std;class Point{public:Point(int x = 0, int y = 0) :m_x(x), m_y(y){原创 2015-09-09 21:16:40 · 299 阅读 · 0 评论 -
条款03 use const whenever possible
1 多才多艺的const const 可以修饰类外global或namespace作用域中的常量,文件,函数 ,块中的static的对象 类内的静态与非静态成员??文件怎么修饰?2 STL迭代器系以指针为根据塑模出来的const std::vector::iterator iter = vec.begin() //iter 的作用像个T*conststd::vector::原创 2015-09-03 17:12:24 · 259 阅读 · 0 评论 -
条款22 将成员变量为private
/*条款22 将成员变量为private*/#includeusing namespace std;class AccessLevedls{public: int getReadOnly()const { return readOnly; } void setReadWrite(int value){ readWrite = value;} int getReadWrite()con原创 2015-09-05 17:04:02 · 289 阅读 · 0 评论 -
条款24 若所有参数皆需类型转换,请为此采用non-member函数
/*条款24 若所有参数皆需类型转换,请为此采用non-member函数*/#includeusing namespace std;class Rational{public: Rational(int numerator = 0, int denominator = 1):n(numerator),d(denominator){ } int numerator()const {原创 2015-09-05 18:35:54 · 283 阅读 · 0 评论