指向成员函数的指针怎么表示指针的解引用怎么理解

* 定义指向指向成员函数的指针怎麼表示的指针变量的形式 : 指向成员函数的指针怎么表示返回类型 (类名∷*指针变量名)(参数列表)
* 指向成员函数的指针怎么表示指针变量值的形式 : &类名∷指向成员函数的指针怎么表示名;
* 指向成员函数的指针怎么表示指针变量使用形式 : (对象.*指针变量名)(实参);

}

1、与常规指针不同一个指向成員的指针并不指向一个具体的内存位置,它指向的是一个类的特定成员而不是指向特定对象里的特定成员。通常最清晰的做法是将指姠数据成员的指针看作为一个偏移量。

这个偏移量告诉你一个特定成员的位置距离对象的起点有多少个字节。

2、给定一个成员在类内的偏移量为了访问位于那个偏移量的数据成员,我们需要该类的一个对象的地址这时候就需要 .*和->*的操作。pC->*pimC,请求将pC内的地址加上pimC内的偏移量为的是访问pC所指向的C对象中适当的数据成员。aC.*pimC,请求aC的地址加上pimC中的偏离量也是为了访问pC所指向的C对象中适当的数据成员。
Ps:*成员指针解引用操作符(.*)从对象或引用获取成员
*成员指针箭头操作符(->*)通过对象的指针获取成员

3、获取非静态指向成员函数的指针怎么表示的哋址时得到的不是一个地址,而是一个指向指向成员函数的指针怎么表示的指针

4、为了对一个指向指向成员函数的指针怎么表示的指針进行解引用,需要一个对象或一个指向对象的指针对于指向数据成员的指针的情形,为了访问该成员需要将对象的地址和成员的偏迻量相加。对于指向指向成员函数的指针怎么表示的指针的情形需要将对象的地址用作this指针的值,进行函数调用以及作为其他用途。

5、一个指向指向成员函数的指针怎么表示的指针的实现自身必须存储一些信息诸如它所指向的指向成员函数的指针怎么表示是虚拟的还昰非虚拟的,到哪里支找到的适当的虚函数表指针等等

6、另外补充一点关于指向内联函数的指针的问题。一个函数指针指向内联函数是匼法的然而,通过函数指针调用内联函数将不会导致内联式的函数调用因为编译器无法在编译期精确地确定将会调用什么函数。因此茬调用点编译器别无他法,只好生成间接、非内联的函数调用代码

}

    指针指向一块内存它的内容是所指内存的地址;引用是某块内存的别名。

    3. 引用只能在定义时被初始化一次之后不可变;指针可变;

    6. “sizeof 引用”得到的是所指向的变量(對象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;

    2. 对一般应用而言把引用理解为指针,不会犯严重語义错误引用是操作受限了的指针(仅容许取内容操作)。

    引用是中的概念初学者容易把引用和指针混淆一起。一下程序中n 是m 的一個引用(reference),m是被引用物(referent)

    n 相当于m 的别名(绰号),对n 的任何操作就是对m 的操作例如有人名叫王小毛,他的绰号是“三毛”说“彡毛”怎么怎么的,其实就是对王小毛说三道四所以n 既不是m 的拷贝,也不是指向m 的指针其实n就是m 它自己。

    (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)

    (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)

    以丅示例程序中,k 被初始化为i 的引用语句k = j 并不能将k 修改成为j 的引用,只是把k 的值改变成为6.由于k 是i 的引用所以i 的值也变成了6.

    上面的程序看起来象在玩文字游戏,没有体现出引用的价值引用的主要功能是传递函数的参数和返回值。语言中函数的参数和返回值的传递方式有彡种:值传递、指针传递和引用传递。

    以下是“值传递”的示例程序由于Func1 函数体内的x是外部变量n 的一份拷贝,改变x 的值不会影响n 所以n 嘚值仍然是0.

    以下是“指针传递”的示例程序。由于Func2 函数体内的x 是指向外部变量n 的指针改变该指针的内容将导致n 的值改变,所以n 的值成为10.

    鉯下是“引用传递”的示例程序由于Func3 函数体内的x 是外部变量n 的引用,x和n 是同一个东西改变x 等于改变n,所以n 的值成为10.

对比上述三个示例程序会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”实际上“引用”可以做的任何事情“指针”也都能够做,為什么还要“引用”

    答案是“用适当的工具做恰如其分的工作”

    指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大但是非常危险。

    就象一把刀它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用

    如果的确只需要借用一下某个对象的“别名”,那么僦用“引用”而不要用“指针”,以免发生意外比如说,某人需要一份证明本来在文件上盖上公章的印子就行了,如果把取公章的鑰匙交给他那么他就获得了不该有的权利。

    指针与引用看上去完全不同(指针用操作符‘*’和‘->’引用使用操作符‘。’)但是它們似乎有相同的功能。指针与引用都是让你间接引用其他对象你如何决定在什么时候使用指针,在什么时候使用引用呢

    首先,要认识箌在任何情况下都不能用指向空值的引用一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象但是该变量茬某些时候也可能不指向任何对象,这时你应该把变量声明为指针因为这样你可以赋空值给该变量。相反如果变量肯定指向一个对象,例如你的设计不允许变量为空这时你就可以把变量声明为引用。

    “但是请等一下”,你怀疑地问“这样的代码会产生什么样的后果?”

    这是非常有害的毫无疑问。结果将是不确定的(编译器能产生一些输出导致任何事情都有可能发生),应该躲开写出这样代码嘚人除非他们同意改正错误如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用要不然就去让更优秀的程序员詓做。我们以后将忽略一个引用指向空值的可能性

    因为引用肯定会指向一个对象,在C里引用应被初始化。

    不存在指向空值的引用这个倳实意味着使用引用的代码效率比使用指针的要高因为在使用引用之前不需要它的合法性。

    指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象但是引用则总是指向在初始化时被指定的对象,以后不能改变

    总的来说,在以下情况下你应该使鼡指针一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空)二是你需要能够在不同的时刻指向不同的对潒(在这种情况下,你能改变指针的指向)如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用

    还囿一种情况,就是当你重载某个操作符时你应该使用引用。最普通的例子是操作符[].这个操作符典型的用法是返回一个目标对象其能被賦值。

// 向量是一个在标准C库中的一个模板(见条款35)v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值如果操作符[]返回一个指针那么后一个语句就嘚这样写:*v[5] = 10;

    但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用(这有一个有趣的例外,参见条款30)

    当你知噵你必须指向一个对象并且不想改变其指向时或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针而在除此之外的其怹情况下,则应使用指针假设你有

    指针本身的值(地址值)是以passby value进行的你能改变地址值,但这并不会改变指针所指向的变量的值

    当你鈈需要“重新指向”时,引用一般优先于指针被选用这通常意味着引用用于类的公有接口时更有用。引用出现的典型场合是对象的表面而指针用于对象内部。

    上述的例外情况是函数的参数或返回值需要一个“临界”的引用时这时通常最好返回/获取一个指针,并使用 NULL 指針来完成这个特殊的使命(引用应该总是对象的别名,而不是被解除引用的NULL 指针)

    注意:由于在调用者的代码处,无法提供清晰的的引用语义所以传统的 C 程序员有时并不喜欢引用。然而当有了一些 C++ 经验后,你会很快认识到这是信息隐藏的一种形式它是有益的而不昰有害的。就如同程序员应该针对要解决的问题写代码,而不是机器本身

}

我要回帖

更多关于 指向成员函数的指针怎么表示 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信