条款 13 :以对象管理资源 例:      voidf()      {           Investment *pInv = createInvestment();           ...                  //这里存在诸多“不定因素”,可能造成delete pInv:得不到执行,这可能就存在潜在的内存泄露.          delete pInv;      }  解决方法:把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放.     许…
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> using namespace std; class Investment { public: }; class InvestmentFactory { public: virtual Investment* createInvestment() { Investment * inV = NULL; return…
问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基础上. Demo: root class Investment: class Investment { ... }; // 工厂函数 Investment* createInvestment(); // 返回指向一个Investment或者其子类的对象,调用者有责任删除它 // 考虑如下调用 voi…
一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. class A { public: A(const string &str) { m_str = str; //m_str 的初始化是在进入构造函数中用户自定义编写代码前完成的,所以这里的m_str = str,执行的不是初始化,而是赋值 } private: string m_str; }; 在数据成员的默认初始化,然后…
一.C++明确指出:当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未定义——实际执行时通常发生的是对象的derived成分没有被销毁!(注:使用基类引用派生类的方式使用多态,由于引用只是对原对象的一个引用或者叫做别名,其并没有分配内存,对其引用对象内存的销毁,将由原对象自己负责,所以使用引用的时候,如果析构函数不为virtual,那么也不会发生derived成员没有销毁的情况) 例如: class b…
尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义的常量,会进入记号表,使用到该常量的地方使用的同一份,使目标码的量更小点: const可以在类中定义一个class专属常量,其作用域限制于class内.(注:如果一个class专属常量又是static又是整数类型,需要特殊处理.主要不取其地址,则,可以声明并使用但是无须提供定义式.如果,需要取地址,…
创建和销毁对象 一.静态工厂方法代替构造器 静态工厂方法的优缺点 优点: 1.可以自定义名称(可以将功能表述的更加清晰) 2.不必每次调用都创建新的对象(同一对象重复使用) 3.返回的类型可以是原返回类型的任何子类型对象 4.简化创建对象时的代码 缺点: 1.如果不含有公开的构造器,就不能被子类化 2.和普通的静态方法没有区别 二.遇到多个构造器参数时考虑用构建器 如果我们现在需要编写一个描述客户信息的类,在客户的信息中名字是一定有的,其他的信息都是可能用,我们使用三种方法去完成: 1.重叠构造…
一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const string& name):m_name(name) {} private: //拒绝copy和赋值,声明为private,并且只声明不实现 A(const A&); A& operator=(const A&); private: string m_name; }; 二.对于拒绝赋值的…
一.如果用户没有提供构造函数.copy构造函数.copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来.编译器生成的这些函数都是public且inline. 当你写下这样一个类的时候: class Empty {}; 如果上述的函数是被需要的话,那么编译自动会帮你把类修改为,如下: class Empty { public: Empty() {...}; //这里进行数据成员的默认初始化,如果有虚函数的话,这里还会配置好虚函数表 Empty(cons…
1 ACL权限 (1)简介和开启方式 ACL(Access Control List)权限的目的是在提供传统的owner.group.others的read.write.execute权限之外的局部权限设定.ACL可以针对单个用户,单个文件或目录进行r.w.x的权限设定.特别适用于需要特殊权限的使用. 1)查看分区的ACL权限是否开启 查看指定分区详细文件系统信息的命令为: dumpe2fs –h 指定分区 其中,-h选项表示只显示超级块中的信息,而不显示磁盘块组的详细信息. 例:查看根分区是否…