| 導購 | 订阅 | 在线投稿
分享
 
 
 

入門教程:實例詳解C++友元

來源:互聯網  2008-06-01 02:03:34  評論

在說明什麽是友元之前,我們先說明一下爲什麽需要友元與友元的缺點:

通常對于普通函數來說,要訪問類的保護成員是不可能的,假如想這麽做那麽必須把類的成員都生命成爲public(共用的),然而這做帶來的問題遍是任何外部函數都可以毫無約束的訪問它操作它,c++利用friend修飾符,可以讓一些你設定的函數能夠對這些保護數據進行操作,避免把類成員全部設置成public,最大限度的保護數據成員的安全。

友元能夠使得普通函數直接訪問類的保護數據,避免了類成員函數的頻繁調用,可以節約處理器開銷,提高程序的效率,但矛盾的是,即使是最大限度的保護,同樣也破壞了類的封裝特性,這即是友元的缺點,在現在cpu速度越來越快的今天我們並不推薦使用它,但它作爲c++一個必要的知識點,一個完整的組成部分,我們還是需要討論一下的。

在類裏聲明一個普通函數,在前面加上friend修飾,那麽這個函數就成了該類的友元,可以訪問該類的一切成員。

下面我們來看一段代碼,看看我們是如何利用友元來訪問類的一切成員的。#include <iostream>

using namespace std;

class Internet

{

public:

Internet(char *name,char *address)

{

strcpy(Internet::name,name);

strcpy(Internet::address,address);

}

friend void ShowN(Internet &obj);//友元函數的聲明

public:

char name[20];

char address[20];

};

void ShowN(Internet &obj)//函數定義,不能寫成,void Internet::ShowN(Internet &obj)

{

cout<<obj.name<<endl;

}

void main()

{

Internet a("中國軟件開發實驗室","www.cndev-lab.com");

ShowN(a);

cin.get();

} 上面的代碼通過友元函數的定義,我們成功的訪問到了a對象的保護成員name,友元函數並不能看做是類的成員函數,它只是個被聲明爲類友元的普通函數,所以在類外部函數的定義部分不能夠寫成void Internet::ShowN(Internet &obj),這一點要注重。


入門教程:實例詳解C++友元
更多內容請看asp.net教程 C/C++技術學堂 C/C++技術專題專題,或

一個普通函數可以是多個類的友元函數,對上面的代碼我們進行修改,注重觀察變化:

#include <iostream>

using namespace std;

class Country;

class Internet

{

public:

Internet(char *name,char *address)

{

strcpy(Internet::name,name);

strcpy(Internet::address,address);

}

friend void ShowN(Internet &obj,Country &cn);//注重這裏

public:

char name[20];

char address[20];

};

class Country

{

public:

Country()

{

strcpy(cname,"中國");

}

friend void ShowN(Internet &obj,Country &cn);//注重這裏

PRotected:

char cname[30];

};

void ShowN(Internet &obj,Country &cn)

{

cout<<cn.cname<<""<<obj.name<<endl;

}

void main()

{

Internet a("中國軟件開發實驗室","www.cndev-lab.com");

Country b;

ShowN(a,b);

cin.get();

}一個類的成員函數函數也可以是另一個類的友元,從而可以使得一個類的成員函數可以操作另一個類的數據成員,我們在下面的代碼中增加一類Country,注重觀察:#include <iostream>

using namespace std;

class Internet;

class Country

{

public:

Country()

{

strcpy(cname,"中國");

}

void Editurl(Internet &temp);//成員函數的聲明

protected:

char cname[30];

};

class Internet

{

public:

Internet(char *name,char *address)

{

strcpy(Internet::name,name);

strcpy(Internet::address,address);

}

friend void Country::Editurl(Internet &temp);//友元函數的聲明

protected:

char name[20];

char address[20];

};

void Country::Editurl(Internet &temp)//成員函數的外部定義

{

strcpy(temp.address,"edu.cndev-lab.com");

cout<<temp.name<<""<<temp.address<<endl;

}

void main()

{

Internet a("中國軟件開發實驗室","www.cndev-lab.com");

Country b;

b.Editurl(a);

cin.get();

}整個類也可以是另一個類的友元,該友元也可以稱做爲友類。友類的每個成員函數都可以訪問另一個類的所有成員。


入門教程:實例詳解C++友元
更多內容請看ASP.NET教程 C/C++技術學堂 C/C++技術專題專題,或

示例代碼如下:#include <iostream>

using namespace std;

class Internet;

class Country

{

public:

Country()

{

strcpy(cname,"中國");

}

friend class Internet;//友類的聲明

protected:

char cname[30];

};

class Internet

{

public:

Internet(char *name,char *address)

{

strcpy(Internet::name,name);

strcpy(Internet::address,address);

}

void Editcname(Country &temp);

protected:

char name[20];

char address[20];

};

void Internet::Editcname(Country &temp)

{

strcpy(temp.cname,"中華人民共和國");

}

void main()

{

Internet a("中國軟件開發實驗室","www.cndev-lab.com");

Country b;

a.Editcname(b);

cin.get();

}在上面的代碼中我們成功的通過Internet類Editcname成員函數操作了Country類的保護成員cname。

在編程中,我們使用友元的另外一個重要原因是爲了方便重載操作符的使用,這些內容我們將在後面的教程著重討論!

