?? ex24.cpp
字號:
//第24章 名稱空間和嵌套類
//[例24.1]名稱空間是一個獨立的全局命名區域
#include<stdio.h>
namespace NName
{ struct CType { long f(); long m_l;};//聲明一個結構類型,名稱為CType
typedef long type; //聲明一個long的別名type
type funct(CType&); //全局函數原型說明
long CType::f() { return m_l;} //成員函數的體內定義
CType* pobj; //定義一個全局對象指針
type v; //定義一個long型的全局變量v
CType obj; //定義一個全局對象obj
}
NName::type NName::funct(CType& r) //全局函數的體外定義
{ r.m_l=10;
type n=r.m_l+10;
return n;
}
void main(void)
{ NName::pobj=&NName::obj;
NName::v=NName::funct(NName::obj);
printf("NName::v=%d,obj.m_l=%d\n",NName::v,NName::pobj->f());
} //輸出結果: NName::v=20,obj.m_l=10
//[例24.2]using聲明語句簡化索引名稱的方式
#include<iostream>
namespace NName
{ struct CType { long f(); long m_l;};
typedef long type;
type funct(CType&r) //全局函數在名稱空間體內定義
{ r.m_l=10; return r.m_l+10; }
CType* pobj;
type v;
CType obj;
}
long NName::CType::f() { return m_l;} //成員函數在名稱空間的體外定義
using namespace NName;
using namespace std;
void main(void)
{ pobj=&obj;
v=funct(obj);
cout<<"v="<<v<<",obj.m_l="<<pobj->f()<<endl;
} //輸出結果: v=20,obj.m_l=10
//[例24.3]將說明語句放置在頭文件的名稱空間布局
#include<iostream>
#include"x.h"
using B::obj;
void main(void)
{ B::pobj=&obj;
using B::funct;
B::v=funct(obj);
using namespace std;
cout<<"v="<<B::v<<",obj.m_l="<<B::pobj->f()<<endl;
} //輸出結果: v=20,obj.m_l=10
namespace B
{ long funct(A&r){ r.m_l=10; return r.m_l+10; }
long A::f() { return m_l;}
A* pobj;
long v;
A obj;
}
// 在頭文件x.h建立的名稱空間
namespace B
{ union A { long f(); long m_l;};
long funct(A&r);
extern A* pobj;
extern long v;
extern A obj;
}
namespace X { long m=1; } //相當于定義全局變量long X::m=1;
using namespace X;
namespace Y
{ long n=m+1; //相當于long Y::n= X::m+1;
long k=X::d; //error 'd' : is not a member of 'X',undeclared identifier
} // X::d此時尚不存在
namespace X { long d=3; } //定義另外一個全局變量long X::d=3;
void f(void) { d=4; } //此時可以有效的索引全局變量X::d
//[例24.4]名稱空間的隱約索引不應構成歧義
#include<stdio.h>
namespace C
{ long f( int n) { printf("C::f(int);"); return n; }
long f( double n) { printf("C::f(double);"); return (long)n;}
}
namespace D
{ long f( int n) { printf("D::f(int);"); return n; }
long f( char n) { printf("D::f(char);"); return n; }
}
void main()
{ using C::f; //導出一對重載函數C::f(double), C::f(int)
using D::f; //導出一對重載函數D::f(char), D::f(int)
printf("C::f=%d,D::f=%d--",f('a'+1.0),f('a'));
printf("C::f=%d,D::f=%d\n",C::f(98),D::f(97));
}///輸出:D::f(char);C::f(double);C::f=98,D::f=97--D::f(int);C::f(int);C::f=98,D::f=97
//[例24.5]嵌套名稱空間的訪問
namespace OutName //namespace 外層名稱空間名
{ struct SA { float x;}; //{ 外層類型聲明語句;
long funct(long x); // 外層函數原型說明語句;
SA s[]={1,2}; // 外層變量定義語句;
namespace InName // namespace 內層名稱空間名
{ // {
double x=s[0].x; // 內層變量定義語句;
float fv(void) { return s[1].x; } // 內層函數定義
} // }
long funct(long x){return InName::fv()+x;} //外層的函數定義
} }
#include<stdio.h>
void main()
{ using OutName::InName::fv;
printf("OutName::InName::x=%f,f()=%f\n",OutName::InName::x,fv());
using namespace OutName;
printf("OutName::s[]={%f,%f}\n",s[0].x,s[1].x);
}
//[例24.6]名稱空間的別名簡化代碼的書寫量
namespace OutName
{ struct SA { float x;} s[]={1,2};
namespace InName
{ double x=s[0].x;
float fv(void) { return s[1].x; }
}
}
#include<stdio.h>
void main()
{ namespace InN=OutName::InName;
printf("InN::x=%f,f()=%f\t",InN::x,InN::fv());
namespace Out=OutName;
printf("Out::s[]={%f,%f}\n",Out::s[0].x,Out::s[1].x);
}
//[例24.7] 無名的名稱空間的內部屏蔽作用
// a.cpp文件如下
namespace
{ class CType
{ public: static int num;
int m_n;
};
int a_n=1;
int f(){ return CType::num; }
int CType::num=2;
CType obj={3};
}
int ga(){ return a_n+f()+obj.m_n;}
b.cpp文件如下:
namespace
{ class CType { public: static int num; int m_n;};
int b_n=10;
int f(){ return CType::num; }
int CType::num=20;
CType obj={30};
int fb(){return b_n+f()+obj.m_n;}
}
int gb(){return b_n+f()+obj.m_n;}
//c.cpp文件中的代碼如下:
#include<stdio.h>
extern int gb(); extern int ga(); extern int fb();
void main()
{ printf("a.cpp=>%d,b.cpp=>%d\n",ga(),gb());
//printf("b.cpp=>%d\n",fb());
// Linking...c.obj : error LNK2001:
//unresolved external symbol "int __cdecl fb(void)" (?fb@@YAHXZ)
} //程序輸出結果為: a.cpp=>6,b.cpp=>60
//[例24.8] 嵌套類和外圍類
#include<stdio.h>
class COuter
{ public: int m_b; float any;
COuter(int n=1) {m_b=n;printf("%d.COuter::COuter()this=%p\t",m_b,this);}
~COuter (){printf("COuter::~COuter()sizeof(COuter)=%d\n",sizeof(COuter));}
int Show();
private:
friend void fnest(); //友元函數fnest的引入旨在破除私有的界限
class CNested //嵌套類具有私有訪問控制屬性
{ public: //嵌套類本身的成員是公共的
int m_c;
CNested(int n=2) //構造函數和析構函數內聯定義
{m_c=n;printf("%d.CNested::CNested() this=%p\t",m_c,this);}
~CNested()
{printf("CNested::~CNested()sizeof(CNested)=%d\n",sizeof(CNested));}
int Show(); //聲明一個嵌套類成員函數
};
public:
static COuter Outer(int k); //返回外圍類對象的靜態成員函數Outer
static CNested Nested(int k); //返回嵌套類對象的靜態成員函數Nested
};
int COuter::Show()
{ printf("COuter::Show() this= %p\n",this);
return 1;
}
int COuter::CNested::Show() //嵌套類成員函數的全局范圍定義
{ ////COuter::Show();////error 'COuter::Show' : illegal call of non-static member function
printf("CNested::Show()this=%p\n",this);
return 0;
}
COuter COuter::Outer(int k) {return COuter(k);}//靜態成員函數的定義
COuter::CNested COuter::Nested(int k) //靜態成員函數COuter::Nested的定義
{ //返回嵌套類的COuter::CNested對象
return CNested(k); //顯式調用嵌套類的構造函數
}
void fnest() //外圍類的全局友元函數
{ //定義COuter::CNested 嵌套類對象nested
COuter::CNested nested(COuter::Nested(2)); // nested用函數COuter::Nested初始化
nested.Show();
}
void main() //定義外圍類的對象outer
{ COuter outer=COuter::Outer(1); //outer用靜態成員函數COuter::Outer初始化
outer.Show(); fnest();
}
//[例24.9] 友元函數和嵌套類
#include<stdio.h>
struct CTop
{ int m_c;
CTop(int n){m_c=n;printf("CTop::CTop()this=%p\n",this);}
int Show(){printf("%d.CTop::Show() this=%p\n",m_c,this);return 0;}
};
class COuter
{ public: COuter (int n=1){m_b=n;}
class CNested:public CTop
{ public:
CNested(int n=2):CTop(n)
{printf("CNested::CNested() this=%p\n",this);}
int Show(COuter& r);
};
friend int CNested::Show(COuter& r);
protected: int m_b;
};
int COuter::CNested::Show(COuter& r)
{ CTop::Show();
printf("CNested::Show(COuter& r=%d,&r=%p)\n",r.m_b,&r);
return 0;
}
void main()
{ COuter::CNested nested(10);
COuter outer(20);
nested.Show(outer);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -