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的專欄