類的其他特性

2021-07-12 00:11:56 字數 3772 閱讀 5681

#include 

#include

using

namespace

std;

class screen

//contents初始化的意思是,有ht乘wd個字元c初始化乙個string型別

char get() const

//讀取游標處的字元

inline

char get(pos ht, pos wd) const; //顯式內聯

screen &move(pos r, pos c); //能在之後被設為內聯

private:

pos cursor = 0;

pos height = 0, width = 0;

std::string contents;

};//雖然我們沒必要在類的裡面和外面都用inline來宣告,但是這樣

//是合法的,不過最好只在類的外部說明inline,這樣更容易理解

inline

//可以在函式的定義處指定

screen &screen::move(pos r, pos c)

char screen::get(pos r, pos c) const

//在類的內部宣告成inline

int main()

內聯函式從源**層看,有函式的結構,而在編譯後,卻不具備函式的性質。內聯函式不是在呼叫時發生控制轉移,而是在編譯時將函式體嵌入在每乙個呼叫處。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。一般在**中用inline修飾,但是能否形成內聯函式,需要看編譯器對該函式定義的具體處理

內聯說明(inline specification)對於編譯器來說只是乙個建議,編譯器可以選擇忽略這個建議

char k = p.get(5,7);

00cd6435 push

700cd6437 push

500cd6439 lea ecx,[ebp-3ch]

//採用的呼叫的方式來呼叫內聯函式,所以說明內聯函式沒有嵌入到呼叫處

00cd643c call

00cd14d8

00cd6441 mov byte ptr [ebp-45h],al

使用關鍵字mutable,這樣乙個const成員函式也可以改變乙個可變成員的值了

類內初始值就是把類內部的資料進行預設初始化,要麼放在花括號裡面,要麼放在=號右邊,不能使用圓括號

class screen

//contents初始化的意思是,有ht乘wd個字元c初始化乙個string型別

char get() const

//讀取游標處的字元

inline

char get(pos ht, pos wd) const; //顯式內聯

screen &move(pos r, pos c); //能在之後被設為內聯

void some_member() const;

private:

pos cursor=0;

pos height=0, width=0;

std::string contents;

mutable size_t access_ctr; //即使在乙個const物件內也能被修改

};//雖然我們沒必要在類的裡面和外面都用inline來宣告,但是這樣

//是合法的,不過最好只在類的外部說明inline,這樣更容易理解

inline

//可以在函式的定義處指定

screen &screen::move(pos r, pos c)

char screen::get(pos r, pos c) const

//在類的內部宣告成inline

void screen::some_member() const

class window_mgr

;};

返回*this的成員函式,則呼叫的直接就是類的物件本身,而不是他的副本。

#include 

#include

using namespace std;

class

screen

char get() const

char get(index r, index c)const

screen& move(index r, index c);

screen& set(index, index, char);

screen& set(char);

private:

std::string contents;

index cursor;

index height, width;

};screen& screen::move(index r, index c)

screen& screen::set(index r, index c, char ch)

screen& screen::set(char c)

int main()

從const成員函式返回*this

在普通的非const成員函式中,this的型別是乙個指向類型別的const指標,可以改變this所指向的值,但不能改變this所儲存的位址。在const成員函式中,this的型別是乙個指向const類型別的const指標,既不能改變this所指向的物件,也不能改變this所儲存的位址

不能從const所員函式返回指向類物件的普通引用。const成員函式只能返回*this作為乙個const 引用。

#include 

#include

using

namespace

std;

class screen

char get() const

char get(index r, index c)const

screen& move(index r, index c);

screen& set(index, index, char);

screen& set(char);

const screen& display(std::ostream &os)const

screen& display(std::ostream &os)

private:

std::string contents;

index cursor;

index height, width;

void do_display(std::ostream &os)const

};screen& screen::move(index r, index c)

screen& screen::set(index r, index c, char ch)

screen& screen::set(char c)

int main()

書本p144說:允許指向非常量型別指標轉換成指向相應的常量型別指標,對於引用也是這樣。也就是說,如果t是一種型別,我們就能將指向t的指標或引用分別裝換成指向const t的指標或型別。

乙個成員呼叫另乙個成員時,this指標在其中隱式地傳遞。因此,當display呼叫do_display時,它的this指標將隱式地從指向非常量的指標轉換成指向常量的指標。當do_display完成後,display函式各自解引用this所得的物件。在非常量版本中,this指向乙個非常量物件,因此display返回乙個普通的(非常量)引用;而const成員則返回乙個常量引用。

C 類的其他特性(筆記版本)

型別成員 就是類的成員是乙個型別 ok舉個例子 class peron public typedef std string zm private zm name love ke zm address anywhere 我們的person類在public部分定義了zm,這樣使用者就可以使用這個名字。因...

類的組合特性

若在邏輯上a是b的 一部分 則不允許b從a派生,而是要用a和其他部分組合成b。例如眼 eye 鼻 node 口 mouth 是頭的一部分,所以應該head應該由類eye node mouth組合而成,不是派生而成。class eye class node class mouth class head...

類的高階特性

被定義為final的物件引用只能指向唯一乙個物件,不可以將它指向其他物件,但是乙個物件的值本身是可以改變的,為了使乙個常量做到真正不可更改,可以將常量宣告為 static final 全域性常量 乙個被定義為private的方法隱式的被指定為 final 型別final類不允許被繼承,不允許被改動 ...