#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類不允許被繼承,不允許被改動 ...