1:对于类的非静态成员,每个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的。那么调用共享的成员函数如何找到自己的数据成员呢?答案是通过类中隐藏的this指针。

2:示例代码:

// 7.6.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class CBook //定义一个CBook类
{
public:
int m_Pages; //定义一个数据成员
void OutputPages() //定义一个成员函数
{
//cout<<m_Pages<<endl; //隐式调用
cout<<this->m_Pages<<endl; //显式调用
}
};
int main(int argc, char* argv[])
{
CBook vbBook,vcBook; //定义两个CBook类对象
vbBook.m_Pages = ; //设置vbBook对象的成员数据
vcBook.m_Pages = ; //设置vcBook对象的成员数据
vbBook.OutputPages(); //调用OutputPages方法输出vbBook对象的数据成员
vcBook.OutputPages(); //调用OutputPages方法输出vcBook对象的数据成员
return ;
}

运行结果:

在OutputPages成员函数中知识访问了m_Pages数据成员,每个对象在调用OutputPages方法时如何区分自己的数据成员呢?在每个类成员函数(非静态成员函数)中都隐含包含一个this指针,指向被调用对象的指针,其类型是当前类类型的指针类型,在const方法中,为当前类类型的const指针类型。当vbBook对象调用OutputPages成员函数时,this指针指向vbBook对象。当vcBook对象调用OutputPages成员函数时,this指针指向vcBook对象。

2:在OutPutPages成员函数中,可以显式地使用this指针访问数据成员。例如:

void OutputPages()

{

cout<<this->m_Pages<<endl;

}

实际上,编译器为了实现this指针,在成员函数中自动添加了this指针对数据成员的方法,类似于上面OutputPages方法。此外,为了使this指针指向当前调用对象,并能够在成员函数中使用,在每个成员函数中都隐式包含了一个this指针作为函数参数,并在函数调用的时候将对象自身的地址隐含作为实际参数传递。例如,以OutPutPages成员函数为例,编译器将其定义为:

void OutputPages(CBook* this)//隐含添加this指针

{

cout<<this->m_Pages<<endl;

}

C++入门经典-例7.6-this指针,同一个类的不同对象数据的更多相关文章

  1. C++入门经典-例6.14-通过指针连接两个字符数组

    1:字符数组是一个一维数组,引用字符数组的指针为字符指针,字符指针就是指向字符型内存空间的指针变量. char *p; char *string="www.mingri.book" ...

  2. C++入门经典-例6.9-通过指针变量获取数组中的元素

    1:通过指针引用数组,需要先声明一个数组,再声明一个指针. int a[10]; int *p; 然后通过&运算符获取数组中元素的地址,再将地址值赋给指针变量. p=&a[0]; 代码 ...

  3. C++入门经典-例5.8-使用指针函数进行运算

    1:函数指针式指向函数内存的指针,一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 一个函数可以返回一个整数型值.字符 ...

  4. C++入门经典-例5.5-空类型指针的使用

    1:代码如下: // 5.5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  5. C++入门经典-例5.2-使用指针比较两个数的大小

    1:代码如下: // 5.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  6. C++入门经典-例6.11-使用指针变量遍历二维数组

    1:代码如下: // 6.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #inc ...

  7. C++入门经典-例9.3-类模板,简单类模板

    1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类 ...

  8. C++入门经典-例7.1-对象之访问类成员

    1:建立一个类CPerson. (1)在person.h文件中代码: class CPerson { public: //数据成员 int m_iIndex; ]; short m_shAge; do ...

  9. C++入门经典-例8.7-多态,利用虚函数实现动态绑定

    1:多态性是面向对象程序设计的一个重要特征,利用多态性可以设计和实现一个易于扩展的系统.在C++语言中,多态是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数,发出同样 ...

随机推荐

  1. JQuery --- 第六期 (Ajax)

    欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti 点击查看Ajax

  2. 记录FTPClient超时处理的相关问题(转)

    https://www.cnblogs.com/dasusu/p/10006899.html 记录 FTPClient 超时处理的相关问题   apache 有个开源库:commons-net,这个开 ...

  3. 【Git的基本操作九】ssh免密登录

    SSH免密登录 1. 进入用户家目录 cd ~ 2. 删除原有的 .ssh 目录 rm -r .ssh 3. 运行命令生成 .ssh 目录 ssh-keygen -t rsa -C github或gi ...

  4. 2 java开发环境的配置步骤

    1  首先需要下载JDK(以java se development kit java标准版开发包) 8.0 如果只是单纯的运行java程序则只需要安装JRE(java runtime envirome ...

  5. jstl中c:foreach下的表格实现异步刷新

    setInterval(function(){ var url = "${ctx}/alarm/alarm/CompanySort";//填你自己的路径 var data = {} ...

  6. vue 入门1 组件管理

    全局 组件.局部组件 // Vue.component('todo-list',{ // template:'<li >item</li>' // }); //全局 // va ...

  7. centos 7 安装 Docker Engine-CentOS 社区版

    获取Docker Engine-CentOS社区: https://docs.docker.com/install/linux/docker-ce/centos/ 1.操作系统要求 1.1 要安装 D ...

  8. arm交叉编译sudo-1.8.6p7

    1.交叉编译 # tar -xvf sudo-1.8.6p7.tar.gz # cd sudo-1.8.6p7/ # mkdir build # ./configure --prefix=/home/ ...

  9. three.js之创建一条直线

    <!DOCTYPE html> <html> <head> <meta charset=utf-8> <title>My first thr ...

  10. Hive权限管理(十)

    Hive权限管理 1.hive授权模型介绍 (1)Storage Based Authorization in the Metastore Server 基于存储的授权 - 可以对Metastore中 ...