1. 程式人生 > >類中函式的一個隱含引數--this指標

類中函式的一個隱含引數--this指標

為什麼會有this指標呢?

我們需要來看一段程式碼感受一下。

#include <iostream>
using namespace std;
class Student 
{
 public:
 void InitStudent(char *name,char*gender,int age)
 {
   strcpy(_name,name);
   stcpy(_gender,gender);
   _age = age;
 }
 private:
 char _name[20];
 char _gender[5];
 int _age = age;
};
int main ()
{
    Student s1,s2;
    s1.InitStudent("chan"
,"nv",18);//在這裡為什麼只要進入這個初始化函式系統就知道你要初始化的是s1,為什麼呢?這個時候我們就知道了原來在類的成員函式中有一個預設的隱含指標,this。 s2.InitStudent("xin","nan",21); return 0; } 所以上面那個函式引數加完整的話應該為 InitStudent(const *this,cha*name,char*gender,int *age);

那麼什麼是this指標呢?

this指標作為一個隱含引數傳遞給非靜態成員函式,用以指向該成員函式所屬類所定義的物件。當不同物件呼叫同一個類的成員函式程式碼時,編譯器會依據該成員函式的this指標所指向的不同物件來確定應該一用哪個物件的資料成員。下面舉一個簡單例子。

#include<iostream>
using namespace stdclass Student
{
    public:
    void InitStudent(char *name,char *gender,int *age)
    {
     strcpy(this->_name,name);
     strcpy(this->_gender ,gender);
     test->_age = age;//在這裡為什麼可以使用this這個指標呢,並沒有定義啊,這就是因為,他是一個隱含的引數。
    }
};
int main()
{
 Student s1,s2;
 s1.InitStudent("chan"
,"nv",18);//在這裡執行一下你就可以發現this的地址和s1的地址是相同的 s2.InitStudent("xin","nan",21); return 0; }

這裡寫圖片描述
從圖片可以看出兩者的地址是相同的。

那麼在類外還有沒有this指標呢?

開始已經說了this指標是類中函式的一個隱含引數,是不是呢,以下是一個小小的檢測。
這裡寫圖片描述
可以看出,當你在類外自己定義一個函式時,編譯器根本不能能編譯通過,說明它確實只能在類中使用。

this指標有哪些特性呢

1:this是一個指標,它時時刻刻指向你這個例項本身。
2:this指標的型別 類型別 *const
3 : this指標並不是對子昂本身的一部分,不影響sizeof的結果
4:this指標的作用域在類成員函式的內部
5:只有在類的非靜態成員函式中才可以使用,其它任何函式都不可以

this指標是怎麼傳參的

1:引數個數確定,this指標通過ecx傳遞給呼叫者。
2:引數不確定,this指標在所有引數被壓入棧後再壓入堆疊。
這裡會涉及到兩個函式呼叫約定 __cdecl __thiscall

那麼什麼是函式呼叫約定呢?

函式呼叫約定是指當一個函式被呼叫時,函式的引數會被傳遞給被呼叫的函式和返回值會被返回給呼叫函式。它就是用來描述引數是怎麼傳遞和由誰平衡堆疊的。

__cdecl

引數是從右向左傳遞的,引數個數固定,由函式本身清理堆疊。

__thiscall

引數也是從右向左傳遞的,引數個數不定,由呼叫者清理堆疊。

相關推薦

函式一個隱含引數--this指標

為什麼會有this指標呢? 我們需要來看一段程式碼感受一下。 #include <iostream> using namespace std; class Student { public: void InitStudent(char

和物件 , 四個預設成員函式及運算子過載 , 隱含this指標

C++入門知識(2): 1:類和物件: 類(class): 類的定義:類(class)實際上是一種高度抽象化的東西,百度上對類的定義是:類的實質是一種資料型別,類似於int、char等基本型別,不同的是它是一種複雜的資料型別。因為它的本質是型別,而

為何在一個定義了帶引數的構造方法的時候,需要把無參構造方法定義一下

class TestA{    public TestA(String s)    {        System.out.println("A");        System.out.println(s);    }}class TestB extends TestA{ 

工廠模式:封裝物件的建立(一、在基定義一個靜態成員函式

當我們發現需要新增新的型別到一個系統中時,最明智的首要步驟就是用多型機制為這些新型別建立一個共同的介面。 用這種方法可以將系統中多餘的程式碼與新新增的特定型別的程式碼分開。新型別的新增並不會攪亂已存在的程式碼...或者至少看上去如此。 起初它似乎只需要在繼承新類的地方修改程

在工具封裝一個獲取路徑的方法,用於獲取jsp頁面的請求路徑及相關引數

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@taglib prefix="c" uri="http://java.sun.com/

class封裝回調函式 顯式傳遞this指標

本文是用來湊數而已。因為本人實在討厭某個數字,巧的是,本人在CSDN部落格上發表的文章數量正好是某個數字,於是加一篇。 1.最簡單的就是CreateThread #if !defined(AFX_TTHREAD_H__7222F1CA_7289_41A3_98A3_431

資料結構與演算法----自定義函式與資料成員

近期在梳理知識,做一個小結,希望自己能多多使用 在標頭檔案中: enum sign {plus, minus}; class Accruency { public: Accruency(sign s = plus, unsigned long d = 0, unsigned in

java異常練習題:定義一個MulException繼承Exception,要求兩數相乘等於100報錯,在主定義一個方法,在方法丟擲此異常,在主方法觀察結果

題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。  定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義

Qt如何將訊息在2個沒有關係的一個傳送到另一個

條件: ①2個類直接沒有任何關係; ②接收訊息的類必須有一個全域性變數; ③ QMetaObject::invokeMethod((QObject*)全域性變數類, "接收的方法", Qt::AutoConnection, Q_ARG(接收的引數型別, 接收的引數)); cla

1).定義一個MulException繼承Exception,要求兩數相乘等於100報錯,在主定義一個方法,在方法丟擲此異常,在主方法觀察結果。

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟

向controller傳一個一個list,400,415,500

報錯有可能是json格式不對,controller沒有@RequestBody,ajax沒有 contentType: 'application/json;charset=UTF-8', data: JSON.stringify(datas),//data沒有JSON.stringify()

python函式互相呼叫記得帶self

import time from selenium import webdriver import pymysql import uuid class  main (object):    

Python函式定義及引數例項

1.函式定義 函式就是完成特定功能的一個語句組,這組語句可以作為一個單位使用,並且給它取一個名字 ,可以通過函式名在程式的不同地方多次執行(這通常叫函式呼叫) 預定義函式(可以直接使用) 自定義函式(自己編寫) 為什麼使用函式? 降低程式設計難度,通常將

在同一個一個方法呼叫另外一個有註解(比如@Async,@Transational)的方法,註解失效的原因和解決方法

在同一個類中,一個方法呼叫另外一個有註解(比如@Async,@Transational)的方法,註解是不會生效的。 比如,下面程式碼例子中,有兩方法,一個有@Transational註解,一個沒有。如果呼叫了有註解的addPerson()方法,會啟動一個Transaction;如果呼叫updatePerso

[C]C語言函式實現返回引數二進位制 1 的個數

通過C語言程式將十進位制數轉化成二進位制數,然後求出二進位制數中1的個數。 下面用三種方法來實現。來 方法一: 除2取餘法。對一十進位制數,用2輾轉相除至結果為1,將餘數和最後的1從下向上倒序寫就是對應的二進位制。 例如:十進位制數302轉化成二進位制。 302

avaJFrame函式addWindowListener(new WindowAdapter)

在java編寫的過程中常常遇到樣的一段程式碼 frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) {

靜態工具使用註解注入service 空指標

今天在專案中有一個需求,就是在靜態工具類中注入service進行操作,在網上查找了一下,但是一直報空指標異常java.lang.NullPointerException!最後解決了此問題,和大家分

函式作為回撥函式發現的問題

最近在做一個專案用到圓剛的視訊採集卡,需要對其sdk進行二次開發,拿到幀進行處理。 按照要求,回撥函式是靜態函式,自己定義了回撥函式,然後把demo的程式碼粘過來,編譯,報錯!!顯示靜態函式不能非法引用變數。 無奈,諮詢技術,說”靜態函式只能呼叫靜態變數,而且想要在靜態函式

獲取java所有方法及其引數

private void getReflectAllMethod( Class <?> mLocalClass){ Class<?> c; c = mLocalClass; try { do{ Met

C#通過反射獲取的方法和引數個數,反射呼叫方法帶引數

using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args)