第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++ ,