關於c++類的一些知識的總結


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM