服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ 中的this指针详解及实例

C++ 中的this指针详解及实例

2021-05-23 18:02C++教程网 C/C++

这篇文章主要介绍了C++ 中的this指针详解及实例的相关资料,this指针是类的一个自动生成、自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象。需要的朋友可以参考下

C++ this 指针详解

学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。

正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。

this指针是类的一个自动生成、自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象。

全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Ctest
{
public:
 void Funtest(int iValue)
 {
  _iValue = iValue;
 }
 void Print()
 {
  cout << _iValue << endl;
 }
private:
 int _iValue;//调用私有变量只能用公有成员接收,成员变量在类中具有全局作用域
};
 
int main()
{
 Ctest test;
 test.Funtest(30);
 test.Print();
 system("pause\n");
 return 0;
}

我们来观察对Funtest函数的调用,test.Funtest(),在这里,我们运用了点运算符来访问test对象的Funtest成员,然后调用它。

当我们调用某个成员函数时,实际上是在替某个对象调用它。如果Funtest指向Ctest的成员(例如iValue),则它隐式地指向调用该函数的对象的成员。

成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。当我们调用那个函数时,用请求该函数的对象地址初始化this.例如:如果调用

test.Funtest(),则编译器负责把test的地址传递给Funtest的隐式形参this。可以等价的认为编译器将该调用重写成了如下形式:

?
1
2
//此处只用于说明调用成员函数实际执行过程
Ctest::Funtest(&test)

C++ 中的this指针详解及实例

在成员函数内部,我们可以直接使用调用该函数的成员,而无需通过成员访问运算符来做到,因为this指针所指的正是这个对象。任何对类成员的直接访问都 被看做是this指针的隐式引用,上面的程序可认为是this->iValue.

this形参是隐式定义的,实际上,任何自定义名为this的参数或变量的行为都是非法的.所以,Funtest函数的定义相当于是

?
1
2
3
4
void Funtest(Ctest *const this,int *iVlue)
{
 this->_iValue = iValue;
}

this是一个常量指针,不允许改变this中保存的地址

this指针的两种传参方式:

1.参数压栈:当成员函数的参数可变时,遵循_cdecl调用约定
2.ecx寄存器:当成员函数的参数固定时,这时遵循_thiscall调用约定。

当this指针为NULL时编译器可编译通过

?
1
2
3
4
5
6
7
8
9
10
11
class Ctest
{
 public:
 void Funtest()
{}
}
 int main()
{
 Ctest *p = NULL;
 p->Funtest();
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/chaseraod/article/details/61617777

延伸 · 阅读

精彩推荐
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12