Every object in C++ has access to its own address through an important pointer called this pointer. The this pointer is an implicit parameter to all member functions. Therefore, inside a member function, this may be used to refer to the invoking object.
Friend functions do not have a this pointer,because friends are not members of a class. Only member functions have a this pointer.
The this pointer is a pointer accessible only within the nonstatic member functions of a class, struct, or union type. It points to the object for which the member function is called. Static member functions do not have a this pointer.
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象。全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址。
this指针使用场景:(1)、在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;(2)、当参数与成员变量名相同时,如this->n = n(不能写成n = n)。
The this pointer's type can be modified in the function declaration by the const and volatile keywords. To declare a function as having the attributes of one or more of these keywords, add the keyword(s) after the function argument list.
以下是测试代码:
this_pointer.hpp:
#ifndef FBC_MESSY_TEST_THIS_POINTER_HPP
#define FBC_MESSY_TEST_THIS_POINTER_HPP
#include
// reference: http://www.tutorialspoint.com/cplusplus/cpp_this_pointer.htm
class Box
{
public:
// Constructor definition
Box(double l = 2.0, double b = 2.0, double h = 2.0)
{
std::cout << "Constructor called." << std::endl;
length = l;
breadth = b;
height = h;
}
double Volume()
{
return length * breadth * height;
}
int compare(Box box)
{
return this->Volume() > box.Volume();
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
/*void Date::setMonth(int mn)
{
month = mn; // These three statements are equivalent
this->month = mn;
(*this).month = mn;
}*/
// reference: https://msdn.microsoft.com/en-us/library/y0dddwwd.aspx
class Buf
{
public:
Buf(char* szBuffer, size_t sizeOfBuffer);
Buf& operator=(const Buf &);
void Display();
private:
char* buffer;
size_t sizeOfBuffer;
};
// reference: http://en.cppreference.com/w/cpp/language/this
class T
{
int x;
void foo()
{
x = 6; // same as this->x = 6;
this->x = 5; // explicit use of this->
}
void foo() const
{
// x = 7; // Error: *this is constant
}
void foo(int x) // parameter x shadows the member with the same name
{
this->x = x; // unqualified x refers to the parameter
// 'this->' required for disambiguation
}
int y;
T(int x) : x(x), // uses parameter x to initialize member x
y(this->x) // uses member x to initialize member y
{}
T& operator= (const T& b)
{
x = b.x;
return *this; // many overloaded operators return *this
}
};
class Outer {
//int a[sizeof(*this)]; // error: not inside a member function
unsigned int sz = sizeof(*this); // OK: in default member initializer
void f() {
int b[sizeof(*this)]; // OK
struct Inner {
//int c[sizeof(*this)]; // error: not inside a member function of Inner
};
}
}
void test_this_pointer1();
void test_this_pointer2();
#endif // FBC_MESSY_TEST_THIS_POINTER_HPP
this_pointer.cpp:
#include "this_pointer.hpp"
Buf::Buf(char* szBuffer, size_t sizeOfBuffer)
{
sizeOfBuffer++; // account for a NULL terminator
buffer = new char[sizeOfBuffer];
if (buffer)
{
strcpy_s(buffer, sizeOfBuffer, szBuffer);
sizeOfBuffer = sizeOfBuffer;
}
}
Buf& Buf::operator=(const Buf &otherbuf)
{
if (&otherbuf != this) {
if (buffer)
delete[] buffer;
sizeOfBuffer = strlen(otherbuf.buffer) + 1;
buffer = new char[sizeOfBuffer];
strcpy_s(buffer, sizeOfBuffer, otherbuf.buffer);
}
return *this;
}
void Buf::Display()
{
std::cout << buffer << std::endl;
}
void test_this_pointer1()
{
Box Box1(3.3, 1.2, 1.5); // Declare box1
Box Box2(8.5, 6.0, 2.0); // Declare box2
if (Box1.compare(Box2)) {
std::cout << "Box2 is smaller than Box1" << std::endl;
} else {
std::cout << "Box2 is equal to or larger than Box1" << std::endl;
}
}
void test_this_pointer2()
{
Buf myBuf("my buffer", 10);
Buf yourBuf("your buffer", 12);
// Display 'my buffer'
myBuf.Display();
// assignment opperator
myBuf = yourBuf;
// Display 'your buffer'
myBuf.Display();
}
函数test_this_pointer1的测试结果如下图:
函数test_this_pointer2的测试结果如下图:
1. http://www.tutorialspoint.com/cplusplus/cpp_this_pointer.htm
2. https://msdn.microsoft.com/en-us/library/y0dddwwd.aspx
3. http://en.cppreference.com/w/cpp/language/this
GitHub:https://github.com/fengbingchun/Messy_Test