成员指针

成员变量指针

静态成员变量、静态成员函数与对象无关,静态成员指针与普通指针一致

本质就是特定成员变量在对象实例中的相对地址,解引用时再根据调用对象的地址计算该成员变量的绝对地址

定义

     类型 类名 ::* 成员变量指针 = &类名 ::成员变量

使用

    对象.*成员变量指针\对象指针->*成员变量指针 =====>  .*成员变量解引用\->* 间接成员变量解引用

成员函数指针

虽然成员函数并不存储在对象中,但也要通过对象或者对象指针对成员函数指针解引用,其目的只有一个,即提供this指针

定义

  返回类型(类型::*成员函数指针)(形参表) = &类名::成员函数名;

使用

  (对象.*成员函数指针)(实参表)

  (对象指针->*成员函数指针)(实参表)

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
    Student(const string & name = "",int age = 0):m_name(name),m_age(age){}
    string m_name;
    int m_age;
    static int m_data;
    static int add(int x , int y)
    {
        return x+y;
    }
    void who()
    {
        cout << m_name << " "
             << m_age << endl;
    }
};
int Student::m_data = 100;
int _tmain(int argc, _TCHAR* argv[])
{//成员变量指针
    string Student::*pname = &Student::m_name;//pname的初始化不需要对象,他将指向任何对象的m_name
    //存成员变量的偏移量,在解引用时,使用起始位置+偏移量

    int Student ::*page = &Student::m_age;
    Student s1("张飞",24),s2("赵云",25);
    //成员函数指针
    void (Student::*pwho)(void) = &Student::who;
    //成员指针时,取地址必须写
    cout << s1.*pname << endl;//(.*,成员指针解引用运算符->*间接成员指针解引用运算符)
    cout << s2.*pname <<endl;
    cout << s1.*page << endl;
    cout << s2.*page << endl;
    (s1.*pwho)();
    (s2.*pwho)();

    int *pdata = &Student::m_data;
    cout << *pdata << endl;
    int(*padd)(int ,int ) = Student ::add;
    cout << padd(100,200) << endl;

    system("pause");
    return 0;
}
时间: 2024-10-10 17:44:45

成员指针的相关文章

【转载】C/C++杂记:深入理解数据成员指针、函数成员指针

原文:C/C++杂记:深入理解数据成员指针.函数成员指针 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针.而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始地址的偏移值,空指针用-1表示.例: 代码示例:   2. 函数成员指针 函数成员指针与普通函数指针相比,其size为普通函数指针的两倍(x64下为16字节),分为:ptr和adj两部分. (1) 非虚函数成员指针 ptr部分内容为函数指针(指向一个全局函数,该函数的第一个参数为this指针),ad

c++,new,delete,成员指针

new和delete用来申请动态内存空间,一定要配对使用 #include <string> #include <ctype.h> #include <vector> #include <iostream> #include <fstream> // using declarations states our intent to use these names from the namespace std using namespace std;

C++拾遗--类成员指针

C++拾遗--类成员指针 前言 类成员的类型与一般类型不同,那么类成员的指针类型自然与一般类型的指针有所区别.我们有必要来探讨下类成员指针的使用. 正文 类成员指针是指可以指向类的非静态成员的指针.它的类型包括了类类型和所指向的成员类型.一般而言,指针指向的是对象,而类成员指针指向的是类成员而非类对象. 需要指出,类成员指针不是可调用对象,要想通过类成员指针调用类成员,需结合类对象或类指针.静态类型成员属于类,类型与普通指针相似. 数据成员指针 一般的声明形式: 成员类型 classname::

EDKII CR宏:根据成员指针获取父结构体变量指针

核心提示: 1. CR宏 (Containing Record):根据成员指针获取父结构体变量指针 2. 0 指针的妙用. 在EDKII 的代码中有不少关于CR宏的使用,如 时钟中断处理函数CoreTimerTick. VOID EFIAPI CoreTimerTick ( IN UINT64 Duration ) { IEVENT *Event; ... if (!IsListEmpty (&mEfiTimerList)) { Event = CR (mEfiTimerList.Forward

[C++ primer]类成员指针

1.声明成员指针 有时我们希望直接获取成员的指针,然后从一个对象或别的对象获得该成员,这时就需要用到成员指针.成员指针,包含类的类型以及成员的类型. 成员指针只针对类的非static成员.static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员,static成员指针是普通指针. 注:它指向的是一个类的特定成员,而不是指向一个特定对象里的特定成员. 成员指针的定义格式:成员类型 类名::*指针名=&类名::成员名; 成员函数指针的定义格式: 成员函数返回类型 类名::*指

C++ Primer 学习笔记_103_特殊工具与技术 --类成员指针

特殊工具与技术 --类成员指针 成员指针可以做到:获得特定成员的指针,然后从一个对象或别的对象获得该成员.成员指针应该包含类的类型以及成员的类型. 一.声明成员指针 测试类: class Screen { public: typedef std::string::size_type index; char get() const; char get(index ht,index wd) const; private: std::string contents; index cursor; ind

C/C++杂记:深入理解数据成员指针、函数成员指针

1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针. 而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始地址的偏移值,空指针用-1表示.例: 代码示例: struct X { int a; int b; }; #define VALUE_OF_PTR(p) (*(long*)&p) int main() { int X::*p = 0; // VALUE_OF_PTR(p) == -1 p = &X::a; // VALUE_OF_PTR(p) ==

C Language Study - 结构体成员指针初始化

结构体成员指针初始化 不可以正确运行的初始化方式(1): #include <stdio.h> #include <string.h> #include <malloc.h> //#include "a.h" //char a[100]; struct stu { char* name; int num; }*pst,st; void init_pst() { pst = (struct stu *)malloc(sizeof(struct stu)

类成员指针——偏移量

成员指针只是记录一个成员的偏移量,而非地址,因为类中没有地址,选择一个类的成员只是意味着在类中偏移,只有把这个偏移和具体对象的首地址结合,才能得到实际地址. 成员指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,而不是指向一个特定对象的特定成员,最直接的理解是将其理解为一个偏移量.这个偏移量适用于某一类A的任何对象,换言之,如果一个A类对象的成员a距离起点的偏移量是4,那么任何其他A类对象中,a的偏移都是4字节. 类对象访问其成员时,是根据该成员在类中的偏移量来访问的. 类成员指针,可