C++ 学习14(23.10.27)(this,栈的作用域)

104 阅读4分钟

1 this 关键字

1.1 this

在C++中,this是一个指向当前对象的指针,它可以在类的成员函数中使用。它用于引用当前正在调用该成员函数的对象。当我们在类的成员函数中使用this关键字时,它实际上是一个指向当前对象的常量指针。这意味着我们不能修改this指针所指向的对象,但可以通过this指针来访问对象的成员变量和成员函数。

this 的几个作用:

1:区分同名的成员变量和局部变量:当类的成员变量和成员函数的参数名与局部变量名相同时,可以使用this关键字来明确指示要操作的是类的成员变量。例如,this->memberVariable表示当前对象的成员变量。 

2: 在类的成员函数中返回对象本身:有时候我们需要在类的成员函数中返回对象本身,以便支持链式调用。通过返回*this,即返回this指针所指向的对象,可以实现这个功能。 

3: 在类的成员函数中传递当前对象:有时候我们需要将当前对象作为参数传递给其他函数,可以使用this指针来传递当前对象。

#include <iostream>

class MyClass {
private:
    int value;
public:
    void setValue(int value) {
        this->value = value; // 使用this指针访问成员变量
        std::cout << "setValue" << this->value <<std::endl;
    }

    int getValue() const {
        return value;
    }

    MyClass& add(int num) {
        value += num;
        std::cout << "add" << this->value << std::endl;
        return *this; // 返回对象本身,支持链式调用
    }
};

int main() {
    MyClass obj;
    obj.setValue(10);
    obj.add(5).add(3); // 链式调用
    int result = obj.getValue(); // 获取最终的值
    std::cout << "result:" << result <<std::endl;
    return 0;
}

为什么要加&

MyClass& add(int num) {
        value += num;
        std::cout << "add" << this->value << std::endl;
        return *this; // 返回对象本身,支持链式调用

在MyClass& add(int num)函数中,返回类型为MyClass&表示该函数返回一个对MyClass对象的引用。这样做的目的是支持链式调用。 当函数返回一个对象的引用时,可以将该返回值直接用于后续的函数调用,实现链式调用的效果。通过返回对象本身的引用,我们可以在一个语句中连续调用多个成员函数,从而简化代码并提高可读性。 在给定的代码中,add()函数返回的是*this,即当前对象的引用。这意味着我们可以在同一行中连续调用多次add()函数,每次都是在当前对象的基础上进行操作,并返回更新后的对象。

结果:

1.2 const 的作用与可能出现的位置

在C++中,const关键字可以用于修饰变量、函数参数、成员函数和返回值等多种情况。下面是const可能出现的位置及其作用的举例:

1:修饰变量 const关键字可以用于修饰普通变量,表示该变量的值不能被修改。例如: 

 const int MAX_NUM = 100; // 定义一个常量,值为100,不能被修改

2:修饰函数参数 const关键字还可以用于修饰函数参数,表示该参数是只读的,函数内部不能修改它的值。例如: 

void print(const int& num) { 
    std::cout << num << std::endl; 
} 

在上述代码中,num被定义为一个常量引用,表示函数print不能修改它的值。

3:修饰成员函数 const关键字还可以用于修饰类的成员函数,表示该函数不会修改类的成员变量。)const{

class MyClass {
private:
    int value;
public:
    int getValue() const { // 常量成员函数
        return value; // 只读操作,不会修改成员变量
    }
};

4:  修饰返回值 const关键字还可以用于修饰函数返回值,表示返回值是只读的

const int&  getMax(const int& a){}

const int& getMax(const int& a, const int& b) {
    return a > b ? a : b;
}

在上述代码中,getMax函数返回一个常量引用,表示返回值不能被修改。

const关键字在函数声明const int& getMax(const int& a)中的作用是:
1: 表示函数返回的是一个对int类型的常量的引用,即返回的值是只读的,不能被修改。 2: 表示函数的参数a是一个对int类型的常量的引用,即在函数内部不能修改参数a的值。

1.3 this 实例

#include <iostream>
#include <string>

class Entity;//前向声明
void PrintEntity(Entity* e);//函数声明    返回类型 函数名(参数列表);

class Entity
{
public:
   int x,y;//成员变量

   Entity(int x, int y)//构造函数
   {
      this->x = x;
      this->y = y;
   }

   int GetX() const//常量成员函数  创建了一个指向常量Entity对象的指针e,并返回x的值
   {
      //const Entity* e = this;//const作用将this指针转换为指向常量对象的指针,不会在函数体内对成员变量修改

      return x;
   }

   friend std::ostream& operator<<(std::ostream& os, const Entity& entity)
   {
      os << "Entity { x = " << entity.x << ", y = " << entity.y << " }";
      return os;
   }
};
void PrintEntity(Entity* e)//指向Entity对象的指针作为参数
{
   std::cout << "Entity* e   :     " << *e << std::endl;//在标准输出流中打印出该指针的值

}

int main()
{
   Entity entity(5,10);
   int a = entity.GetX();
   PrintEntity(&entity);

   return 0;
}

常量成员函数哪里不需要那句看不懂的废话。

然后就是默认情况下,C++ 编译器不知道如何将自定义的类型的对象输出到输出流中,所以需要在Entity类中定义一个输出运算符的重载函数,以告诉编译器如何打印Entity对象的值。

   friend std::ostream& operator<<(std::ostream& os, const Entity& entity)
   {
      os << "Entity { x = " << entity.x << ", y = " << entity.y << " }";
      return os;
   }

结果: