随笔分类 - effective c++
摘要:条款5:了解c++默默编写并调用哪些函数 如果自己没声明,编译器会声明一个copy构造函数,一个copy赋值操作符和一个析构函数。此外,如果没有声明任何构造函数,编译器会声明一个default构造函数(如果已经声明了构造函数,编译器不会创建default构造函数)。编译器生成的所有这些函数都是pub
阅读全文
摘要:条款49: 了解new-handler的行为 operator new 和 operator delete只适合用来分配单一对象。array所用的内存由operator new[]分配出来,并由operator delete[] 释放。 1、了解new-handler的行为 当operator ne
阅读全文
摘要:模板元编程:在c++编译器内执行并于编译完成时停止执行 1.了解隐式接口和编译期多态 面向对象编程总是以显式接口(由函数名称、参数类型和返回类型构成)和运行期多态(虚函数)解决问题 模板及泛型编程:对template参数而言,接口是隐式的,基于有效表达式的约束,而多态则是通过模板实例化和函数重载解析
阅读全文
摘要:1.让接口容易被正确使用,不易被误用 避免无端与内置类型不兼容,提供行为一致的接口 2.设计class犹如设计type 3.以pass-by-reference-to-const替换pass-by-value pass-by-reference-to-const比较高效(避免了copy构造),当一个
阅读全文
摘要:1.尽可能延后变量定义式的出现时间 应该延后变量的定义,直到能够给它初值为止.这样不仅能够避免构造(和析构)非必要对象,还可以避免无意义的default构造行为 方法A:一个构造函数 + 1个析构函数 + n个赋值操作 方法B:n个构造函数 + n个析构函数 通常采用方法B,方法A中w的作用域比做法
阅读全文
摘要:1.确定你的public继承塑造出is-a关系 public继承意味着is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived classes对象也都是一个base class对象,反过来不成立。 2.避免隐藏继承而来的名称 c
阅读全文
摘要:以对象管理资源的观念常被称为“资源取得时机便是初始化时机”(RAII) auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一对象,否则对象会被删除多次,行为未定义 auto_ptr有一个性质:若通过拷贝构造函数或拷贝赋值运算符复制它们,它们会变成NULL,
阅读全文
摘要:class Base {public: virtual void f(int x);};class Derived: public Base {public: virtual void f(double *pd);};Derived *pd = new Derived;pd->f(10); ...
阅读全文
摘要:Directory tempDir; // 临时文件目录 现在,初始化顺序的问题变得很明显了:除非theFileSystem在tempDir之前被初始化,否则,tempDir的构造函数将会去使用还没被初始化的theFileSystem。但theFileSystem和tempDir是由不同的人在不同的
阅读全文
摘要:如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:class Empty{};和你这么写是一样的:cla...
阅读全文
摘要:第一个规则是,和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象(如Student)转换成基类对象(如Person)第二个规则是,从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员,即派生类对象不能访问基类的所有成员class person{}...
阅读全文
摘要:· 当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。· 当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。下面的代码通过定义一个链表来实现Stack类,假设堆栈的对象类型为T:templateclass stack{public: stack(); ~st...
阅读全文
摘要:基类指针不能调用派生类的独有的成员,即使基类指针指向派生类对象,因为编译器是根据指针的静态类型来确定调用对象在内存中占据的空间的。此时可以使用static_cast来转换,但不要这么做,因为向下转换难看、容易导致错误,而且使得代码难于理解、升级和维护,static_cast不会进行类型检查,即使指针...
阅读全文
摘要:虚函数是动态绑定而缺省参数值是静态绑定的,当基类和派生类对同一个虚函数设置缺省参数值时,只有基类的缺省参数值起作用。对象的静态类型是指你声明的存在于程序代码文本中的类型,对象的动态类型是由它当前所指的对象的类型决定的。即,对象的动态类型表示它将执行何种行为。虚函数是动态绑定的,意思是说,虚函数通过哪...
阅读全文
摘要:作为类的设计者,有时希望派生类只继承成员函数的接口(声明);有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现;有时则希望同时继承接口和实现,并且不允许派生类改写任何东西。class Shape {public: virtual void draw() const = 0; virtu...
阅读全文
摘要:class Person {public: Person(const string& name, const Date& birthday, const Address& addr, const Country& country); virtual ~Person(); ......
阅读全文
摘要:调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。当程序运行到某个节点时,如果发现有函数调用语句(函数要事先声明或者事先定义),程序...
阅读全文
摘要:// 此函数太早定义了变量"encrypted"string encryptPassword(const string& password){ string encrypted;//默认构造函数初始化 if (password.length() < MINIMUM_PASSWORD_LENGTH...
阅读全文
摘要:先看第一种情况:返回一个局部对象的引用。它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的。也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的。所谓生命空间,是指它们所在的函数体。当函数返回时,程序的控制离开了这个空间,所以函数内部所有的局部对象被自动销毁。因此,如果返回...
阅读全文
摘要:假设b是一个const string对象:class string {public: string(const char *value); // 具体实现参见条款11 ~string(); // 构造函数的注解参见条款m5 opera...
阅读全文