1、經常會聽到“類的聲明、類的定義、類的實現”,它們之間有什么不一樣?
經過查閱https://www.cnblogs.com/kkshaq/p/4660073.html博客的說法,類的聲明是在.h文件中完成的,也就是聲明一個類但是沒有具體寫出它的實現。
而類的定義和類的實現其實是同一個東西,在.cpp文件中完成,寫出類的函數的具體實現。
2、類的public成員、protected成員、private成員有什么區別?
如果沒有派生類這種操作,那么protected成員和private成員是一樣的,都只能被類的成員函數所訪問,而不能被類的實例變量所訪問。
類的實例變量只能訪問類的public成員。
再說一些別的,類的成員彼此之間可以自由地互相訪問,沒有任何限制。也就是說protected成員可以訪問private成員,private成員也可以自由地任意訪問……
只有類的實例變量,限制多一點,只能訪問類的public成員。
如果有了派生類,那么子類繼承父類的方法有三種,public繼承、protected繼承、private繼承。
如果是public繼承,那么可以看成子類把父類的public成員放到了子類的public區域,把父類的protected成員放到了子類的protected區域,所以子類的成員可以訪問父類的public成員和protected成員,以及子類自己的public、protected、private成員。父類的private成員無論如何都不能直接訪問。
子類的實例變量,同樣限制多一點,只能訪問父類的public成員和子類的public成員,不能訪問父類的protected成員、子類的protected、private成員。父類的private成員無論如何都不能直接訪問。
如果是protected繼承,那么可以看成子類把父類的public成員變成了子類自己的protected成員,放到了子類的protected區域,也把父類的protected成員放到子類的protected區域,所以子類的成員可以訪問父類的public成員和protected成員,以及子類自己的public、protected、private成員。父類的private成員無論如何都不能直接訪問。
子類的實例變量,只能訪問子類的public成員,無法訪問父類的任何成員和子類的protected、private成員。父類的private成員無論如何都不能直接訪問。
如果是private繼承,那么可以看成子類把父類的public成員和protected成員變成了子類自己的private成員,都放到了子類的private區域,所以子類的成員可以訪問父類的public成員和protected成員,以及子類自己的public、protected、private成員。父類的private成員無論如何都不能直接訪問。
子類的實例變量,只能訪問子類的public成員,無法訪問父類的任何成員和子類的protected、private成員。父類的private成員無論如何都不能直接訪問。
所以在有派生出來的子類的時候,父類中的protected成員與private成員很大的一點區別是,父類的private成員永遠不能被子類的成員和子類的實例變量所訪問,而父類的protected成員可以被子類的成員所訪問。
同樣感謝https://www.cnblogs.com/langzou/p/9855582.html的分享。
3、友元函數和友元類
在博客https://www.cnblogs.com/staring-hxs/p/3432161.html中獲取了一些知識,用自己的語言組織如下。
友元函數不是類的成員函數,但是卻可以訪問類的protected成員和private成員,只需要在類中加以特殊聲明。友元函數的定義在類外實現。
聲明格式是fiend 函數返回的類型 函數名(參數類型 參數名稱),聲明可以在類中的任意部分。
友元類,友元類中的每一個函數都是另一個類的友元函數,都可以訪問另一個類中的任意成員。聲明友元類的格式是friend class 類名,聲明同樣可以再類中的任意部分。
給出一個例子,在dev c++上可以順利編譯並執行。
例子中的father類和son類只是兩個類的名稱,不是真的一個是父類,一個是子類哈(因為時間關系,就沒有重新想類的名字並修改了……)
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;
class father
{
friend void hanshu1(father f);//聲明了一個友元函數
friend class son;//聲明了一個友元類
public:
void a(int);
int a1=111;
protected:
void c(int);
int c1=222;
private:
void e(int xingcan)
{
cout<<"形參是"<<xingcan<<endl;
}
int e1=333;
};
void hanshu1(father f)//友元函數的實現
{
cout<<f.a1<<endl;
cout<<f.c1<<endl;
cout<<f.e1<<endl;
f.e(123);
}
class son//友元類的實現
{
public:
void g(father f)
{
cout<<f.a1<<endl;
cout<<f.c1<<endl;
cout<<f.e1<<endl;
f.e(123);
}
};
int main()
{
father father1;
hanshu1(father1);
son son1;
son1.g(father1);
return 0;
}
可以結合上述例子理解一下友元函數和友元類怎么操作~
友元類的一些性質:
①友元關系不能被繼承,也就是說如果類B是類A的友元類,類C是類B的子類,那么類C不一定是類A的友元類,只有在類A中特殊聲明過的類才是類A的友元類。
②友元關系是單向的,類B是類A的友元類,但是類A不一定是類B的友元類。
③友元關系不具有傳遞性,類B是類A的友元類,類C是類B的友元類,但是類C不一定是類A的友元類,同樣需要在類A中特殊聲明一下才是友元類。但是我們類C實際上可以通過訪問類B來訪問類A,只不過不能直接訪問類A。