学习笔记
Black.Spider
宝剑锋从磨砺出,梅花香自苦寒来
展开
-
C++对象模型之虚表指针
那么现在来思考下,这种情况下,对于派生类的对象而言,一个虚表和一个虚表指针可以实现多态吗?答案是否定的,因为在只有一个虚表的情况下,对于派生类中Base2的虚函数而言,其在虚表中的偏移值不是从0开始的,而Base2本身作为父类,其虚表的起始偏移值是0,这样子类和父类的虚函数在虚表中偏移值就会不同,所以没法实现运行期多态。由于派生类和基类中的虚函数在虚函数表中的偏移位置是相同的,因此在编译期只需要指定其偏移值即可,在运行期通过虚表指针和偏移值即可在虚函数表中找到对应位置的虚函数。原创 2020-08-10 15:39:56 · 864 阅读 · 0 评论 -
C++对象模型之Data语意学
数据成员的绑定在早期的编译器上,,如果一个类中的成员有一个和全局对象同名的数据成员,那么当在成员函数中访问其数据成员时,就有可能被绑定成了全局对象,而非数据成员。在现有的编译器中对成员函数本身的分析直到整个类的声明都出现了才开始,因此最后的数据成员的绑定会达到预期结果。也就是不会出现上述情况。然而,对于成员函数的参数列表却并不是这样的。如下所示:typedef int Length;class Bar{public: void setVal(Length val) { _val = val; }原创 2020-08-05 23:14:09 · 170 阅读 · 0 评论 -
《Effective C++》总结
1:视C++为一个语言联邦c++是多重范型编程语言,视c++包括4种次语言: 1:C; 2:Object-Oreinted C++;3:Template C++;4:STL(template程序库,包括容器、迭代器、算法和函数对象)。2:尽量以const,enum,inline替换 #defineconst: #define直接替换导致名称从未被编译器看到const定义常量也可能比#define导致较小量的码#define不重视作用域,故不提供封装性enum: 取一个const的地址转载 2020-08-05 12:04:45 · 202 阅读 · 0 评论 -
C++对象模型之拷贝构造函数
Default Memberwise Initialization如果类没有提供一个显式的copy constructor,当类对象以相同的类的另一个对象作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的数据成员的值,从某个对象拷贝一份到另一个对象身上,不过它并不会拷贝其中的member class object,而是以递归的方式施行memberwise initialization。Bitwise Copy Seman原创 2020-07-31 21:18:14 · 174 阅读 · 0 评论 -
C++对象模型之默认构造器
带有Default Constructor的Member Class Object如果一个类没有任何constructor,但它内含一个member object,而后者有default constructor,那么这个类的implicit default constructor就是nontrivial,编译器会为此合成出一个default constructor。只是这个合成操作只有在constructor真正需要被调用时才会发生。示例如下:class Foo {public: Foo()};cla原创 2020-07-31 18:07:31 · 228 阅读 · 0 评论 -
Effective C++之条款54
条款54:让自己熟悉包括TR1在内的标准程序库 C++98列入的C++标准 程序库有哪些主要成分:STL(Standard Template Library),覆盖容器、迭代器、算法、函数对象、各种容器适配器和函数对象适配器。Iostreams,覆盖用户自定缓冲功能、国际化I/O,以及预先定义好的对象cin,cout,cerr和clog。国际...原创 2019-11-22 23:21:03 · 167 阅读 · 0 评论 -
Effective C++之条款41、42
条款41:了解隐士接口和编译期多态 Template及泛型编程的世界,与面向对象有根本上的不同,它存在隐式接口和编译期多态。如下代码:template<typename T>void doProcessing(T& w){ if (w.size() > 10 && w != someNastyWidge...原创 2019-11-09 10:59:42 · 216 阅读 · 0 评论 -
Effective C++之条款37、38
条款37:绝不重新定义继承而来的缺省参数值 我们只能继承两种函数:virtual和non-virtual函数。然而重新定义一个继承而来的non-virtual函数永远是错误的(条款36),所以本条款的讨论局限于“继承一个带有缺省参数值的virtual函数”。 virtual函数系动态绑定,而缺省参数值却...原创 2019-11-06 22:48:41 · 205 阅读 · 0 评论 -
Effective C++之条款35、36
条款35:考虑virtual函数以外的其他选择 假设我们正在设计一款游戏,剧中人物被伤害而降低健康状态的情况并不罕见,因此我们要为此写一个helthValue函数,他返回一个代表健康值的整数,由于不同的人物可能以不同的方式计算他们的健康值,所以可以将healthValue声明为virtual函数:class GameCharacter {publ...原创 2019-11-06 20:11:36 · 214 阅读 · 0 评论 -
Effective C++之条款33、34
条款33:避免遮掩继承而来的名称原创 2019-11-05 23:31:02 · 200 阅读 · 0 评论 -
Effective C++之条款31、32
条款31:将文件间的编译依存关系降低至最低如果使用object references或object pointers可以完成任务,就不要使用objects。你可以只靠一个类型声明式子就定义出指向该类型的1references和pointers;但如果定义式某类型的objects,就需要用到该类型的定义式。如果能够,尽量以class声明式替换class定义式。注意,当你声明一个函数而它用到某个...原创 2019-10-24 22:31:53 · 233 阅读 · 0 评论 -
Effective C++之条款29、30
条款29:为“异常安全”而努力是值得的 假设有个class用来表现夹带背景图案的GUI菜单。这个class希望用于多线程环境,所以它有个互斥器(mutex)作为并发控制(concurrency control)之用:class PrettyMenu {public: ... void changeBackground(std::istream...原创 2019-10-21 16:01:34 · 207 阅读 · 0 评论 -
Effective C++之条款27、28
条款27:尽量少做转型动作 C++规定的设计目标之一是,保证“类型错误”绝不可能发生。这是一个极具价值的保证。C++提供四种新式转型(常常被称为new-style或C+±style casts):const_cast<T>(expression)dynamic_cast<T>(expression)reinterpret...原创 2019-10-21 14:02:24 · 201 阅读 · 0 评论 -
Effective C++之条款25、26
条款25:考虑写出一个不抛出异常的swap swap是个有趣的函数。原本他只是STL的一部分。而后成为异常安全性编程(见条款29)的脊柱,以及用来处理自我赋值可能性(见条款11)的一个常见机制。STL中swap的实现如下:namespace std { template<typename T> void swap(T& a,...原创 2019-10-19 13:06:37 · 255 阅读 · 0 评论 -
Effective C++之条款23、24
条款23:宁以non-member、non-friend替换member函数 假设有这样一个类如下所示:class WebBrowser { public: ... void clearCache(); void clearHistory(); void removeCookies();}; &nb...原创 2019-10-16 13:55:42 · 175 阅读 · 0 评论 -
Effective C++之条款21、22
条款21:必须返回对象时,别妄想返回其reference 考虑一个用以表现有理数的class,内涵一个函数用来计算两个有理数的乘积:class Rational {public: Rational(int numerator = 0, int denominator = 1); ...private: int n, d;friend...原创 2019-10-15 14:33:23 · 336 阅读 · 0 评论 -
Effective C++之条款19、20
条款19:设计class犹如设计type 如何设计搞笑的classes呢?几乎每一个class都要求你面对以下提问:新type的对象应该如何被创建和销毁? 这会影响到你的class的构造函数和析构函数以及内存分配函数和释放函数的设计。对象的初始化和对象的赋值该有什么的差别? 这个答案决定你的构造函数和赋值操作符的行为,以及期间的差异。很重的是别...原创 2019-10-15 10:24:55 · 164 阅读 · 0 评论 -
Effective C++之条款17、18
条款17:以独立语句将newed对象置入智能指针 假设我们有个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理:int priority();void processWidget(shared_ptr<Widget> pw, int priority());  ...原创 2019-10-14 16:27:34 · 160 阅读 · 0 评论 -
Effective C++之条款15、16
条款15:在资源管理类中提供对原始资源的访问 资源管理类是对抗资源泄露的有效手段。在完美的系统中,我们将依赖这样的类来处理和资源之间的所有互动,而不是直接手动处理原始资源。然而许多APIs直接指涉资源。举个例子,条款13中,使用智能指针如auto_ptr或shared_ptr保存factory函数如createInvestment的调用结果:sha...原创 2019-10-13 23:04:16 · 311 阅读 · 0 评论 -
Effective C++之条款13、14
条款13:以对象管理资源 由工厂函数返回的指向对象的指针,我们必须在不使用它时,释放资源。但是很多时候依赖手动释放并不是一件好事,因为程序可能在手动释放之前就return或抛出异常,为确保资源总是被正确释放,我们需要将资源放进对象内,当对象离开作用域,该对象的析构函数会自动释放那些资源。 许多资源被动态...原创 2019-10-11 15:54:08 · 112 阅读 · 0 评论 -
Effective C++之条款11、12
条款11:在operator=中处理“自我赋值” “自我赋值”发生在对象被赋值给自己时:class Widget {...};Widget w;...w = w; //赋值给自己 这样的赋值在编译器看来是合法的。此外赋值动作可能并不明显,例如:a[i] = a[j]; ...原创 2019-10-10 15:20:11 · 300 阅读 · 0 评论 -
Effective C++之条款09、10
条款09:绝不在构造和析构过程中调用virtual函数 假设有这样一个class继承体系,用来模拟股市交易如买进、卖出的订单等。这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志中也需要创建一笔适当记录。下面是一个看起来颇为合理的做法:class Transaction {public: Transaction(); virtua...原创 2019-10-10 10:52:05 · 252 阅读 · 0 评论 -
Effective C++之条款07、08
条款07:为多态基类声明virtual析构函数 有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes作为不同的计时方法:class TimeKeeper {public: TimeKeeper(); ~TimeKeeper(); ...};class AtomicCloc...原创 2019-10-09 21:11:17 · 167 阅读 · 0 评论 -
Effective C++之条款05、06
条款05:了解C++默默编写并调用哪些函数 当声明一个空类时,编译器会为它声明一个copy构造函数、一个copy assignment操作符和一个析构函数。此外如果没有声明任何构造函数,编译器也会为你声明一个default构造函数。因此,如果你写下:class Empty();这就好像你写下这样的代码:class Empty{public:...原创 2019-10-07 20:58:12 · 141 阅读 · 0 评论 -
Effective C++之条款04
条款04:确定对象被使用前已先被初始化 读取未初始化的值会导致不明确的行为。对于无任何成员的内置类型,必须完成手工初始化任务。至于内置类型以外的任何其他东西,初始化责任落在构造函数身上。确保每一个构造函数都将对象的每一个成员初始化。重要的是别混淆了赋值和初始化:ABEntry::ABEntry(const std::string & name, const std::stri...原创 2019-10-06 20:59:45 · 176 阅读 · 0 评论 -
Effective C++之条款02、03
条款02:尽量以const,enum,inline替换#define#define ASPECT_RATIO 1.653 上述定义由预处理器处理,因此记号ASPECT_RATIO可能没进入记号表(symbol table)内。于是当你运用此常量但获得一个编译错误时,可能会带来困惑,因为错误提到的是1.653而不是ASPECT_RATIO。 解决的办法是以一个常量替换...原创 2019-10-06 16:09:55 · 200 阅读 · 0 评论