再談建構函式
c++11 的成員初始化新玩法。
static成員
友元內部類
初始化列表:以乙個冒號開始,接著是乙個以逗號分隔的資料成員列表,每個"成員變數"後面跟乙個放在括
號中的初始值或表示式。
每個成員變數在初始化列表中只能出現一次(初始化只能初始化一次)
類中包含以下成員,必須放在初始化列表位置進行初始化:
引用成員變數const成員變數
類型別成員(該類沒有預設建構函式
class b
private:
int _b;};
class a
private:
const
int n;
int& dday;
b d;};
intmain()
假設將下列**的_size和_array的順序交換,擇初始化_array陣列時開闢空間的大小則會成為隨機值
注意:成員變數在類中宣告次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先後次序無關
class array
private:
int _size;
int* _array;};
intmain()
匿名物件:(匿名物件的生命週期只有那一行)
1.匿名物件應用
if(n >10)
_aa =
date
(100);
2.date
(2019,3
,6).
display()
;
注意:此關鍵字實際上就是為了阻止進行隱式型別轉換,在一般的場景下不經常使用
我們來看下面的乙個奇特的行為:
date a1(10
);date a2 = a1;
//拷貝構造
date a3 =11;
//隱式型別轉換1.構造了乙個匿名物件 2.拷貝構造給a3 3.優化
const date a4 =
11;
加上後則無法通過編譯:防止型別轉換
explicit date
(int year =
2018
,int month =1,
int day =1)
:n(10
)
多引數的c++11支援這種情況
date a3 =
非靜態成員變數,可以在成員宣告時,直接初始化
class b
int _b;};
class a
private:
// 非靜態成員變數,可以在成員宣告時,直接初始化。
int a =10;
b b =20;
int* p =
(int*)
malloc(4
);static
int n;};
int a:
:n =10;
intmain()
宣告為static的類成員稱為類的靜態成員,用static修飾的成員變數,稱之為靜態成員變數;用static修飾的
成員函式,稱之為靜態成員函式。靜態的成員變數一定要在類外進行初始化
面試題:編寫乙個函式判斷一共建立了多少個類的物件
class aa(
const a& d)
static
intget()
//不加static則會建立乙個物件呼叫函式,加上之後則可以得到準確的結果
private:
static
int rcount;};
int a:
:rcount =0;
intmain()
靜態成員為所有類物件所共享,不屬於某個具體的例項(成員共享)
靜態成員變數必須在類外定義,定義時不新增static關鍵字(定義不加關鍵字)
類靜態成員即可用類名::靜態成員或者物件.靜態成員來訪問(::訪問)
靜態成員函式沒有隱藏的this指標,不能訪問任何非靜態成員(沒有this指標不可訪問非靜態成員)
靜態成員和類的普通成員一樣,也有public、protected、private3種訪問級別,也可以具有返回值,
const修飾符等引數(和類普通成員相同)
面試題:求1+2+3+…+n
class solution };
intsum_solution
(int n)
private:
static
int i;
static
int sum;};
int solution:
:i =1;
int solution:
:sum =
0;
友元分為:友元函式和友元類友元提供了一種突破封裝的方式,有時提供了便利。但是友元會增加耦合度,破壞了封裝,所以友元不宜多
用。友元函式可以直接訪問類的私有成員,它是定義在類外部的普通函式,不屬於任何類,但需要在類的內部聲
明,宣告時需要加friend關鍵字。
若直接過載《或者》將不能使用正常順序書寫。
class date
void
display()
private:
int _year;
int _month;
int _day;};
ostream& operator<<
(ostream& _cout,
const date& d)
istream& operator>>
(istream& _in, date& d)
intmain()
說明:
友元函式可訪問類的私有成員,但不是類的成員函式(不是類成員)
友元函式不能用const修飾(const只能用來修飾this指標)
友元函式可以在類定義的任何地方宣告,不受類訪問限定符限制(隨機定義)
乙個函式可以是多個類的友元函式(多指向性)
友元函式的呼叫與普通函式的呼叫和原理相同(呼叫原理相同)
友元類的所有成員函式都可以是另乙個類的友元函式,都可以訪問另乙個類中的非公有成員。比如上述time類和date類,在time類中宣告date類為其友元類,那麼可以在date類中直接訪問time友元關係是單向的,不具有交換性。
類的私有成員變數,但想在time類中訪問date類中私有的成員變數則不行。
友元關係不能傳遞
如果b是a的友元,c是b的友元,則不能說明c時a的友元。
class date;
// 前置宣告
class time
private:
int _hour;
int _minute;
int _second;};
class date
void
settimeofdate
(int hour,
int minute,
int second)
private:
int _year;
int _month;
int _day;
time _t;
};
內部類就是外部類的友元類。注意友元類的定義,內部類可以通過外部類的物件引數來訪問外部類中
的所有成員。但是外部類不是內部類的友元。
class a};
};int a:
:k =1;
intmain()
a的大小計算與b的大小無關,上面的**大小為4(靜態成員變數不計算大小)
內部類可以定義在外部類的public、protected、private都是可以的。
注意內部類可以直接訪問外部類中的static、列舉成員,不需要外部類的物件/類名。
sizeof(外部類)=外部類,和內部類沒有任何關係。
C 學習筆記 類和物件(下篇)
include using namespace std 初始化列表 class b private int a 4 char b 1 class a class d private int g void display private int year 4 int month 4 int day 4...
C 類和物件 類和物件
c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...
C 物件和類
1,特殊的類 字串string include include using namespace std int main 類似於標準庫函式,我們不需要記住每種 類 的全部操作,只需要在使用過程中記住一些常用的操作就可以了。如果有需要的話,可以求助於相關書籍或網路 2,當我們對string進行種種操作...