C++成员指针

来源:互联网 发布:php 实例调用静态方法 编辑:程序博客网 时间:2024/05/27 02:27

1.成员指针是一种相对地址
2.结构体中或者类中的成员(变量或者函数)的相对地址的获取方式  &结构类型名::成员
3.声明成员指针变量

         成员类型 结构类型名::*指针变量名

4.通过成员指针访问结构成员

          结构变量*指针变量名


//我们要声明 指针 指向成员变量,成员变量的地址会一样么?成员变量的地址是由结构体对象决定的#include <iostream>using namespace std;//日期结构体struct Date{    int year; //年月日三个成员变量    int month;    int day;    void show (){        cout << year << '-' << month << '-' << day << endl;    }};//创建这个结构体是想测试结构体对象的内存空间struct Student {    int age;  //年龄    char sex; //性别    double score; //分数    void study(){        cout << "学生的分数是:" << score << endl;    }};int main(){        //获取成员变量地址  &类型名::变量名    //&Date::year;    //int* py = &Date::year;        //声明 成员变量指针  指向成员变量    int Date::* py = &Date::year;    int Date::* pm = &Date::month;    int Date::* pd = &Date::day;        //通过指针 输出它们的地址    cout << py << endl;    cout << pm << endl;    cout << pd << endl;    /*     会发现打印的结果都是1,原因是cout打印不出成员变量的地址,打印1是相当于true告诉你这真的是地址     */    printf("py = %p\n",py);    printf("pm = %p\n",pm);    printf("pd = %p\n",pd);        /*     py = 0x0     pm = 0x4     pd = 0x8     输出的结果是0 4 8  那是因为这是相对地址  相对于这个对象的开始地址来说,第一个year相对于对象是0 ,然后month是int类型占4个字节,所以month相对于对象的地址是4...day是8          每个对象都有这三个变量,每个变量相对于每个对象的地址都是0  4  8     */        #pragma  通过一个结构体(类)创建的对象在内存当中到底占多大空间??? 创建对象的时候 分配内存空间的大小是由该类的成员变量决定(方法创建完都放在代码区的,所以在此不考虑内存空间,方法名是一个函数指针,通过函数指针找到那个函数去调用)        Date d;    cout << "日期对象占的内存空间多大: " << sizeof(d) << endl;//输出12            Student stu;    cout << "学生对象占的内存空间大小: " << sizeof(stu) << endl;//输出16    /*          这里输出的却是16   为什么呢?为什么不是结构体变量类型占的内存空间的累加呢?这里就错了!          C语言求结构体大小的问题,成员变量的类型不一样这里涉及到(“对齐补齐”)的原理          */            #pragma 获取到成员变量的地址有什么用?    Date date;    date.year = 2015;    cout << "通过成员变量本身访问 " << date.year << endl;        //能不能通过 成员变量指针 去赋值?    date.*py = 2999; //*py指向一个成员变量year  所以也就相当于date.year  注意 .*不能分开,它们是一个运算符    cout << "通过成员变量指针赋值 " << date.year << endl;        date.month = 13;    date.day = 32;    date.show();     //输出 2999-13-32            //这时候date在栈里,date是一个对象,对象访问成员变量用点.  访问成员变量指针用点星 .*        #pragma 如果对象在堆里呢???    Date *pdate = new Date;  //堆中是用一个指针来指向一个堆里的空间    //通过指针访问变量 是用箭头 ->    pdate ->year = 3000;    cout << "通过指针访问变量" << pdate->year << endl;        //能通过 成员变量指针 访问成员变量吗?    pdate->*py = 3333;    cout << "通过 成员变量指针 访问成员变量 " << pdate->year << endl;        // 同理箭头星也是一个运算符   成员变量指针*py指向year可以取出year, 整体相当于pdate ->year                return 0;}




0 0
原创粉丝点击