類(2)
阿新 • • 發佈:2018-11-11
類的種類
區域性物件:棧區
class Cperson
{
public:string name;
private:int age;
protected:bool sex;
public:
Cperson()//沒有引數的建構函式
{ name="leilei";
age=0;
sex=1;
}
Cperson(string name1,int age1,bool sex1)//有引數的建構函式
{ name=name1;
age=age1;
sex=sex1;
}
int main(){
{Cperson pp;
}//
作用域結束呼叫解構函式
return 0;
}
全域性物件
class Cperson
{
public:string name;
private:int age;
protected:bool sex;
public:
Cperson()//沒有引數的建構函式
{ name="leilei";
age=0;
sex=1;
}
Cperson(string name1,int age1,bool sex1)//有引數的建構函式
{ name=name1;
age=age1;
sex=sex1;
}
} } 有兩種情況一定要使用初始化成員列表 第一種情況就如上述所說明的第二種情況 若是一個類中成員變數是另一個類的物件 而這個只有帶有引數的建構函式這時就必須在初始化成員類表中初始化物件 常函式 類中的成員函式用const修飾的為常函式 void show() const//常函式不能修改類中的成員變數 在類中函式的引數都有一個系統預設的本型別的this指標 常函式的指標實 //際上是 const Cperson * this 這代表*this 不能更改 而this 可以更改 { } 繼承 類之間的縱向關係 class Csuperman :public Cperson //Csuperman 繼承Cperson public 代表繼承的方式 繼承是把父類中的所有成員都繼承過來 繼承是為了提高複用性 若子類和父類同時出現相同的成員變數 那麼我們就用作用域運算子來區分 public private protected 繼承方式之間的區別 無論哪種繼承方式一定是繼承過來父類中所有的成員變數
int getage()
{ return age;//得到年齡的介面函式如果我們在類外想要訪問類內的私有的或受保護的成員變數就要呼叫介面函式 } bool getsex() { return sex; } void setage(int age1)//呼叫介面函式間接給類的成員變數賦值 { age=age1; } };int getage()
{ return age;//得到年齡的介面函式如果我們在類外想要訪問類內的私有的或受保護的成員變數就要呼叫介面函式 } bool getsex() { return sex; } void setage(int age1)//呼叫介面函式間接給類的成員變數賦值 { age=age1; } };int getage()
{ return age;//得到年齡的介面函式如果我們在類外想要訪問類內的私有的或受保護的成員變數就要呼叫介面函式 } bool getsex() { return sex; } void setage(int age1)//呼叫介面函式間接給類的成員變數賦值 { age=age1; } };int getage()
{ return age;//得到年齡的介面函式如果我們在類外想要訪問類內的私有的或受保護的成員變數就要呼叫介面函式 } bool getsex() { return sex; } void setage(int age1)//呼叫介面函式間接給類的成員變數賦值 { age=age1; } }; Cperson pp;// 定義全域性物件 在整個程式結束後呼叫析構 int main(){ } 在堆區new的物件 int main(){ { Cperson *ps=new Cperson;//沒有析構需要手動釋放 } return 0; } 臨時物件 int main() { Cperson();//生命週期在當前行 當前行結束後物件被回收 } 如何選擇哪一類物件 看生命週期 是否由使用者控制如果是就用new 是否程式從執行到結束一直存在 要用全域性或static 類中的普通變數定義物件的時候就存在 類中的函式在編譯的時候就放在程式碼段只有一份 const const修飾的變數不能更改(常量) 若類中裝有帶const修飾的成員 class Cperson{ public: const int num;//const修飾的變數一定要在定義的時候初始化那麼就 //一定要在類的 初始化類表中初始化 public: Cperson():num(123)// 初始化列表 { }// 呼叫建構函式的時候先執行初始化類表再執行建構函式內的內容 常量一定要在初始化列表中初始化 還有另一種情況一定要在初始化列表中定義 在一個類中定義了另一個類的成員變數 而另一個類中定義了帶有引數的建構函式 在類中應該注意的小知識點 const const修飾的變數不能更改 const int *p=#//這裡的*p不能更改 而p可以更改 若類中成員變數有const修飾的 那麼是需要初始化的可是在類中不能給成員變數初始化這時就需要引入初始化成員列表 class Cperson { public: const int num; public: Cperson():num(123)//初始化成員列表先執行初始化成員列表在執行建構函式若有多個成員變數需要初始化則用逗號隔 {} } 有兩種情況一定要使用初始化成員列表 第一種情況就如上述所說明的第二種情況 若是一個類中成員變數是另一個類的物件 而這個只有帶有引數的建構函式這時就必須在初始化成員類表中初始化物件 常函式 類中的成員函式用const修飾的為常函式 void show() const//常函式不能修改類中的成員變數 在類中函式的引數都有一個系統預設的本型別的this指標 常函式的指標實 //際上是 const Cperson * this 這代表*this 不能更改 而this 可以更改 { } 繼承 類之間的縱向關係 class Csuperman :public Cperson //Csuperman 繼承Cperson public 代表繼承的方式 繼承是把父類中的所有成員都繼承過來 繼承是為了提高複用性 若子類和父類同時出現相同的成員變數 那麼我們就用作用域運算子來區分 public private protected 繼承方式之間的區別 無論哪種繼承方式一定是繼承過來父類中所有的成員變數
class Cson: public Cfather //繼承過來的成員變數跟父類的訪問修飾符相同但是父類中私有的在這裡是不可訪問的
calss Cson:protected Cfather //繼承過來的父類成員變數 public->protected protected保持不變 private->不可訪問的
class Cson :private Cfather // private->不可訪問的 public、protected->private 自己的類中不能呼叫自己的物件但是可以呼叫只想本類的指標 因為在自己類中定義自己的物件 這個類還沒定義完所以不知道應該分配多大的空間 若定義指向本類的指標就可以因為指標就分配4個位元組大小的空間 繼承關係中 建構函式和解構函式呼叫的順序 構造 從上到下 從父類到子類 析構 從下到上 從子類到父類