【C++】03.this指针、友元、运算符重载

【嵌入式八股】一、语言篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM

【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym

【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM

【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0

对象模型和this指针

54.什么是this指针

指向当前对象的地址。当一个成员函数被调用时,编译器会隐式地传递一个指向调用该函数的对象的指针,这个指针就是 this 指针。

this 指针通常用于在类的成员函数中访问当前对象的成员变量和成员函数,以及返回当前对象的引用。使用 this 指针可以避免与成员变量或成员函数的参数名字相同的混淆,也可以方便地进行链式调用。

例如,下面是一个简单的 C++ 类,其中 this 指针被用于访问成员变量和成员函数:

class MyClass {
public:
  MyClass(int x) : x_(x) {}

  void setX(int x) { this->x_ = x; }
  int getX() const { return this->x_; }

private:
  int x_;
};

在上面的代码中,setX() 和 getX() 成员函数都使用 this 指针来访问 x_ 成员变量。在这个类的对象上调用 setX() 和 getX() 函数时,this 指针会自动传递,并指向调用该函数的对象的地址。

在成员函数中,this 指针通常是隐式地传递给函数的,无需手动传递。即使在成员函数中没有使用 this 指针,编译器也会在编译时自动地将 this 指针添加到成员函数中,以便在需要时访问成员变量或者调用其他成员函数。

  • this指针是类的指针,指向对象的首地址。
  • this指针只能在成员函数中使用,在全局函数、静态成员函数中都不能用this。
  • this指针只有在成员函数中才有定义,且存储位置会因编译器不同有不同存储位置。
55.this指针的作用

this指针的使用

this 指针主要用于在类的成员函数中访问当前对象的成员变量和成员函数,以及返回当前对象的引用。以下是几个使用 this 指针的示例:

  1. 访问成员变量:使用 this 指针可以方便地访问当前对象的成员变量。例如:
class MyClass {
public:
  void setX(int x) { this->x_ = x; }
  int getX() const { return this->x_; }

private:
  int x_;
};

在上面的代码中,setX() 和 getX() 成员函数都使用 this 指针来访问 x_ 成员变量。

  1. 访问成员函数:使用 this 指针可以方便地调用当前对象的其他成员函数。例如:
class MyClass {
public:
  void foo() {
    // 调用成员函数 bar()
    this->bar();
  }
  void bar() { /* ... */ }
};

在上面的代码中,foo() 成员函数中调用了 bar() 成员函数,使用 this 指针来调用当前对象的其他成员函数。

  1. 返回当前对象的引用:使用 this 指针可以方便地返回当前对象的引用,这在链式调用中非常有用。例如:
class MyClass {
public:
  MyClass& setX(int x) {
    this->x_ = x;
    return *this;
  }

private:
  int x_;
};

在上面的代码中,setX() 成员函数返回当前对象的引用,这样就可以实现链式调用。

  1. 区分同名的局部变量和成员变量:如果在成员函数中存在一个局部变量和一个同名的成员变量,可以使用 this 指针来访问成员变量,以避免混淆。例如:
class MyClass {
public:
  void setX(int x) {
    // 使用 this 指针来访问成员变量 x_
    this->x_ = x;
    int x = 0; // 局部变量 x
  }

private:
  int x_;
};

在上面的代码中,使用 this 指针来访问成员变量 x_,以避免与局部变量 x 混淆。

56.类的this指针特点
  1. 每个对象都有一个独立的 this 指针。在类的成员函数中,this 指针指向调用该函数的对象。
  2. this 指针是一个常量指针,指向当前对象,因此不能修改 this 指针所指向的地址。
  3. this 指针的类型是类的指针类型,因此可以通过 this 指针访问当前对象的成员变量和成员函数,以及返回当前对象的引用。
  4. 当一个成员函数被调用时,编译器会自动将调用该函数的对象的地址作为 this 指针传递给函数。因此,在成员函数中可以省略 this 指针的显式使用,直接访问成员变量和成员函数即可。
  5. 在 C++ 中,this 指针不是关键字,而是一个预定义的标识符,因此可以在类的成员函数中使用 this 来表示当前对象的指针。
57.this指针是什么时候创建的?

this指针是一个指向调用成员函数的对象的指针,它在每次调用非静态成员函数时被创建

具体来说,当一个对象的成员函数被调用时,编译器会将该对象的地址作为一个参数传递给函数,并将该参数存储在this指针中。在函数内部,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。

this指针在成员函数执行结束后清除。

58.this指针存放在何处?堆、栈、全局变量,还是其他?

存放在对象的栈空间中

当一个成员函数被调用时,编译器会隐式地传递一个指向当前对象的this指针作为函数的第一个参数。这个指针的值是在函数调用之前由编译器计算出来的。

因为this指针是在对象的栈空间中,所以每个对象都有自己的this指针。在函数执行过程中,可以使用this指针来访问对象的成员变量和成员函数。This指针首先入栈,然后成员函数的参数从右向左进行入栈,最后函数返回地址入栈。

59.每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?

普通的类函数(不论是成员函数,还是静态函数)都不会创建一个函数表来保存函数指针。只有虚函数才会被放到函数表中。但是,即使是虚函数,如果编译期就能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数。正是由于this指针的存在,用来指向不同的对象,从而确保不同对象之间调用相同的函数可以互不干扰。

友元

60.什么是友元?

友元是一种机制,允许一个类将。一个类可以将其他类或函数声明为其友元,从而允许它们访问该类的私有成员。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

【嵌入式八股】一、语言篇 文章被收录于专栏

查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇【本专栏】 2.计算机基础 3.硬件篇 4.嵌入式Linux (建议PC端查看)

全部评论

相关推荐

尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务