void f(int* a) { cout <<* a << endl; } int main() { shared_ptr<int> p(new int(3)); f(p.get());//shared_ptr<int> 是无法隐式转换成int* ,但用.get()就可以把她转换回原始指针 }…
学过基本程序课的同学都知道,inline是内联的关键字,它可以建议编译器将函数的每一个调用都用函数本体替换.这是一种以空间换时间的做法.把每一次调用都用本体替换,无疑会使代码膨胀,但可以节省函数调用的成本,因为函数调用需要将之前的参数以堆栈的形式保存起来,调用结束后又要从堆栈中恢复那些参数. 但注意inline只是对编译器的一个建议,编译器并不表示一定会采纳,比如当一个函数内部包含对自身的递归调用时,inline就会被编译器所忽略.对于虚函数的inline,编译器也会将之忽略掉,因为内联(代码展…
还是举书上的例子: void PrettyMenu::changeBackground(std::istream& imgSrc) { lock(&mutex); delete bgImage; ++ imageChanges; bgImage = new Image(imgSrc); unlock(&mutex); } 这段代码大致的意思就是改变背景图片,删掉旧的背景图片,记录修改次数,然后创建新的背景图片.考虑到多线程操作,所以这里用了lock和unlock. 但这里会出现问题…
这个条款书上内容说的篇幅比较多,但其实思想并不复杂.只要能理解三句话即可,第一句话是:纯虚函数只继承接口:第二句话是:虚函数既继承接口,也提供了一份默认实现:第三句话是:普通函数既继承接口,也强制继承实现.这里假定讨论的成员函数都是public的. 这里回顾一下这三类函数,如下: class BaseClass { public: ; // 纯虚函数 void virtual ImpureVirtualFunction(); // 虚函数 void CommonFunciton(); // 普通…
举个例子: class Student { private: int ID; string name; public: string& GetName() { return name; } }; 这是一个学生的类,类里面有两个成员变量,一个是学生ID,用整数表示,另一个是姓名,用string表示.有一个公有的方法GetName(),获得学生的名字,根据条款20所说的,使用引用可以防止资源不必要地拷贝,那么在返回值这边就用string&.但现在问题来了,这个函数只是想返回学生的姓名,并不想用…
比如有一个Base类和一个Derived类,像下面这样: class BaseClass {…}; class DerivedClass : public BaseClass {…}; 因为是父类与子类的关系,所以可以这样写: DerivedClass *d; BaseClass *b = static_cast< BaseClass *>d; // 用C风格直接是 b = (BaseClass*) d; 我们可以弄一个简易的Shared型智能指针类,如果直接像下面这样写: template…
在之前的理论上调用对象的operator=是这样做的 void swap(A& x) { std::swap(a, x.a); } A& operator=(const A& a) { A temp = a; swap(temp); return *this; } 上面的代码看起来有点麻烦,但它是一个好办法. 我们可以在std里面特化我们的swap class A { private: int a; public: void swap(A& x)//防止写成friend,我…
举书上的例子,考虑一个virtual函数的应用实例: class GameCharacter { private: int BaseHealth; public: virtual int GetHealthValue() const // 返回游戏人物的血量 { return BaseHealth; } int GetBaseHealth() const { return BaseHealth; } }; class KnightBoss : public GameCharacter { pub…
本章开始讨论内存分配的一些用法,C/C++内存分配采用new和delete.在new申请内存时,可能会遇到的一种情况就是,内存不够了,这时候会抛出out of memory的异常.有的时候,我们希望能够调用自己定制的异常处理函数,这就是本条款要说的. 在声明于<new>的一个标准程序库中,有如下的接口: namespace std { typedef void (*new_handler)(); new_handler set_new_handler(new handler p) throw(…
作为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子: template <int N> struct Factorial { enum { value = N * Factorial<N - >::value }; }; // 特化版本 template <> > { enum { value = }; }; int main() { cout << Fac…