C 類和物件(中)

2021-09-19 13:13:47 字數 4593 閱讀 8226

#define _crt_secure_no_warnings 1;

#includeusing namespace std;

#include#if 0

//建構函式是乙個特殊的成員函式,名字與類名相同,

//建立類型別物件時由編譯器自動呼叫,保證每個資料成員 都有 乙個合適的初始值,

//並且在物件的生命週期內只呼叫一次

class date

//2.帶參建構函式

date(int year, int mouth, int day)

private:

int _year;

int _mouth;

int _day;

};int main()

#endif

#if 0

//預設建構函式

//無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。

//注意:無參 建構函式、全預設建構函式、我們沒寫編譯器預設生成的建構函式,都可以認為是預設成員函式

class date

date(int year = 1900, int mouth = 1, int day = 1)

private:

int _year;

int _mouth;

int _day;

};int main()

#endif

//編譯器生成預設的建構函式會對自定型別成員_t呼叫的它的預設成員函式

#if 0

class time

private:

int _hour;

int _minute;

int _second;

};class date

;int main()

#endif

//析構函式

//析構函式是特殊的成員函式。

//其特徵如下:

//1. 析構函式名是在類名前加上字元 ~。

//2. 無引數無返回值, 析構函式不能過載。

//3. 乙個類有且只有乙個析構函式。若未顯式定義,系統會自動生成預設的析構函式。

//4. 物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。

//5. 注意析構函式體內並不是刪除物件,而是做一些清理工作。

#if 0

#includetypedef int datatype;

class seqlist

~seqlist() }

private:

int* _pdata;

size_t _size;

size_t _capacity;

};void test()

int main()

#endif

#if 0

class a

void display()

void seta(int a)

public:

int _a = 10;

const int _b = 100;

};int main()

#endif

//拷貝建構函式

//1. 拷貝建構函式是建構函式的乙個過載形式。

//2. 拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

//(傳參的時候會拷貝乙個臨時變數,這個臨時變數會呼叫拷貝建構函式,這樣就會無限遞迴)

#if 0

class date

date(const date& d)

private:

int _year;

int _mouth;

int _day;

};int main()

#endif

#if 0

//拷貝建構函式若未顯示定義,系統會生成預設的拷貝建構函式

class date

private:

int _year;

int _mouth;

int _day;

};int main()

#endif

#if 0

//需要深拷貝

class string

~string()

private:

char* _str;

};int main()

#endif

#if 0

//賦值運算子過載 operator

//c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,

//也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。

//1.不能通過連線其他符號來建立新的操作符:比如operator@

//2.過載操作符必須有乙個類型別或者列舉型別的運算元

//3.用於內建型別的操作符,其含義不能改變,例如:內建的整型 + ,不 能改變其含義

//4.作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的

//操作符有乙個預設的形參this,限定為第乙個形參

//5. .* (類成員指標訪問運算子)、

//:: (域運算子)

//sizeof(長度運算子)

//?: (三目操作符/條件操作運演算法)

//. (成員訪問操作符)

//注意以上5個運算子不能過載。這個經常在筆試選擇題**現。

class date

//bool operator==(const date& d1, const date& d2)

//{} 此運算子函式的引數太多

//bool operator==(date* this, const date& d)

//左運算元是this指向的呼叫函式的物件

bool operator==(const date& d)

private:

int _year;

int _mouth;

int _day;

};int main()

#endif

#if 0

//賦值運算子過載

class date

date(const date& d)

//void operator=(const date& d)

// //}

date& operator=(const date& d)

return *this;

}private:

int _year;

int _mouth;

int _day;

};int main()

#endif

//賦值運算子主要有五點:

//1. 引數型別

//2. 返回值

//3. 檢測是否自己給自己賦值

//4. 返回* this

//5. 乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,

// 完成物件按位元組序的值拷貝。(淺拷貝)

#if 0

class string

~string()

//string& operator=(const string& s)

// // return *this;

//}private:

char* _str;

};int main()

#endif

#if 0

//const 修飾的成員函式:

//將const修飾的類成員函式稱之為const成員函式,

//const修飾類成員函式,實際修飾該成員函式隱含的this 指標,

//表明在該成員函式中不能對類的任何成員進行修改。

class date

//void display(const date* this) //編譯器對const 成員函式的處理

void display()const //const 修飾的成員函式

void display()

//void setdate()

// void setdate()const

private:

int _year;

int _mouth;

int _day;

};int main()

//const 物件不可以呼叫非const 成員函式

//const 成員函式不能呼叫其他的非const 成員函式

//非const物件可以呼叫const成員函式

//非const 成員函式可以呼叫其他的const成員函式

//const 物件可以呼叫其他的const成員函式

//const 成員函式可以呼叫其他的const 成員函式

#endif

# if 0

//取位址及const 去位址操作符過載

//這兩個預設成員函式一般不用重新定義 ,編譯器缺省會生成

//如果想讓別人獲取到指定的內容則需要過載

class date

const date* operator&()const

private:

int _year;

int _mouth;

int _day;

};#endif

C 類和物件(中)

一 類的六個預設成員函式 1 初始化和清理。建構函式完成初始化,析構函式完成清理 2 拷貝複製 拷貝建構函式使用同類物件建立物件,賦值過載是把乙個物件賦值給另乙個物件 3 取位址和過載 主要是對普通物件和const物件取位址 二,建構函式 1 建構函式是乙個特殊成員函式,名字和類名相同,建立類型別物...

C 類和物件(中)

目錄 1.建構函式 2.析構函式 3.拷貝建構函式 4.賦值運算子的過載 5.const成員 6.取位址及const取位址操作符過載 乙個類中,如果沒有任何成員,稱為空類。任何乙個類中,都會包含6個預設的成員函式,即使是空類也會自動生成6個預設成員函式,如下為類中的6個預設成員函式 注意 預設成員函...

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...