C++学习笔记(四)

        指针是指向一些内存地址的变量,既可以是数据的地址也可以是函数的地址。所以,可以在运行时改变指针指向的内容。C++的成员指针(pointer-to-member)遵从同样的概念,除了所选择的内容是在类中之内的成员指针。这里麻烦的是所有的指针需要地址,但在类内部是没有地址的;选择一个类的成员意味着在类中偏移。只有把这个偏移和具体对象的开始地址结合,才能得到实际地址。成员指针的语法要求选择一个对象的同时间接引用成员指针。

         为了理解这个语法,先考虑一个简单的结构:如果有一个这样结构的指针sp和对象so,可以通过下面方法选择成员:

//  SimpleStructure.cpp
struct  Simple  int a; } ;
int  main()  {
    Simple so, 
*sp = &so;
    sp
->a;
    so.a;
}
        现在,假设有一个普通的指向integer的指针ip。为了取得ip指向的内容,用一个*号间接引用这个指针。
* ip =   4 ;
        最后,考虑如果有一个指向一个类对象成员的指针,如果假设它代表对象内一定的偏移,将会发生什么?为了取得指针指向的内容,必须用*号间接引用。但是,它只是一个对象内的偏移,所以必须也要指定哪个对象。因此,*号要和间接引用的对象结合。所以,对于指向一个对象的指针,新的语法变为->*,对于一个对象或引用,则为.*,如下所示。
objectPointer ->* pointerToMember  =   47 ;
object . * pointerToMember  =   47 ;
         现在,让我们看看定义pointerToMember的语法是什么?其实它像任何一个指针,必须说出它指向什么类型。并且,在定义中也要使用一个‘*’号。唯一的区别只是它必须说出这个成员指针使用什么类的对象。当然,这是用类名和作用域运算符实现的。因此,可表示如下:
int  ObjectClass:: * pointerToMember;
        定义一个名字为pointerToMember的成员指针,该指针可以指向在ObjectClass类中的任一int类型的成员。还可以在定义的时候初始化这个这个成员指针。
int  ObjectClass:: * pointerToMember  =   & ObjectClass::a;

        因为仅仅提高了一个类而非那个类的对象,所以没有ObjectClass::a的确切“地址”。因为,&ObjectClass::a仅是作为成员指针的语法被使用。

       下面例子说明了如何建立和使用指向数据成员的指针:

//  PointerToMemberData.cpp
#include  < iostream >
using   namespace  std;

class  Data  {
public:
    
int a, b, c;
    
void print() const {
    cout 
<< "a = " << a << ", b = " << b
         
<< ", c = " << c << endl;
    }

}
;

int  main()  {
    Data d, 
*dp = &d;
    
int Data::*pmInt = &Data::a;
    dp
->*pmInt = 47;
    pmInt 
= &Data::c;
    dp
->*pmInt = 49;
    dp
->print();
}
        运行结果:
=   47 , b  =  xxxx(随机值), c  =   49
        显然,除了对于一些特例(即需要精确地指向的),这里就显得有些过于难用而无法随处使用。
        另外,成员指针是受限制的,它们仅能被指定给在类中的确定的位置。例如,我们不能像使用普通指针那样增加或比较成员
指针。
        以上摘至《C++编程思想》第一卷。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值