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;
}
结果: