【C++的面向對象】類成員的訪問權限


public,private,protect的訪問權限問題(先不考慮繼承和多態的關係)


1、public訪問權限是全局的

public的成員變量 在類的成員方法中可以直接訪問
public的成員變量 在外部代碼中可以通過類的對象來直接訪問
public的成員方法 在類內其他成員方法中可以直接調用
public的成員方法 在外部代碼中可以通過類的對象來直接訪問

2、private訪問權限就是對內不設防,對外設防的

private的成員變量 在類的成員方法中可以直接訪問
private的成員變量 在外部代碼中不可以通過對象來直接訪問
private的成員方法 在類內其他成員方法中可以直接調用
private的成員方法 在外部代碼中不可以通過對象來直接訪問

3、protected訪問權限就是對內不受保護,對外受保護的

protected的成員變量 在類的成員方法中可以直接訪問
protected的成員變量 在外部代碼中不可以通過對象來直接訪問
protected的成員方法 在類內其他成員方法中可以直接調用
protected的成員方法 在外部代碼中不可以通過對象來直接訪問

注:訪問權限疊加類的繼承、static、friend等特性後才更加顯出複雜性和威力;暫時只先引入這個概念,掌握基本用法和規則即可,後面逐步去深入


C++爲什麼要設計訪問權限


1、訪問權限作用1:保護內部資源
(1)private的成員是class內部使用,外部沒必要直接訪問(讀取或賦值),所以乾脆在語法上讓你看不見
(2)訪問權限的保護是一種語法層面的保護,而非硬件上限制訪問,硬件做不了這麼細緻
(3)最終目的也是爲了整個程序更安全

2、訪問權限作用2:隱藏外部無需關心的細節
(1)將class內部使用而外部絕不會用到的成員變量隱藏起來,以免干擾外部或者不小心被外部修改了
(2)隱藏細節可以降低使用類庫的人的難度,調用時只看到對我有用的東西
(3)這個隱藏其實是把class的作者和使用者專業分工,是很有必要的

3、這就是面向對象的封裝特性
(1)封裝特性的體現之一就是抽象,抽象的一層意思就是隱藏掉不必要的細節
(2)封裝特性的體現之一就是組織和保護,便於整個整體和外部更合理的交流


訪問權限帶來的一些新編程理念


1、只讀或只寫變量
(1)問題:你的class中需要一個變量,但是希望外部只能讀不能寫,怎麼實現?
(2)分析:硬件、OS、編程語言都未提供這樣的RO或WO的機制,只能間接實現了
(3)解決方案:利用訪問權限,將成員變量設計爲private,然後再通過封裝成員方法來實現
(4)如果只提供read方法那就是隻讀成員,如果只提供write方法那就是隻寫成員
(5)這樣的成員經常被稱爲屬性(property),C#等高級編程語言中就源生支撐這種新編程思想


/********person.hpp*********/
#ifndef __PERSON_H__
#define __PERSON_H__

#include <string>
using namespace std;

// 聲明這個類
class person
{
public:
	// 提供一個專門用來寫age成員變量的方法
	void agewrite(int a);
	int ageread();
	
private:
	int age;				// 我們希望age是隻寫不能讀的
	
protected:

};
#endif
/********person.cpp*********/
#include "person.hpp"
#include <iostream>

using namespace std;

// age成員變量的讀寫方法
void person::agewrite(int a)
{
	this->age = a;
}

int person::ageread()
{
	return this->age;
}
/********main.cpp*********/
#include "person.hpp"
#include <iostream>


using namespace std;

int main(void)
{
	person zhangsan;    			
//	zhangsan.age = 23;            //不能直接在外部寫private變量,報錯

	zhangsan.agewrite(23);		       // 通過寫方法來間接的實現了讀寫成員	
	int a = zhangsan.ageread();
	cout << "a = " << a << endl;
		
	return 0;
}

2、複雜程序架構化
(1)簡單程序規模小,參與人少,靠人本身的邏輯能力就能保證實現和質量
(2)複雜程序規模大參與人多,協作成本高,水平良莠不齊,必須靠架構式設計才能保證實現和質量
(3)架構化設計中權限管控的思想很重要,每一層的訪問權限和主要關注點都不同

3、爲什麼C語言不需要這些
(1)C主要做裸機開發和OS內核開發,都是獨立一體化程序,不隔離,所以不需要也沒法管控權限
(2)C程序一般規模小,不需要管控權限
(3)C程序強調性能,而權限管控一定程度會犧牲性能。凡事都有兩面性。
(4)越是高級語言,編程越偏業務邏輯,就越需要權限管控和架構思想這些。


擴展:


1、C和C++中struct的區別
(1)C中不支持成員函數(只能通過函數指針成員變量間接支持),而C++源生支持成員函數。
(2)C中不支持static成員,而C++中支持。後面會詳細講,C++ static class是一個大知識點。
(3)訪問權限,C中默認public,C++中默認public,但是可以顯式指定public/private/protected三者之一
(4)繼承特性上,C中不支持(只能通過結構體包含來間接實現),而C++源生支持,且struct和class可以互相繼承
(5)初始化方面,C中靠初始化式(gcc擴展了初始化語法),而C++靠構造函數所以初始化更自由可定製化

2、C++中struct和class的區別
(1)默認成員權限,struct默認public,class默認private
(2)繼承關係的權限管控,struct默認public,class默認private
(3)struct和class交叉繼承時,默認的權限管控取決於子類而不是基類
(4)模板相關使用都用class,而不用struct了

3、總結
(1)C++中struct和class差別不大,大多數情況下都可以直接替換使用而不出錯
(2)C++中struct其實有點“人格分裂”,他既要兼容C中struct,又要像C++的class
(3)結論:除非是隻需要打包幾個變量數據就用C方式的struct,否則如果需要面向對象式編程就用class

4、class的前置聲明
(1)就是class的聲明,有點像函數聲明,安慰編譯器的
(2)看到了認識即可。

5、inline member function
(1)類的聲明中直接寫函數體,則此函數會被編譯器inline化處理
(2)類的聲明中正常處理,而成員函數的實現中加inline
(3)inline的成員函數應該放在hpp中而不是cpp中,這個一定要注意,因爲inline是在編譯時替換的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章