c 類函式返回的this指標,到底該怎麼使用

2022-03-12 07:40:03 字數 6333 閱讀 4674

1樓:匿名使用者

this ->  +-------+

+ name  +

+ ----  +

+ price +

+ ----- +

+ nint  +

+ ----- +

+ demo  +

+-------+

每個class都會有上面一份資料,函式內容在記憶體中只有一份資料,大家公用,所以this就是指代當前正在使用這個函式的類的資料的首地址,有了首地址後就可以訪問這個類的所有資料成員了。

+--------+

+ demo   +

+        +

+        +

+        +

+        +

+ ------ +

+ print  +

+        +

+        +

+        +

+--------+

你沒有動態申請記憶體(使用關鍵字new),那麼就不用delete資料,當前的this指標指向的內容在棧上面

book a // 資料在棧上建立,只有 book *a = new book() 才會在heap上建立資料,只有那樣才需要delete a, 棧上的會自動清理,就是所謂的一旦函式執行完了,在函式裡宣告的變數就都消失了。

2樓:匿名使用者

this如ls所說就是指向物件自身的一個指標,方便在類函式內部呼叫的。

你這裡其實資料都儲存在vector中,直接操作vector就行了。更主要的問題則是邏輯上的。book這個類看含義,主要是兩項,書名和**,一本書是一個book物件。

但內部又嵌入了一個vector,是一組書。vector內每個book又包含一個book vector……迴圈巢狀下去,都塊暈了。

更好的做法是先宣告一個struct結構體,表示每一本書。

struct book

;class cbooklist

;類似的樣子吧,僅供引數,如有錯誤,見諒。

誰能詳細的解釋一下c++類中的的this指標的詳細內容!主要是用this返回物件的引用?

3樓:

一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。

this指標是類的一個自動生成、自動隱藏的私有成員,它存在於類的非靜態成員函式中,指向被呼叫函式所在的物件的地址。全域性僅有一個this指標,當一個物件被建立時,this指標就指向物件資料的首地址。

4樓:記住一座城

每一個非靜態成員函式裡面都有一個隱式的this指標,它指向當前呼叫函式的物件。

比如 stu.output(); this 指向stu的首地址。

5樓:匿名使用者

1、其實在編譯器內部,成員函式和非成員函式的呼叫是一樣的。你定義了一個類的成員函式,編譯器會把它變成一個普通函式,為了知道哪一個物件呼叫了該函式,它會插入一個引數,比如

class test

……};

針對fun編譯器生成的的全域性函式是

void fun(test* this,int i){}//沒考慮重新命名機制

如果有這樣的應用

test t1;

t1.fun(2);//case 1

對於case 1編譯器生成的**是

fun(&t1,2);

2、如果成員函式是const修飾的

class test

……};

那麼編譯器的處理是

void fun(const test* this,int i){}也就是說,你不能改變this指向的物件

3、至於static修飾的函式,它不屬於任何類,因此編譯器不會插入this指標。

4、若是要返回物件的引用的話,可以這樣

class test

……};

c++靜態成員函式裡,為何不能直接使用this指標?

6樓:匿名使用者

static函式屬於類不屬於物件(物件裡不分配記憶體),this是物件的指標(指向的是物件分配的記憶體,所以this訪問不到static函式)。

7樓:匿名使用者

使用靜態成員函式的目的就是使這個函式成為「類」級別的,而不是「物件級別」的,實際上相當於必須通過這個類使用的全域性函式,是不屬於任何物件的,如果你感覺一個靜態成員函式需要處理物件,那麼很可能是應該把它定義為成員函式。靜態成員函式不能呼叫普通成員函式和使用普通成員變數。

8樓:兜裡有兩塊糖

靜態成員不屬於物件本身。

this指標其實是物件指標,既然靜態不是物件本身的東西,那麼this指標自然也不可以用。

9樓:

你這裡沒有設定成靜態函式啊,在f前面加個static,你看看還能執行不。

10樓:匿名使用者

靜態成員函式並不是針對某個類的例項物件,而是屬於整個類的,為所有的物件例項所共有。他在作用域的範圍內是全域性的,獨立於類的物件之外的。他只對類內部的靜態成員變數做操作。

當例項化一個類的物件時候,裡面不存在靜態成員的。this指標是相當於一個類的例項的指標,this是用來操作物件例項的內容的,既然靜態成員函式和變數都是獨立於類的例項物件之外的,他就不能用this指標。也不能操作非靜態成員。

再有你要想想設計靜態成員的用意在**,就會更加明瞭了

c++類函式中怎麼返回和使用二維陣列

11樓:仙戈雅

#include

using namespace std;

class foo

;foo::foo()

foo::~foo()

// 返回指向二維陣列的指標函式

int ** foo::test2darray(unsigned r, unsigned c)

}return arr2d;

}int main()

cout << endl;

}// 釋放記憶體

for (int i = 0; i < 3; i++)delete arr2d;

delete foo;

return 0;}

12樓:匿名使用者

c++中函式不能直接返回二維陣列,但可以返回函式指標

13樓:千鋒教育

不要把二維陣列與二維指標混淆在一起,他們是不同的意義的。

指標是指標變數的簡稱,它可以儲存「資料」的地址。

無論是幾維的陣列,陣列名只不過是一個地址的代號,好比是一個樓的樓號(相當於地址),它不能被改變,可以賦給任何型別的指標變數(因為指標變數中存的是地址,在一個計算機中,地址所佔的空間是一樣的,所以,可以隨意賦值),但根據指標變數的型別的不同,在引用時會有不同的結果表現,用不好就會「死掉」。

儘量不要使用區域性變數的返回引用,這樣不可靠。如你的例子:當a函式結束後,原則上b所處的位置的資料系統就不保證了,如果有別的程式用,你的b空間裡的資料就可能被覆蓋了。

