![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective C++
vvc223c
这个作者很懒,什么都没留下…
展开
-
Effective C++条款49:了解new-handler的行为
当operator new 无法满足某一内存分配需求时,它会抛出异常,以前它会返回null指针.当operator new 抛出异常反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler。namespace std{ typedef void(*new_handler)(); new_handler set_new_handler(new_...原创 2019-11-18 16:07:53 · 229 阅读 · 0 评论 -
Effective C++条款47:请使用traits classses表现类型信息
stl有五种迭代器,input 迭代器,output迭代器,forward迭代器,bidirectional迭代器、bidirectional迭代器。对于这5种分类,C++标准程序库分别提供专属的卷标结构加以确认:struct input_iterator_tag{};struct output_iterator_tag{};struct forwardt_iterator_tag:pub...原创 2019-11-18 14:09:00 · 137 阅读 · 0 评论 -
Effective C++条款46:需要类型转换时请为模板定义非成员函数
template<typename T>class Rational{public: Rational(const T & numerator = 0, const T &denominator = 1); const T numerator() const; const T denominator() const;private: ...};tem...原创 2019-11-17 15:25:02 · 156 阅读 · 0 评论 -
Effective C++条款45:运用成员函数模板接受所有兼容类型
智能指针是行为像指针的对象,真的指针做的很好的事情是:支持隐式转换,派生类指针可以隐式转换为基类指针,指向non-const对象的指针可以转换为指向const对象等等,比如:class Top {...};class Middle : public Top{...};class Bottom : public Middle{...};Top * t1 = new Middele;Top ...原创 2019-11-17 14:50:09 · 174 阅读 · 0 评论 -
Effective C++条款43:学习处理模板化基类内的名称
考虑以下类:template<typename Company>class MsgSender{public: ... void sendClear(...);};template<typename Company>class LoggingMsgSender : public MsgSender<Company>{public: .....原创 2019-11-10 13:53:27 · 153 阅读 · 0 评论 -
Effective C++条款42:了解typename的双重意义
考虑以下代码:template<class T> class Widget;template<typename T> class Widget;class和typename有什么不同?答案:没有不同.当我们声明template类型参数,class和typename的意义完全相同。然而C++并不总是把class和typename视为等价.有时候一定得使用typen...原创 2019-11-09 20:42:07 · 118 阅读 · 0 评论 -
Effective C++条款41:了解隐式接口和编译期多态
考虑以下函数模板:template<typename T>void doProcessing(T & w){ if(w.size()>10 && w != someNastyWidget) { T temp(w); temp.normalize(); temp.swap(w); }}现在我们该怎么描述w呢?w必须支持哪一种接...原创 2019-11-09 19:24:51 · 170 阅读 · 0 评论 -
Effective C++条款39:明智而审慎地使用private继承
考虑以下类:class Person{...};class Student:private Person{...};void eat(const person & p);void Study(const Student & s);Person p;Student s;eat(p);eat(s);其中eat(s)却会调用错误,如果类之间的继承关系是私有的,编译器不...原创 2019-11-09 17:53:18 · 166 阅读 · 0 评论 -
Effective C++条款37:绝不重新定义继承而来的缺省参数值
考虑以下类:class Shape{public: enum ShapeColor{Red, Green, Blue}; virtual void draw(ShapeColor color = Red) const = 0; ...};class Rectangle:public Shape{public: virtual void draw(ShapeColor colo...原创 2019-11-09 16:52:34 · 155 阅读 · 0 评论 -
Effective C++条款35:考虑virtual函数以外的其他选择
假设你正在写一个游戏,你打算为游戏内的人物设计一个继承体系。人物被伤害会掉血,因此你提供了一个成员函数healthValue,返回一个整数,表示人物的健康程度.由于不同的人物可能用不同的方式计算它们的掉血情况,将healthValue声明为virtual是显而易见的做法:class GameCharacter{public: virtual int healthValue()const;...原创 2019-11-09 16:21:50 · 122 阅读 · 0 评论 -
Effective C++条款34:区分接口继承和实现继承
考虑以下类:class Shape{public: virtual void draw() const = 0; virtual void error(const std::string & msg); int objectID() const; ...};class Rectangle : public Shape{...};class Ellipse : publi...原创 2019-11-09 15:20:06 · 135 阅读 · 0 评论 -
Effective C++条款33:避免遮掩继承而来的名称
考虑以下代码:int x;void someFunc(){ double x; std::cin >> x;};读取数据的语句涉的是局部变量x,而不是全局变量x,因为内层作用域的名称会遮掩外围作用域的名称。考虑以下的类:class Base{private: int x;public: virtual void mf1() = 0; virtual vo...原创 2019-11-09 14:25:06 · 139 阅读 · 0 评论 -
Effective C++条款31:将文件的编译依存关系降至最低
考虑下面的类:class Person{private: std::string theName; Date theBirthDate; Address theAddress;public: ...};如果没有取得string,Date和Address的定义式,编译无法通关。所以Person定义文件的最上方很可能存在这样的东西:#include <string>...原创 2019-11-08 21:20:17 · 214 阅读 · 0 评论 -
Effective C++条款30:透彻了解inlining的里里外外
inline函数,可以调用它又不需要承受调用函数调用索导致的额外开销。此外,编译器最优化机制通常被设计用来浓缩那些不含函数调用的代码,所有当你inline某个函数,或许编译器就因此有能力对它进行最优化。当然有利于也有弊:inline函数背后的原理是:对此函数的每一个调用都以函数本体替换之,显而易见的是,这样做很有可能增加你的目标代码大小。在一台内存有限的机器上,过度使用inline会导致程序体积...原创 2019-11-08 18:09:16 · 148 阅读 · 0 评论 -
Effective C++条款28:避免返回handles指向对象内部成分
考虑下面的类:class Point{public: Point(int x, int y); ... void setX(int newVal); void setY(int newVal); ...};struct RectData{ Point ulhc; Point lrhc;};class Rectangle{...private: std::sha...原创 2019-11-08 17:19:21 · 193 阅读 · 0 评论 -
Effective C++条款27:尽量少做转型动作
转型语法,通常有三种不同的形式。C风格的转型动作看起来像这样:(T)expression函数风格的转型动作看起来像这样:T(expression)C++还提供四种转型:const_cast<T>(expression)dynamic_cast<T>(expression)reinterpret_cast<T>(expression)stat...原创 2019-11-08 17:03:28 · 162 阅读 · 0 评论 -
Effective C++条款26:尽可能延后变量定义式的出现时间.
考虑下面函数:std::string encryptPassword(const std::string & password){ using namespace std; string encrypted; if(password.length() < MinimumPasswordLength) { throw logic_error("Password is t...原创 2019-11-08 16:03:05 · 278 阅读 · 0 评论 -
Effective C++条款25:考虑写出一个不抛异常的swap函数
在默认情况下swap可由标准程序库提供的swap算法完成,典型的实现如下:template<typename T>void swap(T& a, T& b){ T temp(a); a = b; b = temp;}考虑以下的类:class Person{private: int age; string name;public: ......原创 2019-11-08 15:10:01 · 122 阅读 · 0 评论 -
Effective C++条款24:若所有参数皆需类型转换,请为此采用non-member函数
考虑下面的类:class Rational{public: Rational(int numerator = 0, int denominator = 1); int numerator() const; int denominator() const;private: ...}假如你想实现算术运算比如乘法,可能会纠结采用成员函数、非成员函数还是友元函数.先别纠结,我们先采用...原创 2019-11-08 14:13:31 · 213 阅读 · 0 评论 -
Effective C++条款23:宁以non-member、not-friend替换member函数
假如有一个以下的类,用来表示网页浏览器,其中有一些函数用来清除下载元素高速缓冲区、清楚访问过的URLs的历史记录、以及移除系统中的所有cookies:class WebBroswer{public: ... void clearCache(); void clearHistory(); void removeCookies(); ...};许多用户想一次性执行所有这些动作,因...原创 2019-11-07 20:56:11 · 114 阅读 · 0 评论 -
Effective C++条款21:必须返回对象时,别妄想返回其引用
之前条款20说到,pass-by-reference比pass-by-value通常高效的多.可能这会导致你,什么时候都用按引用来替代传值.但是注意:所谓的引用只是给一个对象取了另一个别名, 当你见到引用时,一定要问一下自己,它另外一个名字是什么?因为引用一定是一个对象的另一个名称。考虑有以下的类:class Time{private: int hours; int minutes...原创 2019-11-07 19:38:55 · 145 阅读 · 0 评论 -
Effective C++条款20:宁以pass-by-reference-to-const替换pass-by-value
默认情况下C++以值方式传递对象至函数。除非你另外指定,否则函数参数都是以实际参数的复件位初始值。而调用端所获得也是函数返回值的一个复件。这些复件由对象的复制构造函数产出。这可能使得pass-by-value成为昂贵的操作。比如:class Person {private: string lname; string fname;public: Person(); virtua...原创 2019-11-07 18:52:27 · 102 阅读 · 0 评论 -
Effective C++条款18:让接口容易被正确使用,不易被误用
假如有这样的类:class Date{public: Date(int month, int day, int year); ...}看起来这个接口没错,但是很容易犯下至少两个错误:Date d(30,3,2019);//错误的次序Date d(2,30,1995);//应该是3,30,而不是2,30我们可以通过导入新类型来获得预防比如:struct Day{ int...原创 2019-11-07 18:07:44 · 142 阅读 · 0 评论 -
Effective C++条款17:以独立语句将newed对象置入智能指针
假如我们有这样的函数:int priority();void processWidget(std::shared_prt<Widget>pw, int priority);假如我们这样写:processWidget(std::shared_prt<Widget>(new Widget), priority());虽然我们使用对象管理式资源,上述调用却可能泄露资...原创 2019-11-07 16:37:24 · 104 阅读 · 0 评论 -
Effective C++条款15:在资源管理类中提供对原始资源的访问
在之前的条款13,我们使用智能指针保存工厂函数如:createInvestment的调用结果:std::unique_ptr<Investment>p(createInvestment());假如有一个函数来处理Investment对象,像这样:int daysHeld(const Investment* pi);如果你想这样调用:int days = daysHeld(...原创 2019-11-07 16:15:02 · 111 阅读 · 0 评论 -
Effective C++条款14:在资源管理类中小心Copying行为
之前条款13中说到,用对象来管理资源,然而并非所有资源都是基于堆,对于这种资源,智能指针往往不适合作为资源掌管者。这个时候,就需要建立自己的资源管理类。假如我们使用C API函数处理类型为Mutex的互斥对象,共有lock和unlock两个函数可用:void lock(Mutex * pm);void unlock(Mutex * pm);为了确保不会忘记将一个锁住的Mutex解锁,你...原创 2019-11-07 15:38:36 · 123 阅读 · 0 评论 -
Effective C++条款13:以对象管理资源
假设我们有这样一个类:class Investment{...};然后这个类有一个工厂函数:Investment * createInvestment();createInvestment调用端使用了函数返回的对象后,有责任删除它,现在有个f函数履行了这个 任务:void f(){ Investment * p = createInvestment(); ... delet...原创 2019-11-07 13:25:51 · 159 阅读 · 0 评论 -
Effective C++条款12:复制对象的所有成分
假设有以下的类这看起来没问题,但是当Cow类多了一个成员变量 :ageclass Cow {private: char name[20]; char * hobby; double weight; int age;public: Cow(); Cow(const char * nm, const char * ho, double wt); Cow(const Cow ...原创 2019-11-07 12:57:46 · 166 阅读 · 0 评论 -
Effective C++ 条款11:在operator=中处理“自我赋值”
条款11: 在operator=中处理“自我赋值”之前我们写类的operator=时候常常会这样写:Cow & Cow::operator = (const Cow & c){ if (this == &c) { return *this; } delete[] hobby; strcpy_s(name,20, c.name); int len = s...原创 2019-11-07 12:38:10 · 154 阅读 · 0 评论 -
Effective C++条款05-条款10
条款05:了解C++默默编写并调用哪些函数C++类目前有八种默认的函数:1.默认构造函数2.默认析构函数3.默认复制(拷贝)构造函数4.默认重载赋值运算符函数5.默认重载取址运算符const函数6.默认重载赋值运算符函数7.默认移动构造函数8. 默认重载移动赋值操作符函数条款06:若不想使用编译器自动生成的函数,就该明确拒绝一般而言,如果你不希望类支持某一个特定技能,只要不声...原创 2019-11-06 19:09:44 · 207 阅读 · 0 评论 -
Effective C++条款04:确定对象被使用前已被初始化
int x;上述代码某些情况下x被初始化,某些情况下却不会.读取未初始化的值会导致不明确的行为。有一些规则来规定对象的初始化动作何时发生,何时不发生。但是这些规则比较复杂,所以最好的办法是:永远在使用对象之前先将它初始化.对于内置类型,我们可以这样做:int a = 0;double d = 10;const char * Text = "A C-Style String";对...原创 2019-11-06 17:09:09 · 176 阅读 · 0 评论 -
Effective C++条款03:尽可能使用const
如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量.有些程序员会将关键字const写在类型之前,有些人写在类型之后。这两种写法的意义相同,比如:假如有以下的类:这个类将operator[]声明为const成员函数,而该函数却返回一个引用指向对象内部值.这种情况导致了所谓的logical constness.一个const成员函数可以修改它所处理...原创 2019-11-06 16:16:19 · 195 阅读 · 0 评论 -
Effective C++条款02:尽量以const,enum,inline替换#define
#define ASPECT_RATIO 1.653当你做出以上的事情,ASPECT_RATIO可能从未被编译器看见,于是记号ASPECT_RATIO就有可能没进入记号表内。当你运用此常量但获得一个编译错误信息时,可能会带来疑惑,这个错误信息也许会提到1.653而不是ASPECT_RATIO。解决方法是用常量替换上述的宏:const double AspectRatio = 1.653;...原创 2019-11-06 15:25:27 · 155 阅读 · 0 评论