28 C++ -this指针

简介: 28 C++ -this指针

1. this指针工作原理

通过上例我们知道,c++的数据和操作也是分开存储,并且每一个非内联成员函数(non-inline member function)只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。

那么问题是:这一块代码是如何区分那个对象调用自己的呢?

c++通过提供特殊的对象指针,this指针,解决上述问题。This指针指向被调用的成员函数所属的对象。

c++规定,this指针是隐含在对象成员函数内的一种指针。当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含指针this,用以保存这个对象的地址,也就是说虽然我们没有写上this指针,编译器在编译的时候也是会加上的。因此this也称为“指向本对象的指针”,this指针并不是对象的一部分,不会影响sizeof(对象)的结果。

this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每一个对象都拥有自己的函数成员。一般情况下,并不写this,而是让系统进行默认设置。

this指针永远指向当前对象。

成员函数通过this指针即可知道操作的是那个对象的数据。This指针是一种隐含指针,它隐含于每个类的非静态成员函数中。This指针无需定义,直接使用即可。

注意:静态成员函数内部没有this指针,静态成员函数不能操作非静态成员变量。

c++编译器对普通成员函数的内部处理

2. this指针的使用

当形参和成员变量同名时,可用this指针来区分。

在类的非静态成员函数中返回对象本身,可使用return *this

class Person{
  public:
    //1. 当形参名和成员变量名一样时,this指针可用来区分
    Person(string name,int age){
      //name = name;
      //age = age; //输出错误
      this->name = name;
      this->age = age;
    }
    //2. 返回对象本身的引用
    //重载赋值操作符
    //其实也是两个参数,其中隐藏了一个this指针
    Person PersonPlusPerson(Person& person){
      string newname = this->name + person.name;
      int newage = this->age + person.age;
      Person newperson(newname, newage);
      return newperson;
    }
    void ShowPerson(){
      cout << "Name:" << name << " Age:" << age << endl;
    }
  public:
    string name;
    int age;
};
//3. 成员函数和全局函数(Perosn对象相加)
Person PersonPlusPerson(Person& p1,Person& p2){
  string newname = p1.name + p2.name;
  int newage = p1.age + p2.age;
  Person newperson(newname,newage);
  return newperson;
}
int main(){
  Person person("John",100);
  person.ShowPerson();
  cout << "---------" << endl;
  Person person1("John",20);
  Person person2("001", 10);
  //1.全局函数实现两个对象相加
  Person person3 = PersonPlusPerson(person1, person2);
  person1.ShowPerson();
  person2.ShowPerson();
  person3.ShowPerson();
  //2. 成员函数实现两个对象相加
  Person person4 = person1.PersonPlusPerson(person2);
  person4.ShowPerson();
  system("pause");
  return EXIT_SUCCESS;
}

3. const修饰成员函数

用const修饰的成员函数时,const修饰this指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量,

当成员变量类型符前用mutable修饰时例外。

//const修饰成员函数
class Person{
public:
  Person(){
    this->mAge = 0;
    this->mID = 0;
  }
  //在函数括号后面加上const,修饰成员变量不可修改,除了mutable变量
  void sonmeOperate() const{
    //this->mAge = 200; //mAge不可修改
    this->mID = 10;
  }
  void ShowPerson(){
    cout << "ID:" << mID << " mAge:" << mAge << endl;
  }
private:
  int mAge;
  mutable int mID;
};
int main(){
  Person person;
  person.sonmeOperate();
  person.ShowPerson();
  system("pause");
  return EXIT_SUCCESS;
}

4. const修饰对象(常对象)

常对象只能调用const的成员函数

常对象可访问 const 或非 const 数据成员,不能修改,除非成员用mutable修饰

class Person{
  public:
    Person(){
      this->mAge = 0;
      this->mID = 0;
    }
    void ChangePerson() const{
      mAge = 100;
      mID = 100;
    }
    void ShowPerson(){
          this->mAge = 1000;
      cout << "ID:" << this->mID << " Age:" << this->mAge << endl;
    }
  public:
    int mAge;
    mutable int mID;
};
void test(){  
  const Person person;
  //1. 可访问数据成员
  cout << "Age:" << person.mAge << endl;
  //person.mAge = 300; //不可修改
  person.mID = 1001; //但是可以修改mutable修饰的成员变量
  //2. 只能访问const修饰的函数
  //person.ShowPerson();
  person.ChangePerson();
}


目录
相关文章
|
10天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
40 0
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
114 4
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
66 1
|
2月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
51 2
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
57 3
|
2月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值