第十章 物件和類

2021-08-11 16:35:34 字數 3709 閱讀 1825

c++中,類由兩部分組成:

1、類宣告。包括成員變數和成員函式。一般方法在標頭檔案中。

2、類方法定義。包括成員函式的定義。一般放在實現源**中。

控制訪問中有有兩個關鍵字:private和public

直接上圖:

類物件可以直接訪問public成員 ,而private成員只能通過public方法來訪問。

private是可選的,因為不寫的話,預設就是private。

類預設訪問型別是private,而結構預設訪問型別是public。

實現成員函式:

1、定義成員函式時,使用作用域解析符::來標示函式所屬的類。

2、類方法可以訪問類的private元件。

內聯方法:其定義位於類宣告中的函式都將自動成為內聯函式,類宣告常將短小的成員函式作為內聯函式。寫進標頭檔案中。

10.3建構函式和析構函式。

建構函式和析構函式定義時,也必須加類作用域

為區分構造函式引數名和類成員名,一般有兩種做法:

1、類成員名前加m_字首

2、類成員名後加_字尾

建構函式是用來建立物件的,不能通過物件呼叫!因為在建構函式構造出物件之前,物件不存在。

預設建構函式:

在使用者沒有提供任何建構函式時,c++提供乙個預設建構函式:stock::stock();

如果提供了自定義的建構函式,很奇怪,這個預設建構函式就不提供了,想用的話,就必須自己敲上。

自己敲預設建構函式有兩種方式,一種就是像預設的那樣,手敲乙個就好了。另一種就是給自定義的建構函式的所有引數提供預設值。

一開始感覺提供預設值是個不錯的方法,能少寫東西,後來發現,還是老老實實的把預設建構函式敲出來,瞅著順眼一些。

析構函式沒有返回值(連void都沒有),也沒有引數,在其類名稱前加~就好了!

放一段類宣告、類定義和類使用的**:

#ifndef student_h_

#define student_h_

#include

class

student

;#endif

#include

#include"student.h"

student::student()

student::student(std::string name, int age)

student::~student()

void student::show()

//using cpp

int main

在初始化部分,說一下c++11的列表初始化。就是大括號{}的應用,如下幾種都是可以的:

student james{};

student kobe;

student jordan = ;

const成員函式:先看一段**:

const student kobe("kobe", 32);

kobe.show();//這句會報錯,因為編譯器懷疑show()方法將會對kobe物件做更改,而kobe又是const的。

解決方法就是,成員函式在不修改類物件的情況的下,在宣告和定義時在函式後新增const:

//類方法宣告中:

void show() const;

//函式定義中:

void student show() const

this指標:
#ifndef student_h_

#define student_h_

#include

class

student

;#endif

#include

#include"student.h"

...const student& older(const student& s) cosnt

說一下成員函式中的三個const。

這個成員函式呼叫了兩個物件:

乙個是引數列表中的s,為顯式呼叫,因為直接寫出來了。

另外乙個就是本身物件,為隱式呼叫,因為它用到了本身物件的age成員。

引數列表中的const表示不會改動顯式呼叫的s物件。

函式後方的const表示不會改動隱式呼叫的物件,也就是本身物件。

函式返回值的const表示返回的是const型別物件,因為是引用,所以返回物件肯定在s和本身物件之間,這倆都是const,所以返回型別也是const。

再說一下this,this是指標,指向用來呼叫成員函式的物件。也就是指向物件本身。

由於是指標,所以*this為解引用後的物件。而呼叫物件成員和方法的話要用->

使用如下:

student older;

older = kobe.older(james);//這兩種方式都可以。

older = james.older(kobe);//這兩種方式都可以。

物件陣列。只說一句:要建立類物件陣列,類必須要有預設建構函式。類作用域:在類中定義的名稱(資料成員或函式成員)的作用域為整個類。在類中已知,類外未知。類作用域意味著不能從外部直接訪問類的成員,也就是說,要呼叫成員資料或者成員方法,必須通過物件。

kobe.show();//這樣是可以的。

show();//直接這樣不對!

總之,在類宣告中,可以什麼都不加。在類定義中,需要加類作用域。在呼叫時,必須通過物件。建構函式也不例外,因為它用於物件建立。

關於類成員初始化這塊,比較繞,單開一篇寫一寫。

作用域內列舉在這種情況下出現:

enum egg ;

enum t-shirt ;//尷尬了,兩個列舉,同樣的名字。。

在列舉名前加上class即可:

enum

class

egg ;

enum

class

t-shirt ;

用的時候,加上列舉名限定列舉量就可以了;

egg choice = egg:

:small;

t_shirt floyd = t_shirt:

:large;

10.7的抽象資料型別,深層次是資料結構和stl相關的東西,所以後續再說。這裡只需要知道,這裡它定義的類不是具體的類了,不像student這種非常具體的類,而是乙個抽象的容器,然後用類實現,搞出來乙個容器類,用這個類去對資料進行儲存和操作。

第十章 物件和類

物件導向是一種程式設計風格,用於任何一種語言。過程性程式設計 考慮遵循的步驟,使用者希望有哪些功能,我如何提供,如何儲存資料。物件導向程式設計 首先考慮使用者,確定乙個物件的屬性和操作這些屬性的方法。使用者介面有哪些。相當於自己定製的乙個新的型別,這個型別的屬性和可以對這些屬性進行的操作 介面就是將...

第十章 物件和類

oop 過程性程式設計和物件導向程式設計 抽象和類 型別是什麼 c 中的類 介面 實現類成員函式class classname 類的建構函式和析構函式 建構函式 預設建構函式bozo int age 建構函式原型 bozo dribble bozo 44 初始化方式1 bozo roon 66 初始...

第十章 物件和類

通常,c 程式設計師將介面 類定義 放在標頭檔案中,並將實現 類方法的 放在源 檔案中。在oop中,通常把物件成員函式的呼叫稱作傳送訊息給物件。訪問控制關鍵字 private 類預設的訪問控制 public 結構體預設的訪問控制 protected。將實現細節放在一起,並將它們與抽象分開的思想稱為封...