C 友元類 未完待續

2021-07-04 17:38:54 字數 2207 閱讀 1191



c++之「友元類」學習筆記

********************===什麼是友元類********************===

當乙個類b成為了另外乙個類a的「朋友」時,那麼類a的私有和保護的資料成員就可以被類b訪問。我們就把類b叫做類a的友元。

********************===友元類能做什麼********************===

友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類b設定成了類a的友元類,但是這並不會是類a成為類b的友元。說白了就是:甲願意把甲的秘密告訴乙,但是乙不見得願意把乙自己的秘密告訴甲。

********************===友元類的宣告方法和其用法********************===

宣告友元類的方法其實很簡單,只要我們在類a的成員列表中寫下如下語句:

friend class b;

談談:c++類的「包含」機制

》中的包含是完全不一樣的!

********************===友元類的乙個具體例子********************===

在這裡,我們引用乙個我從網上收集到的例子來說明友元類的作用:假設我們要設計乙個模擬電視機和遙控器的程式。大家都之道,遙控機類和電視機類是不相包含的,而且,遙控器可以操作電視機,但是電視機無法操作遙控器,這就比較符合友元的特性了。即我們把遙控器類說明成電視機類的友元。下面是這個例子的具體**:

#include using namespace std;

class tv

private:

enum;

enum;

enum;

enum;

bool on_off;

int volume;

int channel;

int mode;

};class tele

void setmode(tv&t)

bool volumeup(tv&t);

bool volumedown(tv&t);

bool channelup(tv&t);

bool channeldown(tv&t);

void show(tv&t)const;

};bool tele::volumeup(tv&t)

else

}bool tele::channelup(tv&t)

else

}void tele::show(tv&t)const

;

template class queueitem;

很簡單,跟非模板類沒什麼區別,有一點需要注意,如果要把函式和類生命為友元,前面不需要宣告或定義。但是如果要把類成員函式宣告為友元,則前面必須有類的定義(注意不是宣告,是定義),因為乙個類成員只能由該類的定義引入

2.繫結的友元類模板或函式模板。例子如下:

template class foobar;

template void foo(queueitem);

template class queue;

template class queueitem ;

需要注意兩點:

a.與非模板函式或類不同,模板函式或類宣告為友元之前必須在前面宣告過,否則無法通過編譯。

b.注意紅字部分,那幾個type不能少。比如對於函式foo,如果少了的話編譯器會將其作為非模板函式對待,也就是說,對於queueitem,編譯器會查詢void foo(queueitem),而對templatevoid foo(queueitem)視而不見,如果沒找到非模板函式則會報錯。

3.非繫結友元類模板或函式模板。舉例如下:

template class queueitem ;



模板(C )(未完待續)

為了提高程式的可重用性,c 中引入了模板這一概念。舉例來說,為了實現乙個交換函式,因為資料型別的關係,可能你需要實現好幾種只是引數型別有差異的相同的函式,這大大降低了我們的工作效率 但通過使用模板我們可以實現乙個萬能的交換函式。函式模板形式如下 template 返回值型別 模板名 形參表 其中的 ...

nginx 未完待續

yum install y pcre yum install y pcre devel yum install y openssl yum install y openssl devel yum install y zlib yum install y gccyum安裝 yum install y ...

sqlparse(未完待續)

sqlparse.split sql,encoding none sql 包含乙個或多個sql語句的字串 encoding 語句的編碼 可選 sql select from foo select from bar sql list sqlparse.split sql print sql list ...