《编程原本 》一1.6 规范过程

    xiaoxiao2022-05-26  189

    1.6 规范过程

    一个过程是规范的,当且仅当将其输入替换为任何相等的对象,它给出的结果与以前相等.就像值类型一样,在定义一个对象类型时,必须在如何实现类型里的相等,以及哪些过程应该具有规范性方面有一种统一的考虑.练习1.1请将规范的概念扩展到过程的输入输出对象(即那些既读又修改的对象).虽然规范性应该是最基本的选择,也有些因素要求有非规范过程.1.返回一个对象的地址的过程;例如,内部函数addressof.

    2.返回由真实世界的状态确定值的过程,如返回时钟或其他设备的值.

    3.返回依赖于自己拥有的状态的值的过程;例如伪随机数生成器.

    4.返回与一个对象的表示相关的某些属性的值的过程,例如为数据结构保留的存储量.

    函数式过程(functionalprocedure)是在规范类型上定义的一类规范过程,它们有一个或几个直接输入和一个作为过程结果的返回值.函数式过程的规范性使我们可以采用两种技术为其传递输入.如果参数的规模较小,或者过程里需要参数的可修改拷贝,那么可以用值的方式传递它,做出参数的一个局部拷贝.否则可以用常量引用的方式传递它.函数式过程可以实现为C++的函数、函数指针或者函数对象.4 下面是一个函数式过程:

    int plus 0(int a, int b) { return a + b; }

    下面是一个语义等价的函数式过程:

    int plus 1(const int& a, const int& b) { return a + b; }

    下面过程的语义也与上面两个等价,但它不是函数式的,其输入和输出参数都是间接传递的:

    void plus 2(int* a, int* b, int* c) { *c = *a + *b; }

    在plus2里,a和b是输入对象,c是输出对象.函数式过程的概念是语法性质而不是语义性质:按我们的术语,plus2是规范的但不是函数式的.4.C++ 的函数不是对象,不能作为参数传递;C++函数指针和函数对象是对象,可以作为参数传递.一个函数式过程的定义空间(de.nitionspace)是其预设的可能输入值集合的一个子集.函数式过程对于其定义空间里的输入总终止;而对超出其定义空间的输入,它可能不终止,也或许不能返回有意义的值.同源的(homogeneous)函数式过程的输入对象都属于同一个类型.同源函数式过程的定义域(domain)是其输入的类型.我们并不把非同源的函数式过程的定义域说成是其输入类型的直积,而是个别地讨论过程的各个输入类型.一个函数式过程的值域(codomain)是其输出的类型.函数式过程的结果空间(resultspace)是其值域的一个子集,是该过程从其定义空间取得输入后返回的所有可能值的集合.考虑函数式过程

    int square(int n) { return n * n; }

    其定义域和值域都是int,其定义空间是平方值在此类型里可以表示的所有整数的集合,而其结果空间是这个类型里可以表示的平方整数的集合.

    练习1.2假设int 是32-位的模二补码类型,请精确给出上面函数式过程的定义空间和结果空间.

    相关资源:七夕情人节表白HTML源码(两款)

    最新回复(0)