当前位置:编程学习 > C/C++ >>

第17章 用于大型程序的工具(11)

17.2.5 类、命名空间和作用域

1. 实参相关的查找与类类型形参

接受类类型形参(或类类型指针以引用形参)的且与类本身定义在同一命名空间中的函数(包括重载操作符),在用类类型对象(或类类型的引用及指针)作为实参的时候是可见的。


如果函数具有类类型形参就使得函数可见,其原因在于,允许无须单独的using声明就可以使用概念上作为类接口组成部分的非成员函数。能够使用非成员操作对操作符函数特别有用。

//Namespace3.h  
#ifndef NAMESPACE3_H  
#define NAMESPACE3_H  
 
namespace Andersoft 

    class Class4{}; 
    void Method4(Class4 &c1){} 

 
#endif 
//Namespace3.h
#ifndef NAMESPACE3_H
#define NAMESPACE3_H

namespace Andersoft
{
 class Class4{};
 void Method4(Class4 &c1){}
}

#endifAndersoft::Class4 c4=Andersoft::Class4(); 
Method4(c4); 
 Andersoft::Class4 c4=Andersoft::Class4();
 Method4(c4);2. 隐式友元声明与命名空间

当一个类声明为友元函数的时候,函数的声明不必是可见的。如果不存在可见的声明,那么,友元声明具有将该函数或类的声明放入外围作用域的效果。如果类在命名空间内部定义,则没有另外声明的友元函数在同一命名空间中声明。

因为该友元接受类类型实参并与类隐式声明在同一命名空间中,所以使用它时可以无须使用显式命名空间限定符。

//Namespace3.h  
#ifndef NAMESPACE3_H  
#define NAMESPACE3_H  
 
namespace Andersoft 

    namespace Namespace6 
    { 
        class Class5{}; 
        class Class4{ 
            friend class Class5; 
            friend void Method4(Class4 *c4); 
        }; 
    } 

void Andersoft::Namespace6::Method4(Andersoft::Namespace6::Class4 *c4){} 
 
#endif 
//Namespace3.h
#ifndef NAMESPACE3_H
#define NAMESPACE3_H

namespace Andersoft
{
 namespace Namespace6
 {
  class Class5{};
  class Class4{
   friend class Class5;
   friend void Method4(Class4 *c4);
  };
 }
}
void Andersoft::Namespace6::Method4(Andersoft::Namespace6::Class4 *c4){}

#endifAndersoft::Namespace6::Class4 *c4=new Andersoft::Namespace6::Class4(); 
Andersoft::Namespace6::Method4(c4); 
Method4(c4); 
 Andersoft::Namespace6::Class4 *c4=new Andersoft::Namespace6::Class4();
 Andersoft::Namespace6::Method4(c4);
 Method4(c4);

 摘自 xufei96的专栏
 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,