這篇博客已經到了類和對象的最后一部分了,下面我們先看一下explicit關鍵字
我們還是先來引入一個例子,我們的代碼是可以這么寫的
class A {
public:A(int aa = 0) {_a = aa;cout << "A(int aa = 0)" << endl;}
private:int _a;
};
int main() {A a1(1);return 0;
}
這個a1是怎么創建的呢?其實它是進行了隱式類型轉換,就是先讓1去構造一個臨時的A類的對象,再讓這個臨時對象去拷貝構造a1
不只是自定義類型,我們就是內置類型也會進行隱式類型轉換
這兩種情況都會進行隱式類型轉換,都是先生成一個臨時變量
當然我們上邊能用一個值去構造一個A類的對象
還有一個原因就是A的構造函數是單參數,不只是這種情況,還有全缺省或者半缺省只要傳一個值是合法的就可以。那如果想傳多個值也可以,就是用大括號給圈起來,比如說:
那如果我們不想讓類發生隱式類型轉換,這時就可以在構造函數前加上explicit
這樣就不能像上面那樣用了
下一個是友元,友元包括友元函數和友元類,其實友元函數我們之前在運算符重載時用過,只需要在類里面加一個友元聲明,這樣就可以訪問私有成員變量了,下面是友元類,這里只不過是要在類里面聲明一個類,就像這樣
Date是A的朋友,這樣Date類里面就可以訪問A的私有成員變量了
有元之間的關系要注意,友元為單向關系,友元的關系不能傳遞(比如說:A是B的朋友,B是C的朋友,不能說A是C的朋友),這里的關系跟現實中的關系都是一樣的
下一個是內部類,就是在一個類里面在定義一個類,比如說:
class A {
private:int _a;
public:class B {public:void Func() {A a;a._a = 10;}private:int _b;};
};
我們求A類的大小是不算B類的
并且內部類天生是外部類的友元,我們上面的代碼也可以體現
其實內部類就是一個普通類,只是受外部類的類域和訪問限定符的限制
還有一個問題我們需要注意一下就是,如果一個內部類定義了一個靜態成員變量,那么這個變量的定義不能在外部類的里面
這樣是會報錯的
應該定義在外部類的外面