• C++ 中的 this 指针


    目录

    1. this 指针的背景简介:

    2. this 指针的语法表示:

    3. this 指针的一些注意点:

    4. this 指针的修饰类型:

    5. this 指针的小结:

    6. this 指针参考资源:


    1. this 指针的背景简介:

      简单点说,this 指针在 C++ 中是一个特殊的指针,指向当前对象的实例并且每一个对象都可以通过 this 指针来访问自己的地址。当然,this 指针是只能在 class, union 或 struct 类型的非静态成员函数中访问的指针。非静态成员函数是没有 this 指针的。还有就是通常来说友元函数没有 this 指针,原因是友元不是类的成员,只有成员函数才有 this 指针。

      我们可以用 this 指针简化我们代码的编写并且可以很方便的调用我们所需的对象。

    2. this 指针的语法表示:

      this 指针的语法表示其实很简单,如下例子:

    this->member

    3. this 指针的一些注意点:

      当对某个对象调用非静态成员函数时,编译器会将该对象的地址作为隐藏的参数传递给函数,即对象的 this 指针实际上不是对象本身的组成部分。假设你用 sizeof 去查看当前的对象,那么 this 指针不会反映在对象的 sizeof 结果中。

    1. date.setTime( 12 );
    2. --> 可以翻译为:
    3. setTime( &date, 12 );

      假设你要使用对象的地址,其中对象的地址还可以从成员函数的内部作为 this 指针提供。this 指针的使用很多时候是隐式的,即可以不用显式的表达出来,通常在引用某个 class 的成员时使用显式的 this 指针是没有必要的。

    1. void date::setTime( uint8_t aTime ) {
    2. // 以下三种表达形式是等同的
    3. time = aTime;
    4. this->time = aTime;
    5. (*this).time = aTime;
    6. }

      有时候我们需要从成员函数中返回当前的对象,可以参考使用 *this,如:

    return *this;

      this 指针还有一个比较不错的属性,即 this 指针可以用于防止自引用:

    1. // 以下代码不会被执行
    2. while ( ¤tObject == this ) {
    3. ......
    4. }

      如果你想要修改 this 指针,比如想对 this 指针进行赋值,那么这是不会被允许的,至少现在的 C++ 版本中是不行的( C++ 早期是实现了这种方法的 )。

    4. this 指针的修饰类型:

      你是可以在函数声明中修改 this 指针类型的,需要使用关键字,例如通过 const 和 volatile。假设需要声明具有某种属性的函数,需要将关键字添加到函数参数列表的后面,例如:

    1. class date {
    2. void setTime() const;
    3. };
    4. // 上述 this 指针被视为指向 const 对象的 const 指针

      成员函数中 this 的类型可以由下面的语法进行相关描述:

    1. [cv-qualifier-list] class-type * const this
    2. // cv-qualifier-list 是由成员函数的声明符确定
    3. // class-type 是当前 class 的名称
    4. // 上面 this 指针是 const 指针且无法重新分配。
    5. // 成员函数声明中使用的 const 或 volatile 限定符适用于由该函数范围中的 this 指针指向的 class 实例
    this 的修饰符
    修饰符                                          语义
    const 无法调用不是 const 的成员函数且无法更改成员数据。
    volatile禁用某些优化且每当访问成员数据时,都会从内存中加载相应数据

    5. this 指针的小结:

      this 指针确实在某些地方可以很大程度减少我们开发项目的负担,但同时使用上稍不注意也会比较容易引入问题,所以在使用的时候需要明确自己的需求和方法,这样才能更好地应用 this 指针。

      构造函数和析构函数不能被声明为 const 或 volatile 类型,但可以在这两种类型的对象上调用。

    6. this 指针参考资源:

     The this pointer - cppreference.com

    千淘万漉虽辛苦,吹尽狂沙始到金。

  • 相关阅读:
    CSS 复杂卡片/导航栏特效运用目录
    相比Superset,DataEase开源工具的部署为什么更简单?
    力扣 -- 518. 零钱兑换 II(完全背包问题)
    JWT原理
    实现深拷贝和浅拷贝
    Linux性能优化--性能工具-系统CPU
    Matlab上机三(Apriori算法)
    vue三个点…运算符时报错 Syntax Error: Unexpected token
    8年软件测试老鸟,写给3-5年测试员的几点建议,满满硬货指导
    【论文笔记16】NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
  • 原文地址:https://blog.csdn.net/GOLOJO/article/details/134010081