Effective C++ 条款38

本节条款相对简单,通俗的意思就是说 “有一个”和“是一个”的区别,以及在应用域(application domain)和实现域之间的区别(implementation domain)。

如下代码:

1.

class Bird//鸟
{
public:
    //............
};

class ostrich:public Bird//鸵鸟
{
public:
    //............
};

这段代码是指“是一个”的关系,鸵鸟也是鸟,鸵鸟有鸟的各种属性。

2.

class Name
{
public:
    //..............
};

class Person
{
public:
    //.......
private:
    Name name;
};

这段代码是指“有一个”的关系,名字是一个类,每个人都有一个名字。

3.

再看一下书上的例子:

#include <iostream>
#include <list>
using namespace std;
template <class T>
class MySet
{
private:
    list<T> MyList;

public:
    int Size() const
    {
        return MyList.size();
    }

    bool IsContained(T Element) const
    {
        return (find(MyList.begin(), MyList.end(), T) != MyList.end());
    }

    bool Insert(T Element)
    {
        if (!IsContained(T))
        {
            MyList.push_back(Element);
            return true;
        }
        else
        {
            return false;
        }
    }

    bool Remove(T Element)
    {
        list<T>::iterator Iter = find(MyList.begin(), MyList.end(), T);
        if (Iter != MyList.end())
        {
            MyList.erase(Iter);
            return true;
        }
        else
        {
            return false;
        }
    }
};

这是在实现域的体现,我们在编程的时候选取的结构是为我们程序功能服务的,所以我们要改造已有的结构,以适应我们的需求。如上,list结构可能会存储相同的元素,但是set类要求不能存储相同元素,所以为了让list结构为我们的程序服务,我们在程序中限定了list的操作,以达到我们的需求。

时间: 2024-12-24 04:15:48

Effective C++ 条款38的相关文章

Effective C++ 条款38 通过复合塑模出has-a或&quot;根据某物实现出&quot;

1. public继承体现is-a关系,要求接口的完全继承,而复合体现has-a或"根据某物实现出"的关系. 当复合发生在应用域(世界中的某些事物,如人,汽车,一张剪辑视频画面等)内的对象之间,表现出has-a关系,当发生在实现域(细节上的人工制品,如缓冲区,互斥器,查找树等)内,表现出is-implementation-in-terms-of(根据某物实现出)的关系. 2. 对于is-implementation-in-terms-of,例如基于list实现set(当空间比时间更重要

Effective C++:条款38:通过复合塑模出has-a或“根据某物实现出”

(一) public继承是"is-a"的关系,而复合有"has-a"或"根据某物实现出(is-implemented-in-terms-of)"的意思--当复合发生在应用域内的对象之间,表现出has-a关系:当它发生于实现域内则是表示"根据某物实现出"的关系. 应用域部分,相当于你塑造的世界中的某些事物,例如人,汽车等. 后者的对象则是实现细节人工产品(这产品现实世界中是没有的),像什么mutex,list,container

More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral) const static class members设定初值"的能力. 2). 扩充了Templates的特性

Effective C++ 条款39 明智而审慎地使用private继承

1. public继承表明is-a的关系,要求接口的完全继承,而private继承表明"根据某物实现出的关系",要求仅仅继承实现,private继承有两个规则: 1). 经由private继承而来的基类的所有成员在派生类中都会变成private属性 2). 由于1),编译器不允许将派生类转为基类以防止对派生类private成员的非法访问. 2. 由条款38,private继承和复合具有相同作用——"根据某物实现出".两者之间,要尽可能使用复合,除非必要情况.必要情况

effective c++ 条款4 make sure that objects are initialized before they are used

1 c++ 类的数据成员的初始化发生在构造函数前 class InitialData { public: int data1; int data2; InitialData(int a, int b) { data1 = a: //this is assignment data2 = b; //this is assignment } /* InitialData(int a, int b):data1(a),data2(b) //this is initial {} */ } 2 不同cpp文

More Effective C++ 条款34 如何在一个程序中结合C++和C

1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题. 2. 在1的基础上,要结合使用C++和C的模块,主要有以下几点需要注意: 1). name mangling(名称重整) Name mangling是C++用于支持函数重载的机制,它对重载的函数名称进行一定改变,使得每个函数

Effective C++ 条款3 尽可能用const

1. const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体.用const修饰指针,如果const出现在*之前,表明指针不能更改所指向的对象的内容,如果const出现在*之后,表明指针只能指向同一块内存.另外int const*p和const int*p含义相同.如果对象成员有普通指针,那么构造该类的一个const对象时,const修饰使得该指针只能指向同一块内存,但指针指向的内容可以改变. 2. 将某些东西声明为const可以帮助编译器侦测出错误用法. 3. 编译器强制实

effective c++ 条款13 use object to manage resources.

请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现. 简单说就是用object来管理资源. 以内存资源为例 class Investment {}; Investment* creatInvestment(){...} // factory function to produce investment object void main() { Investment* pInv = creatInvestment();//call t

effective c++ 条款3 use const whereever you can

1 const 传达的意思应该是这个变量是常量不能更改 2 const 在 * 左边表示数据是const,在右边表示指针是const // char greeting[] = "hello"; char* p = greeting; //const *: const data //* const: const pointer char const *p1 = greeting; // const data char * const p2 = greeting; // const poi