zoukankan      html  css  js  c++  java
  • 名字隐藏深入研究what's in class (什么“类”的“接口”/一部分)

    类里面有什么? 类包含那几部分??

    Class(定义)
      一个class描述了一组数据操作这些数据的函数。
                 “函数”是否为必须为“成员”函数呢????。(答案是 ‘否’)

    接口原则
      对于一个类X,所有的函数,包括自由函数,只要同时满足
      (a) “提到”X,并且
      (b) 与X“同期提供” 那么就是X的逻辑组成部分,它们形成了X的接口。-----“一起提供”的一种有用的诠释方式是“呈现在相同的头文件中/或者名字空间中”。如果函数和类出现在相同的头文件中,那么根据依存性,他是类的“一部分”。如果函数和类出现在相同的名字空间中,那么从对象使用和名字查找的意义上讲,他是类的“一部分”。(建议:将类的所有“接口”放入相同的名字空间----)

      (1)、根据定义,所有成员函数都是X的“组成部分”:
         (a) 每个成员函数都必须“提到”X(非static的成员函数有一个隐含参数,类型是X*(WQ:C++标准制定后,精确地说,应该是X* const)或const X*(WQ:const X* const);static的成员函数也是在X的作用范围内的);并且
         (b) 每个成员函数都与X"同期提供"
         (2)、自由函数:自由函数f(...,X) 如果
               (a). f“提到”X。
               (b). 如果f也与X“同期提供”(例如,它们存在于相同的头文件和/或命名空间中),根据接口原则,f是X的逻辑组成部分,因为它是X的接口的一部分。

    “组成部分”的关联强度 
          虽然接口原则说明成员和非成员函数都是class的逻辑“组成部分”,但它并没说成员和非成员是平等的。例如,成员函数自动得到class内部的全部访问权限,而非成员函数只有在它们被申明为友元时才能得到相同的权限。同样,在名称搜索(包括Koenig lookup)中,C++语言特意表明成员函数与class之间有比非成员函数更强的关联关系:

    Koenig 查找规则

        1.如果提供了一个类类型的函数参数(f(namesapce A::X)),那么在查找正确的函数时,编译器将考虑包含参数类型的名字空间内陪陪的函数名 ---(简化版)

        2.Koenig查找规则规定:如果你提供类类型的函数参数,那么为了找到这个函数名字,编译器不只是在平常的地方(局部作用域)进行查找,而且要求在包含参数类型的名字空间查找。注:虽然可以到类名字空间查找,但不仅仅在类名字空间查找,所以最后调用的函数不一定是类名字空间的函数。如果同一名字空间内提供一个类或者一个提及这个类的自由函数,那么编译器将在这两者之间施加一种强关系。

        3. 名字隐藏与查找
    编译器遇到函数调用时,首先,他在最接近的作用域内查找(当前对象/名字空间),创建他所能发现的所有名字相同的函数列表(不管他是否可以访问,甚至是否带有正确的参数,不管是否虚函数—编译期间是静态的)。只有当前完全没有找到任何合适的函数时才“向外”继续在下一个封闭的作用域内查找,最后直到他查找完所有作用域而没有发现一个具有相同名字的函数,或者发现一个至少包含一个候选函数的作用域。如果编译器发实现一个作用域包含有一个或多个候选函数,那么编译器将停止查找,执行重载解析,应用访问规则来处理发现的候选函数。
         根据这个规则,类相关的部分应该放入同一个名字空间 即:如果将一个类放入一个名字空间内,那么一定将是哦有点辅助函数和操作符也放入相同的名字空间。否则,根据 接口规则和Koenig查找,你的代码将发现令人奇怪的现象。


    参考:
    http://www.gotw.ca/gotw/030.htm
    http://www.wangchao.net.cn/bbsdetail_25503.html

  • 相关阅读:
    (转)Openldap相关精品文章
    (转)一条SQL更新语句是如何执行的
    Mysql5.7不区分大小写设置
    为什么Kafka那么快,明显领先其他mq?
    Linux误挂载到根目录出现问题!!!!!!!!!!!!!!!
    什么是跨域?解决跨域的六种方法。
    Nginx常用rewrite跳转重定向实例
    Python概念-禁锢术之__slots__
    Python概念-Item系列(林海峰教的)
    Python练习-基于授权方式包装list之与根儿哥必有一战
  • 原文地址:https://www.cnblogs.com/yaozhongxiao/p/1578309.html
Copyright © 2011-2022 走看看