結構函數界說為private或許protected的利益。本站提示廣大學習愛好者:(結構函數界說為private或許protected的利益)文章只能為提供參考,不一定能成為您想要的結果。以下是結構函數界說為private或許protected的利益正文
將結構函數,析構函數聲明為公有和掩護的,那末對象若何創立?曾經不克不及從內部挪用結構函數了,然則對象必需被結構,應當若何處理,費事年夜家協助解釋,關於結構,析構函數聲明為公有和掩護時的用法??? 提出這個成績,解釋你曾經對c++有所思慮了。
從語法下去講,一個函數被聲明為protected或許private,那末這個函數就不克不及從“內部”直接被挪用了。
關於protected的函數,子類的“外部”的其他函數可以挪用之。
而關於private的函數,只能被本類“外部”的其他函數說挪用。
語法上就是這麼劃定的,你確定也曉得的咯。
那末為何有時刻將結構函數或許析構函數聲明為protected的或許private的?
平日應用的場景以下:
1。假如你不想讓裡面的用戶直接結構一個類(假定這個類的名字為A)的對象,而願望用戶只能結構這個類A的子類,那你便可以將類A的結構函數/析構函數聲明為protected,而將類A的子類的結構函數/析構函數聲明為public。例如:
class A
{ protected: A(){}
public: ....
};
calss B : public A
{ public: B(){}
....
};
A a; // error
B b; // ok
2. 假如將結構函數/析構函數聲明為private,那只能這個類的“外部”的函數能力結構這個類的對象了。這裡所說的“外部”不曉得你能否能明確,上面舉個例子吧。
class A
{
private:
A(){ }
~A(){ }
public:
void Instance()//類A的外部的一個函數
{
A a;
}
};
下面的代碼是能經由過程編譯的。下面代碼裡的Instance函數就是類A的外部的一個函數。Instance函數體裡就構建了一個A的對象。
然則,這個Instance函數照樣不克不及夠被裡面挪用的。為何呢?
假如要挪用Instance函數,必需有一個對象被結構出來。然則結構函數被聲明為private的了。內部不克不及直接結構一個對象出來。
A aObj; // 編譯通不外
aObj.Instance();
然則,假如Instance是一個static靜態函數的話,便可以不須要經由過程一個對象,而可以直接被挪用。以下:
class A
{
private:
A():data(10){ cout << "A" << endl; }
~A(){ cout << "~A" << endl; }
public:
static A& Instance()
{
static A a;
return a;
}
void Print()
{
cout << data << endl;
}
private:
int data;
};
A& ra = A::Instance();
ra.Print();
下面的代碼實際上是設計形式singleton形式的一個簡略的C++代碼完成。
還有一個情形是:平日將拷貝結構函數和operator=(賦值操作符重載)聲明成private,然則沒有完成體。
這個的目標是制止一個類的內部用戶對這個類的對象停止復制舉措。
細節請看《effective C++》外面的條目27。