您的位置:首页 > 编程语言 > C语言/C++

C++中this指针的使用

2016-04-23 20:59 507 查看
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 <iostream>

// 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
GitHubhttps://github.com/fengbingchun/Messy_Test
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: