• 对象与指针


    #include<iostream>
    #include<cstring>
    #include<string>
    #include<iomanip>
    #include<fstream>
    using namespace std;
    class Date
    {
    public:
        int day,month,year;
        void init(int,int,int );
        void print();
    };

    void Date::init(int yy,int mm,int dd)
    {
        year=yy;
        month=mm;
        day=dd;
    }
    void Date::print()
    {
        cout<<year<<" "<<month<<" "<<day<<endl;
    }

    int main()
    {
        Date date1;
        date1.init(2,2,2);
        Date *date2;
        date2=new Date;//注意申请空间,当定义一个指针类时,需申请空间,但是(Person p)时,这个时候不需要申请空间
        date2->init(1,1,1);
        date2->print();//指向对象的指针,输出结果是1 1 1
        int *t2;
        t2=&date1.month;
        cout<<*t2<<endl;//普通变量的指针,输出结果是2
        Date *p1=&date1;
        p1->init(2005,3,28);
        p1->print();
        int *p2;
        p2=&date1.year;
        cout<<*p2<<endl;
        void(Date::*p3)(int,int,int );//指向成员函数的指针。
        void(Date::*p4)();
        p3=&Date::init;//这个地方注意加上取地址符,课本上错了
        p4=&Date::print;
        (date1.*p3)(2006,4,8);
        (date1.*p4)();
        return 0;
    }

    具体声明一个指向成员函数的指针的时,我觉得可以分为三部分.

    第一部分,声明。

    函数的返回值类型(类名::指针变量名)目标函数的参数。

    ex:void (Date::*p1)(int ,int ,int );

    第二部分,指向(我自己编的名字,不用在意这些细节)。

    指针变量名=& 类名::函数名(不带参数)。

    ex:p1=&Date::init;

    第三部分,赋值

    (申请的类的名称.指针变量名)(1 ,1,1);

    ex:(date1.*p)(1,1,1);


    ps:在定义新的变量或者类时,使用指针定义和直接定义在使用成员函数的时候是不一样的。

    如果是定义的这种,Person *p1,在使用类的成员函数的时候,使用->进行访问(p1->print())。如果是这样定义的,Person p1,使用"."进行访问(p1.print())(不一定对,我是这样理解的)。

    但是,this指针就比较特殊,好像两种都行,并且使用方法还反着。。。

    上代码:

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<iomanip>
    #include<fstream>
    using namespace std;
    class Test{
    int x;
    public:
    Test(int =0);
    void print();
    };
    Test::Test(int a){x=a;}
    void Test::print(){
    cout<<x<<endl;
    cout<<this->x<<endl;
    cout<<(*this).x<<endl;
    }

    int main(){
    Test q(12);
    q.print();
    return 0;
    }

    输出结果都是 12




  • 相关阅读:
    创建Azure虚拟机之Azure Portal方式
    Windows平台启动与关闭Azure虚拟机
    Linux文件操作命令
    vue中使用图片裁剪cropperjs
    Linux权限管理之基本权限
    设计模式6大原则之【迪米特原则】
    设计模式6大原则之【接口隔离原则】
    设计模式6大原则之【单一职责原则】
    sql中的join
    Redis学习之:Redis的使用和优化
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262999.html
Copyright © 2020-2023  润新知