this指针时一个隐含于每一个类的成员函数中的特殊指针(包括构造函数和析构函数),它用于指向正在被成员函数操作的对象。

this指针明确地指出了成员函数当前所操作的数据所属的对象。实际过程是,当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。

this是一个指针变量,因此在成员函数中,可以使用*this来标识正在调用该函数的对象。

1、指向类的非静态成员的指针

指向对象成员的指针使用前也要先声明,再赋值,然后引用。注意,通过指向成员的指针也只能访问到共有成员。声明指针的语句形式为:

类型说明符 类名:: *指针名;//声明指向公有数据成员的指针

类型说明符 (类名::*指针名)(参数表);//声明指向公有函数成员的指针

声明了指向成员的指针之后,需要对其进行赋值,也就是要确定指向类的哪一个成员。对数据成员指针赋值的一般语法形式为:

指针名=&类名::数据成员名;

类的定义只确定了各个数据成员的类型、所占内存大小以及他们的相对位置,在定义时并不为数据成员分配具体的地址。因此上述赋值之后,只是说明了被赋值的指针时专门用于指向哪个数据成员的,同时在指针中存放该数据成员在类中的相对位置,当然通过这样的指针现在并不能访问什么。

由于类是通过对象而实例化的,在声明类的对象时才会为具体的对象分配内存空间,这时只要将对象在内存中的起始地址与成员指针中存放的相对偏移结合起来就可以访问到对象的数据成员了。访问数据成员时,这种结合可通过以下两种语法形式实现:

对象名. *类成员指针名

或对象指针名->*类成员指针名

成员函数指针在声明之后要用以下形式的语句对其赋值:

指针名=&类名::函数成员名;

c++标准规定不能将非静态成员函数名直接赋值给成员指针,必须要进行“&”运算。

类的成员函数虽然并不在每个对象中复制一个份拷贝,但是语法规定必须要通过对象来调用非静态成员函数,因此经过上述对成员函数指针赋值以后,还不能用指针直接调用成员函数,而是需要首先声明类的对象,然后用以下形式的语句利用指责你调用成员函数:

(对象名.*类成员指针名)(参数表)

或:(对象指针名->*类成员指针名)(参数表)

注意:成员函数指针的声明、赋值和使用过程中的返回值类型、函数参数表一定要互相匹配。

如,

int main()

{

  Point A(4,5);//声明对象A

  Point *p1=&A;//声明对象指针并初始化

  int (Point::*p_GetX)()=&Point::GetX;//声明成员函数指针并初始化

  cout<<(A.*p_GetX)()<<endl;//使用成员函数指针访问成员函数

  cout<<(p1->GetX)()<<endl;//使用对象指针访问成员函数

  cout<<A.GetX()<<endl;//使用对象名访问成员函数

}

注意分析对象指针及成员指针的不同用法。

2、指向类的静态成员的指针

它不依赖于对象的,因此可以用普通的指针来指向和访问静态成员。

#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx=0,int yy=0){X=xx;Y=yy;countP++;}//构造函数
Point(Point &p);
int GetX(){return X;}
int GetY(){return Y;}
static int countP;//静态数据成员引用型说明
private:
int X,Y;
};
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
countP++;
}
int Point::countP=0;//静态数据成员定义性说明
int main()
{
int *count=&Point::countP;//声明一个int型指针,指向类的静态成员
Point A(4,5);
cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
cout<<"Object id="<<*count<<endl;//直接通过指针访问静态数据成员
Point B(A);
cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
cout<<"Object id="<<*count<<endl;//直接通过指针访问静态数据成员
getchar();
}

4-数组、指针与字符串1.3-this指针的更多相关文章

  1. 字符数组,字符指针,字符串常量,以及sizeof的一些总结

    1.以字符串形式出现的,编译器都会为该字符串自动添加一个\0作为结尾 如在代码中写"abc",编译器帮你存储的是"abc\0". 2.数组的类型是由该数组所存放 ...

  2. C语言中的数组和指针以及字符串

    数组名同时也是该数组首元素的地址,而指针提供了一种用来使用地址的符号方法,因此指针能够很有效地处理数组. 将一个整数加给指针,这个整数会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上 da ...

  3. C++ 字符串指针与字符串数组

    在做面试100题中第21题时,发现char *astr="abcdefghijk\0";和char astr[]={"abcdefghijk"};有点区别,以前 ...

  4. char型指针和字符串字面量和字符数组

    1.当一个char型指针指向一个字符串字面量(也就是常量字符串)时,该指针必须由const修饰,否则,系统会给出deprecated(不赞成)的警告.原因是:字符串字面量不可改变,当它被一个非cons ...

  5. 数组/指针/const/字符串常量的使用传值问题

    #include<stdio.h> #include<string.h> int main() { ] = "abcd"; //常指针a指向字符串常量&qu ...

  6. DELPHI数组,指针,字符串转换的例子

    关于数组,指针,字符串转换的例子 var   aa:   array [0..5] of Char;   bb:Pointer;   cc:string;   dd:PChar; procedure ...

  7. C语言 字符串指针和字符串数组使用区别

    字符串指针和字符串数组使用区别 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 ...

  8. C指针复制字符串从一个数组到另一个数组

    #include <stdio.h> void  copyString (char  *to, char  *from) {      while ( *from ) // from指针遇 ...

  9. Linux C 程序 指针和字符串函数(11)

    指向字符串的指针 C语言访问字符串很多方法:1.用字符数组存放一个字符串 char string[] = "Linux C"; printf("%s\n".st ...

  10. 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

    这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...

随机推荐

  1. COGS1817. [WC2013]糖果公园

    1817. [WC2013]糖果公园 ★★★☆   输入文件:park.in   输出文件:park.out   简单对比时间限制:8 s   内存限制:512 MB [题目描述] Candyland ...

  2. 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈

    [BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道.  我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...

  3. 九度OJ 1046:求最大值 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9861 解决:4013 题目描述: 输入10个数,要求输出其中的最大值. 输入: 测试数据有多组,每组10个数. 输出: 对于每组输入,请输 ...

  4. 关于wx.redirectTo、wx.navigateTo失效问题

    问题:在app.json页面中若配置了tabBar,并且要跳转的目标页面也在tabBar中时,那么常用的几种页面跳转方式便失效了.即不能跳转到tabBar中定义的页面. 解决办法:若要跳转至tabBa ...

  5. springMvc 4.0 jackson包改变

    使用之前的json包出包java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException错误. sp ...

  6. JavaScript原理学习

    悟透JavaScript(理解JS面向对象的好文章) http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html Javascript ...

  7. MySQL修改配置 区分大小写

    在使用mysql的时候,数据库名,表名,字段名等有大小写的区分,这个可以通过配置文件设置.如果设置了严格区分大小写,在访问表的时候没有注意到表名的大小写,将会报出表不存在的错误.下面是修改配置文件: ...

  8. Contiki-Timer 概述

    Contiki有一个clock模块和一系列timer模块:timer,stimer,ctimer,etimer,和rtimer. 一.clock模块 clock模块提供一些处理系统时间的函数,还有一些 ...

  9. mooc_java 集合框架上 学生所选课程

    用一个集合Set存放学生所选课程接口不能实例化,所以用其实现类进行实例化 set接口不能实例化,通过HashSet这个实现类来进行实例化,需要导入包this.courses=new HashSet() ...

  10. iOS开发数据库-FMDB

    前言 FMDB是以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了多线程安全的数据库操 ...