入門教程:實例詳解C++友元
更多內容請看ASP.NET教程 C/C++技術學堂 C/C++技術專題專題,或

  在說明什麽是友元之前,我們先說明一下爲什麽需要友元與友元的缺點:   通常對于普通函數來說,要訪問類的保護成員是不可能的,假如想這麽做那麽必須把類的成員都生命成爲public(共用的),然而這做帶來的問題遍是任何外部函數都可以毫無約束的訪問它操作它,c++利用friend修飾符,可以讓一些你設定的函數能夠對這些保護數據進行操作,避免把類成員全部設置成public,最大限度的保護數據成員的安全。   友元能夠使得普通函數直接訪問類的保護數據,避免了類成員函數的頻繁調用,可以節約處理器開銷,提高程序的效率,但矛盾的是,即使是最大限度的保護,同樣也破壞了類的封裝特性,這即是友元的缺點,在現在cpu速度越來越快的今天我們並不推薦使用它,但它作爲c++一個必要的知識點,一個完整的組成部分,我們還是需要討論一下的。   在類裏聲明一個普通函數,在前面加上friend修飾,那麽這個函數就成了該類的友元,可以訪問該類的一切成員。   下面我們來看一段代碼,看看我們是如何利用友元來訪問類的一切成員的。#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) { strcpy(Internet::name,name); strcpy(Internet::address,address); } friend void ShowN(Internet &obj);//友元函數的聲明 public: char name[20]; char address[20]; }; void ShowN(Internet &obj)//函數定義,不能寫成,void Internet::ShowN(Internet &obj) { cout<<obj.name<<endl; } void main() { Internet a("中國軟件開發實驗室","www.cndev-lab.com"); ShowN(a); cin.get(); }   上面的代碼通過友元函數的定義,我們成功的訪問到了a對象的保護成員name,友元函數並不能看做是類的成員函數,它只是個被聲明爲類友元的普通函數,所以在類外部函數的定義部分不能夠寫成void Internet::ShowN(Internet &obj),這一點要注重。 [url=/bbs/detail_1785266.html][img]http://image.wangchao.net.cn/it/1323424081451.gif[/img][/url] 更多內容請看asp.net教程 C/C++技術學堂 C/C++技術專題專題,或   一個普通函數可以是多個類的友元函數,對上面的代碼我們進行修改,注重觀察變化: #include <iostream> using namespace std; class Country; class Internet { public: Internet(char *name,char *address) { strcpy(Internet::name,name); strcpy(Internet::address,address); } friend void ShowN(Internet &obj,Country &cn);//注重這裏 public: char name[20]; char address[20]; }; class Country { public: Country() { strcpy(cname,"中國"); } friend void ShowN(Internet &obj,Country &cn);//注重這裏 PRotected: char cname[30]; }; void ShowN(Internet &obj,Country &cn) { cout<<cn.cname<<""<<obj.name<<endl; } void main() { Internet a("中國軟件開發實驗室","www.cndev-lab.com"); Country b; ShowN(a,b); cin.get(); }  一個類的成員函數函數也可以是另一個類的友元,從而可以使得一個類的成員函數可以操作另一個類的數據成員,我們在下面的代碼中增加一類Country,注重觀察:#include <iostream> using namespace std; class Internet; class Country { public: Country() { strcpy(cname,"中國"); } void Editurl(Internet &temp);//成員函數的聲明 protected: char cname[30]; }; class Internet { public: Internet(char *name,char *address) { strcpy(Internet::name,name); strcpy(Internet::address,address); } friend void Country::Editurl(Internet &temp);//友元函數的聲明 protected: char name[20]; char address[20]; }; void Country::Editurl(Internet &temp)//成員函數的外部定義 { strcpy(temp.address,"edu.cndev-lab.com"); cout<<temp.name<<""<<temp.address<<endl; } void main() { Internet a("中國軟件開發實驗室","www.cndev-lab.com"); Country b; b.Editurl(a); cin.get(); }  整個類也可以是另一個類的友元,該友元也可以稱做爲友類。友類的每個成員函數都可以訪問另一個類的所有成員。 [url=/bbs/detail_1785266.html][img]http://image.wangchao.net.cn/it/1323424081557.gif[/img][/url] 更多內容請看ASP.NET教程 C/C++技術學堂 C/C++技術專題專題,或   示例代碼如下:#include <iostream> using namespace std; class Internet; class Country { public: Country() { strcpy(cname,"中國"); } friend class Internet;//友類的聲明 protected: char cname[30]; }; class Internet { public: Internet(char *name,char *address) { strcpy(Internet::name,name); strcpy(Internet::address,address); } void Editcname(Country &temp); protected: char name[20]; char address[20]; }; void Internet::Editcname(Country &temp) { strcpy(temp.cname,"中華人民共和國"); } void main() { Internet a("中國軟件開發實驗室","www.cndev-lab.com"); Country b; a.Editcname(b); cin.get(); }  在上面的代碼中我們成功的通過Internet類Editcname成員函數操作了Country類的保護成員cname。   在編程中,我們使用友元的另外一個重要原因是爲了方便重載操作符的使用,這些內容我們將在後面的教程著重討論! [url=/bbs/detail_1785266.html][img]http://image.wangchao.net.cn/it/1323424081571.gif[/img][/url] 更多內容請看ASP.NET教程 C/C++技術學堂 C/C++技術專題專題,或
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有