C++中類包含三種成員訪問說明符:public, private 和 protected.
在程序能訪問類對象的任何地方都可以訪問任何在成員訪問說明符public后面聲明的數據成員和成員函數.成員訪問符private后面的數據成員和成員函數只能由該類的成員函數或友元訪問.基類的protected成員只能被基類的成員和友元已及派生類的成員和友元訪問.
在C++中還存在三中繼承方式:public, private, protected.
對于它們的論述可以在任意一本關于C++的書中都可以找到.大家對public繼承都比較熟悉.但我們偶爾也會看到private繼承.private繼承時基類中的public,private成員變成派生類中的private成員.基類中的private成員在派生類中隱藏.
這里簡單介紹一下以下兩種情況的異同:
(1)B private 繼承A
(2)A是B的一個私有成員的異同.
相同點:A的接口(public 成員函數)都只對B開放,不對外開放.
不同點:在(1)中A的public, protected成員都為B的private成員,B的成員函數可以直接訪問.在(2)中A的成員都不是B的成員,并且B不能訪問A的protected成員,要訪問A的public成員也要借助A的對象.
下面再講一些編譯器在構造類時所采取的缺省操作:
1.如果類沒有聲明構造函數,編譯器會聲明一個默認構造函數.
2.如果沒有聲明拷貝構造函數,編譯器會隱式地生成一個.
3.如果沒有聲明賦值操作符,編譯器會隱式地生成一個.
4.如果沒有聲明析構函數,編譯器會隱式地生成一個.
隱式生成的函數都是public的.
如果接受一個副本是有效的行為,就該聲明并定義拷貝構造函數和賦值操作符.如果接受一個副本是禁止的,你可以將拷貝構造函數和賦值操作符聲明為private,并且不實現它們,這樣可以阻止編譯器生成缺省的操作,從而防止客戶復制類對象.
下面是代碼實例:
class test{
};
該類中不包含任何成員,也沒聲明任何方法.編譯器會缺省生成下列方法:
test::test()
{
}
test::~test()
{
}
test::test(const test& rt)
{
...
}
test& test::operator=(const test& rt)
{
...
}
這些方法都是public的.
如果想阻止編譯器生成缺省的拷貝構造函數,和賦值操作,可以進行如下操作:
class test{
private:
test(test& rt); // 該方法被定義為private,并且不被實現.
test& operator=(test& rt); // 該方法被定義為private,并且不被實現.
};