C++ 必知必会:条款15 成员的指针并非指针

2022-11-14,,,

指向类成员的类成员的指针说是“指针”,其实是不合适的,因为他既不包含地址,其行为也不像指针

常规的指正,包含地址,对其解应用可以得到该指针包含地址所指向的对象

   1:  int a = 12;
   2:  int pi = &a;
   3:  *pi = 0;
   4:  a = *ip;

<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->

但是对于指向类成员的指针不是内存中特定的位置,他指向的是一个类中的特定成员的位置,而不是指向一个特定对象的成员。一般常见的做法是存储一个类成员对象的偏移地址--相对类起始地址的。

   1:  class A
   2:  {
   3:  public:
   4:      // … 
   5:      int a_;
   6:  }
   7:   
   8:  int A:: * pci;
   9:  A   aA;
  10:  A *pcA = &aA;
  11:  pci = &A::a_;
  12:  aA.*pci = 0;
  13:  int b = pcA->*pci

<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->

下面涉及的是指针的转换:(要理解这个概念,只需要记住一条,子类继承自基类,子类包含的东西比基类多)

在C++中,存在指向 派生类的指针到指向其基类的预定的自动转换。 因为子类至少是一个基类。子类包含的东西多,因此,当需要调用基类的时候,我们传输给子类是可以的,这样不会导致调用的失败,(因为子类包含更多的内容)

但是,在C++中,对于指向类成员的指针,恰好存在 指向基类成员的指针可以默认的转换到指向任何子类成员的指针。 ——同样,因为子类至少是一个基类,子类包含更多的东西,因此,当我们需要调用类成员指针的时候,子类中一定包含基类的部分的成员,可以将指向基类成员的指针转换到指向子类成员。但是反过来就不对了,因为指向子类的成员在基类中可能是没有的(子类包含的东西多),所以指向子类的成员的指针转换成指向基类的成员的指针的时候,可能导致基类的成员调用的失败。

对于指向类成员的指针来说,其解引用需需要一个类的对象或者对象指针才能实现,直接解引用是无法完成其功能的!

今天就写到这了,有机会举个例子,详细的说一下……

C++ 必知必会条款15 成员的指针并非指针的相关教程结束。

《C++ 必知必会:条款15 成员的指针并非指针.doc》

下载本文的Word格式文档,以方便收藏与打印。