深入探秘C++对象模型中的this指针

目录

一、C++ 对象模型初相识

二、this 指针的神秘面纱

2.1 this 指针的定义与本质

2.2 this 指针的用途展现

三、空指针遭遇 this 指针

四、const 与 this 指针的奇妙反应

4.1 常函数中的 this 指针

4.2 常对象与 this 指针

五、实际编程中 this 指针的陷阱与应对

5.1 静态成员函数中的 this 指针陷阱

5.2 构造函数初始化列表中的 this 指针陷阱

5.3 对象未完全构造前使用 this 指针陷阱

六、总结回顾


一、C++ 对象模型初相识

        在深入探讨this指针之前,我们先来了解一下 C++ 对象模型的基础。在 C++ 中,类的成员变量和成员函数是分开存储的。这意味着,当我们创建一个类的对象时,对象中只包含成员变量,而成员函数则存储在代码段中,所有该类的对象共享这些成员函数。这样的设计大大提高了内存的使用效率,避免了每个对象都重复存储相同的函数代码。

        例如,我们定义一个简单的类Point:

class Point {

public:

int x;

int y;

void setPoint(int a, int b) {

x = a;

y = b;

}

};

        当我们创建Point类的对象时,每个对象只会占用x和y两个成员变量所需的内存空间,而setPoint函数则存储在代码段中,被所有Point对象共享。

        有趣的是,即使是一个空类,在 C++ 中也会占用 1 字节的空间。这是因为编译器需要为每个对象分配独一无二的内存地址,以便区分不同的对象。例如:

class EmptyClass {};

        使用sizeof(EmptyClass),你会发现它的大小为 1。这 1 字节就像是对象在内存中的 “身份证”,虽然空类没有实际的数据成员,但它依然需要在内存中占据一席之地 。

二、this 指针的神秘面纱

2.1 this 指针的定义与本质

        在 C++ 中,this指针是一个非常重要且神秘的存在。简单来说,this指针指向被调用的成员函数所属的对象 。它是隐含在每一个非静态成员函数内的一种指针,不需要我们显式地定义,就可以直接在非静态成员函数中使用。

        从本质上讲,this指针是一个指针常量,其定义形式类似于const Type* const this,这意味着它的指向是不可修改的,始终指向调用该成员函数的对象。例如,对于一个Student类:

class Student {

public:

int id;

string name;

void setInfo(int id, string name) {

this->id = id;

this->name = name;

}

};

        当我们创建Student类的对象并调用setInfo函数时,this指针就会指向这个对象。比如:

Student tom;

tom.setInfo(1, "Tom");

        在setInfo函数执行过程中,this指针指向tom对象,这样函数就能准确地修改tom对象的id和name成员变量 。

2.2 this 指针的用途展现

解决命名冲突:当形参和成员变量同名时,this指针可以用来区分它们。比如在上面的Student类的setInfo函数中,如果我们不使用this指针,直接写id = id;和name = name;,编译器会认为我们是在对形参进行赋值,而不是对成员变量赋值。使用this指针,就可以明确地告诉编译器我们操作的是成员变量。

返回对象本身:在类的非静态成员函数中,我们可以使用return *this来返回对象本身。这一特性在实现链式编程时非常有用。例如,我们为Student类添加一个study函数,用于增加学生的学习时长,并返回对象本身:

class Student {

public:

int id;

string name;

int studyHours;

void setInfo(int id, string name) {

this->id = id;

this->name = name;

this->studyHours = 0;

}

Student& study(int hours) {

this->studyHours += hours;

return *this;

}

};

现在我们就可以进行链式调用了:

Student tom;

tom.setInfo(1, "Tom").study(2).study(3);

cout << "Tom's study hours: " << tom.studyHours << endl;

        这样的代码更加

你可能感兴趣的:(C++开发,开发语言,c++,面试)