this是C++中的一个关键字,也是一个const指针,它指向当前对象地址(换句话说,其值为&object),通过它可以访问当前对象的所有成员。

我们知道类class是对象object的模板,所以在创建对象之前需要先定义类,类的定义包含属性(变量)和方法的定义。
类定义好后我们就可以通过类来创建多个实例对象,每个对象都有各自的实例属性(实例变量),但是非内联成员函数(non-inline member function)只会诞生一份函数实例(换句话说每个对象需要共用同一个方法来操作实例属性)。在有多个实例对象访问同一个函数时,函数如何知道该操作哪个对象的属性?此时就需要this指针。
编译器会隐式地传递this指针,this指针如同一个句柄,此时方法将根据句柄来确定需要操作哪个对象的属性。调用静态方法时,则不会隐式地传递this指针,因为静态函数不与类实例对象相关联,即不属于某个对象拥有而由所有实例对象共享。
现在我们通过结合程序来说明并理解上一节所描述的原理,这里我们定义了类Hello,其中包含三个实例属性,以及一个使用属性的方法setValue,以Hello为模板创建了三个对象object1, object2, object3。
#includeusing std::cout;
class Hello {public:
int a;
int b;
int c;
Hello(int _a, int _b, int _c) {a = _a;
b = _b;
c = _c;
}
void setValue(int _a, int _b, int _c) {a = _a;
b = _b;
c = _c;
}
int getSum() {return (a + b + c);
}
};
int main()
{Hello object1(10, 20, 30);
Hello object2(20, 20, 10);
Hello object3(10, 10, 10);
cout<< "Hello";
return 0;
} 将类Hello实例化时会根据类中定义的属性来创建每个对象各自的属性,确保各自数据完整性object1::(a, b, c),object2::(a, b, c),object3::(a, b, c)这一步就是将属性存放至每个对象各自的内存空间下。但是方法setValue则不会根据对象来创建多个,意味着object1,object2,object3需要共用同一个方法setValue来修改他们的实例属性。
为了保证方法setValue能够修改对象对应的属性,编译器隐式的向方法内传递this指针,this指针指向的是当前对象的地址(注意this是指针类型,在 C/C++ 中要用->运算符来访问成员)。
#includeusing std::cout;
class Hello {public:
int a;
int b;
int c;
Hello(int _a, int _b, int _c) {this->a = _a;
this->b = _b;
this->c = _c;
}
void setValue(int _a, int _b, int _c) {this->a = _a;
this->b = _b;
this->c = _c;
}
int getSum() {return (this->a + this->b + this->c);
}
};
int main()
{Hello object1(10, 20, 30);
Hello object2(20, 20, 10);
Hello object3(10, 10, 10);
cout<< "Hello";
return 0;
} 当object1访问setValue时this表示(Hello *)&object1,当object2访问setValue时this表示(Hello *)&object2,当object3访问setValue时this表示(Hello *)&object3,如下程序所示(注意:下面程序不能运行,只是用于说明this指针的本质原理)。
#includeusing std::cout;
class Hello {public:
int a;
int b;
int c;
Hello(int _a, int _b, int _c) {((Hello*)&object1)->a = _a;
((Hello*)&object1)->b = _b;
((Hello*)&object1)->c = _c;
}
void setValue(int _a, int _b, int _c) {((Hello*)&object1)->a = _a;
((Hello*)&object1)->b = _b;
((Hello*)&object1)->c = _c;
}
int getSum() {return (((Hello*)&object1)->a + ((Hello*)&object1)->b + ((Hello*)&object1)->c);
}
};
int main()
{Hello object1(10, 20, 30);
Hello object2(20, 20, 10);
Hello object3(10, 10, 10);
cout<< "Hello";
return 0;
} 3. this 使用场景在一个对象的某个成员函数中需要返回对象本身时可以return *this;来将对象返回。
class Hello {public:
int a;
int b;
int c;
Hello & getObject() {return *this;
}
};当对象的实例属性与对象成员函数形参或局部变量相同时,如果需要访问或给对象的实例属性复制则需要使用this指针进行访问this->a = a,否则a = a访问的将是成员函数的形参或局部变量。
class Hello {public:
int a;
int b;
int c;
Hello(int a, int b, int c) {this->a = a;
this->b = b;
this->c = c;
}
};
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章名称:C++的this指针详解-创新互联
网站链接:http://www.jxjierui.cn/article/cshopj.html


咨询
建站咨询