如果非要用,建議這樣:int *a(); return b;}

如果你返回的二維陣列是一個固定大小的,那麼,就在呼叫者程式中,建立陣列,通過引數傳遞過去進行賦值

c++當一個類成員函式被執行 this指標 ( ) 指向呼叫它的物件

14樓:篤俠

填 「自動」 或 「預設」

15樓:匿名使用者

或許是 始終

16樓:回首茫茫空餘恨

請將問題描述得更完整一些。

17樓:匿名使用者

。。。沒有逗號麼?看著好混亂

c++this指標詳解

18樓:董俊錕

this指標只能在一個類的成員函式中呼叫,它表示當前物件的地址。下面是一個例子:

void date::setmonth( int mn )

1. this只能在成員函式中使用。

全域性函式,靜態函式都不能使用this。

實際上,成員函式預設第一個引數為t* const register this。

如: class a};

其中,func的原型在編譯器看來應該是: int func(a* const register this, int p);

2. 由此可見,this在成員函式的開始前構造的,在成員的結束後清除。

這個生命週期同任一個函式的引數是一樣的,沒有任何區別。

當呼叫一個類的成員函式時,編譯器將類的指標作為函式的this引數傳遞進去。如:

a a;

a.func(10);

此處,編譯器將會編譯成: a::func(&a, 10);

嗯,看起來和靜態函式沒差別,對嗎?不過,區別還是有的。編譯器通常會對this指標做一些優化的,因此,this指標的傳遞效率比較高--如vc通常是通過ecx暫存器來傳遞this引數。

3. 回答

#1:this指標是什麼時候建立的?

this在成員函式的開始執行前構造的,在成員的執行結束後清除。

#2:this指標存放在何處? 堆,棧,全域性變數,還是其他?

this指標會因編譯器不同,而放置的位置不同。可能是棧,也可能是暫存器,甚至全域性變數。

#3:this指標如何傳遞給類中函式的?繫結?還是在函式引數的首引數就是this指標.那麼this指標又是如何找到類例項後函式的?

this是通過函式引數的首引數來傳遞的。this指標是在呼叫之前生成的。類例項後的函式,沒有這個說法。

類在例項化時,只分配類中的變數空間,並沒有為函式分配空間。自從類的函式定義完成後,它就在那兒,不會跑的。

#4:this指標如何訪問類中變數的/?

如果不是類,而是結構的話,那麼,如何通過結構指標來訪問結構中的變數呢?如果你明白這一點的話,那就很好理解這個問題了。

在c++中,類和結構是隻有一個區別的:類的成員預設是private,而結構是public。

this是類的指標,如果換成結構,那this就是結構的指標了。

#5:我們只有獲得一個物件後,才能通過物件使用this指標,如果我們知道一個物件this指標的位置可以直接使用嗎?

this指標只有在成員函式中才有定義。因此,你獲得一個物件後,也不能通過物件使用this指標。所以,我們也無法知道一個物件的this指標的位置(只有在成員函式裡才有this指標的位置)。

當然,在成員函式裡,你是可以知道this指標的位置的(可以&this獲得),也可以直接使用的。

#6:每個類編譯後,是否建立一個類中函式表儲存函式指標,以便用來呼叫函式?

普通的類函式(不論是成員函式,還是靜態函式),都不會建立一個函式表來儲存函式指標的。只有虛擬函式才會被放到函式表中。

但是,既使是虛擬函式,如果編譯器能明確知道呼叫的是哪個函式,編譯器就不會通過函式表中的指標來間接呼叫,而是會直接呼叫該函式。

# 7:這些編譯器如何做到的?8:能否模擬實現?

知道原理後,這兩個問題就很容易理解了。

其實,模擬實現this的呼叫,在很多場合下,很多人都做過。

例如,系統**函式。系統**函式有很多,如定時,執行緒啊什麼的。

舉一個執行緒的例子:

class a

void process(){}

};main()

這裡就是定義一個靜態函式來模擬成員函式。

也有許多c語言寫的程式,模擬了類的實現。如freetype庫等等。

其實,有用過c語言的人,大多都模擬過。只是當時沒有明確的概念罷了。

如:typedef struct studentstudent;

void initstudent(student* pstudent);

void addscore(student* pstudent, int score);

...如果你把 pstudent改成this,那就一樣了。

它相當於:

class student

const常量可以有物理存放的空間,因此是可以取地址的

///this指標是在建立物件前建立.

this指標放在棧上,在編譯時刻已經確定.

並且當一個物件建立後,並且執行整個程式執行期間只有一個this指標.

c如何函式返回值,c如何函式返回值

返回值是右值 只能在等號右邊 可以用一個變數來接受收 函式也可以通過引用和指標來改變外部變數的值 c 中的返回值指的是什麼?首先,c語言中的函式有兩種形式 1 有返回值,2 無返回值。有返回值的函式會把內執行的結果 容也就是你寫這個函式的目的 返回到主函式中。沒有返回值的函式主要是為了完成某種任務 ...

關於C 函式返回值的問題,C 函式返回值問題

include class test public test int x 0 i x cout 新建的該物件的地址為 test cout 析構地址為 正確輸出,不過你的 確實認人匪姨所思 與實參的問題 以一個簡單的程式為例來說明 void mswapa int a,int b 這 兩個函式都是交換a...

c語言中函式返回型別和函式返回值

函式的返回值bai 通過return語句來執du行,即zhireturn後的變數或表示式的值dao 就為專該函式的返回值 你可以根屬據需要自定義返回什麼值 而返回值的型別是指該值你想要得到的型別,比如return a a的型別,你在函式體裡定義的是int a 但根據需要,你要的是一個float型的返...