了解类的组成
本文最后更新于326 天前,其中的信息可能已经过时,如有错误请联系作者

了解类的组成

this指针

在C++中,类的非静态成员变量是每个对象都有自己的一份副本,而成员函数是所有对象共享的。这意味着,无论你创建了多少个类的实例,成员函数的代码只存在一份,保存在内存的只读代码段中。

当通过一个对象调用成员函数时,该对象的地址(即this指针)会被隐式地传递给函数,这样函数就能知道应该操作哪个对象的数据,而无需使用成员访问运算符来实现这一点。成员函数通过this指针访问对象的成员变量,从而实现对不同对象数据的操作。

这种设计使得C++中的类实例化更加高效,因为不需要为每个对象复制函数代码,只需要为每个对象分配成员变量的空间。这也是为什么在C++中,即使一个类有很多对象,其成员函数的内存占用也是固定的,不会随着对象数量的增加而增加。

  1. this指针的可用性:this指针只能在类的成员函数内部使用,它用于指向调用该成员函数的对象。全局函数和静态成员函数没有this指针,因为静态成员函数属于类而不属于类的任何对象,全局函数则完全独立于类。
  2. this指针的生命周期:this指针在成员函数被调用时自动创建,在函数执行结束后自动销毁。它的生命周期与函数的执行周期相同,类似于函数的参数。
  3. this指针的存储位置:this指针的存储位置取决于编译器实现。在一些编译器中,它可能存储在栈上,在其他编译器中,可能存储在寄存器中(如ECX),或者以其他方式实现。通常,编译器会优化this指针的使用,以提高访问效率和减少开销。
  4. this指针的比喻:this指针可以被比喻为进入一个房子后,你可以看到房间内的物品(成员变量和成员函数),但是看不到房子本身。this指针就是指向这个“房子”(对象本身)的指针,它使得成员函数能够操作当前对象的数据。

This指针不占用类和对象的空间,vs编译器下this指针存放在ecx寄存器中,其实就是将变量的地址在调用成员函数时赋给ecx,再在函数里取出赋给this,这个可以打开反汇编看见。

  1. 编译器通过this指针加上偏移量访问类对象成员,偏移值可直接对类成员取地址得到,偏移值就是变量在该类中存放的位置。
  2. 类有多个对象时,函数却是公共的,对象调用函数时,编译器会将this指针作为参数传过去,用来区分是哪个对象调用的函数。

还有一个补充呢,this指针可能造成错误的delete,因为在子类对象指针指向父类时(也就是说向下转换),往往会将其this指针根据偏移量指向父类,也就是说可能会造成地址的改变。举个例子,当子类继承base1,base2时,且两个类都有类成员变量,如果base1* = new子类,再将这个指针转为base2接受,那么这个指针将直接通过偏移量获取子类空间中base2 this指针的地址。此时解释了一个现象的原因,明明是子类的对象,在无cast的情况下却只能调用基类的函数和对象。而且呢,如果delete base2指针,会直接崩溃。

(这一部分先存疑,代码验证没有发生崩溃)

评论

  1. shenmiren
    Windows Chrome
    11 月前
    2024-6-16 22:11:21

    我已经喷不动了

    来自天津
    • Avatar photo
      R1ckYan
      博主
      shenmiren
      Windows Chrome
      11 月前
      2024-6-16 22:12:54

      旭哥别喷了,和我玩守望先锋吧

      来自海南

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