现在的位置: 首页 > 综合 > 正文

对象指针

2012年08月19日 ⁄ 综合 ⁄ 共 3790字 ⁄ 字号 评论关闭

指向对象的指针与对象指针的区别:

指向对象的指针就是:类对象的指针

class persion;
persion apersion;
persion* pa=&apersion;                //指向类persion对象的指针

  类对象是在内存中为这个类的分配一块内存指针就是指这块一块内存的开始!对象只能事先定义好,只能在定义的区域内使用,生命周期有限,而指针可以在使用时创建,使用的范围为全局,可以保存只到你不在使用他时再删除。指针就是一个整数,这个整数就是一个地址,这个地址是某个数据块的地址,通过它,可以访问那块内存,总之,指针就是地址了。类的对象:用的是内存栈,是个局部的临时变量.类的指针:用的是内存堆,是个永久变量,除非你释放它.
当类是有虚函数的基类,Func是它的一个虚函数,则调用Func时:
  类的对象:调用的是它自己的Func;
  类的指针:调用的是分配给它空间时那种类的Func;
要发挥虚函数的强大作用,必须使用指针来访问对象.

对象指针:类数据成员和成员函数的指针,指向类数据成员或成员函数

class persion{
public:
 int height;
 int weight;
 int volume();
};
int persion::* pa;
pa=&persion::height;                          //数据对象指针
int (persion::*pvolume)();
pvolume=&persion::volume;               //函数对象指针
类对象指针调用时必须与类对象一起调用才行:
persion apersion(170,60);
int persion::* pa;
pa=&persion::height;                                
cout<<apersion.*pheight<<endl;
int (persion::*pvolume)();
pvolume=&persion::volume;                     
cout<<(apersion.*pvolume)()<<endl;
对象指针
1、对象指针的一般概念
对象指针遵循一般变量指针的各种规则:类名 *对象指针名;
                                              对象指针名->成员名;
对象指针在使用之前,也一定要先进行初始化,让它指向一个已经声明过的对象,然后再使用。通过对象指针,可以访问到所指向对象的公有成员。
2、this指针
this指针是一个隐含于每一个类的成员函数中的特殊指针,它用于指向正在被成员函数操作的对象。实际过程是,当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。/**难怪:在成员函数之外无法访问数据成员,找不到对象呀!(当然中间的private,protected另作谈论**/
3、指向类的非静态成员的指针(非指向对象,而是指向对象成员)
指向对象成员的指针使用前也要先声明,再赋值,然后引用,因此首先要声明指向该对象所在类的成员的指针。注意,通过指向成员的指针也只能访问到公有成员
语法形式:类型说明符   类名::*指针名;          //声明指向公有数据成员的指针
             类型说明符   (类名::*指针名)(参数表);//声明指向公有函数成员的指针
对数据成员指针赋值:
             指针名 = &类名::数据成员;
此时还不能通过指针访问变量。类的声明只确定了各个数据成员的类型、所占内存大小以及它们的相对位置,在声明时并不为数据成员分配具体的地址。因此经上述赋值之后,只是说明了被赋值的成员指针式专门用于指向哪个数据成员的,同时在指针中存放该数据成员在类中的相对位置,当然通过这样的指针现在并不能访问什么。
       由于类是通过对象而实例化的,在声明类的对象时才会为具体的对象分配内存空间,这时只要将对象在内存中的起始地址与成员指针中存放的相对偏移结合起来就可以访问到对象的数据成员了。
       语法形式:对象名.*类成员指针名
        或          对象指针名à*类成员指针名
       成员函数指针赋值:
                      指针名 = 类名::函数成员名;
       经过上述对成员函数指针赋值之后,还不能用指针直接调用成员函数,而是需要首先声明类的对象,因为必须要通过对象来调用非静态成员函数。
       利用指针调用成员函数:
                      (对象名.*类成员指针名)(参数表)
     或      (对象指针名à*类成员指针名)(参数表)
4、指向类的静态成员的指针
       类的静态成员可以用普通的指针来指向和访问。/**形式上把静态成员看成普通变量就可以**/

对象指针:在C++中,可以说明指向类的数据成员和成员函数的指针。

1. 对象指针作函数的参数

    使用对象指针作为函数参数要经使用对象作函数参数更普遍一些。因为使用对象指针作函数参数有如下两点好处:

    (1) 实现传址调用。可在被调用函数中改变调用函数的参数对象的值,实现函数之间的信息传递。

    (2) 使用对象指针实参仅将对象的地址值传给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时空开销。

    当形参是指向对象指针时,调用函数的对应实参应该是某个对象的地址值,一般使用&后加对象名。下面举一例子说明对象指针作函数参数。 

#include <iostream.h>
    class M
    {
    public:
        M() { x=y=0; }
        M(int i, int j) { x=i; y=j; }
        void copy(M *m);
        void setxy(int i, int j) { x=i; y=j; }
        void print() { cout<<x<<","<<y<<endl; }
    private:
        int x, y;
    };

    void M::copy(M *m)
    {
    x=m->x;
    y=m->y;
    }

    void fun(M m1, M *m2);
    void main()
    {
    M p(5, 7), q;
    q.copy(&p);
    fun(p, &q);
    p.print();
    q.print();
    }

    void fun(M m1, M *m2)
    {
    m1.setxy(12, 15);
    m2->setxy(22,25);
    }

    输出结果为:
    5,7
    22,25

 

  从输出结果可以看出,当在被调用函数fun中,改变了对象的数据成员值[m1.setxy(12, 15)]和指向对象指针的数据成员值[m2->setxy(22, 25)]以后,可以看到只有指向对象指针作参数所指向的对象被改变了,而另一个对象作参数,形参对象值改变了,可实参对象值并没有改变。因此输出上述结果。

 

 

2. 对象引用作函数参数

 

    在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象引用作函数参数。现举一例子说明对象引用作函数参数的格式。

 

 

 #include <iostream.h>
    class M
    {
    public:
        M() { x=y=0; }
        M(int i, int j) { x=i; y=j; }
        void copy(M &m);
        void setxy(int i, int j) { x=i; y=j; }
        void print() {cout<<x<<","<<y<<endl; }
    private:
        int x, y;
    };

    void M::copy(M &m)
    {
        x=m.x;
        x=m.y;
    }

    void fun(M m1, M &m2);

    void main()
    {
        M p(5, 7), q;
        q.copy(p);
        fun(p, q);
        p.print();
        q.print();
    }

    void fun(M m1, M &m2)
    {
        m1.setxy(12, 15);
        m2.setxy(22, 25);
    }

 

  该例子与上面的例子输出相同的结果,只是调用时的参数不一样。

this指针

    this指针是一个隐含于每一个成员函数中的特殊指针。它是一个指向正在被该成员函数操作的对象,也就是要操作该成员函数的对象。

    当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含作用this指针。而通常不去显式地使用this指针来引用数据成员。同样也可以使用*this来标识调用该成员函数的对象。下面举一例子说明this指针的应用。

    

#include <iostream.h>
    class A
    {
    public:
    A() { a=b=0; }
    A(int i, int j) { a=i; b=j; }
    void copy(A &aa);    //对象引用作函数参数
    void print() {cout<<a<<","<<b<<endl; }
    private:
    int a, b;
    };

    void A::copy(A &aa)
    {
    if (this == &aa) return;    //这个this是操作该成员函数的对象的地址,在这里是对象a1的地址
    *this = aa;    //*this是操作该成员函数的对象,在这里是对象a1。
            //此语句是对象aa赋给a1,也就是aa具有的数据成员的值赋给a1的数据成员
    }

    void main()
    {
    A a1, a2(3, 4);
    a1.copy(a2);
    a1.print();
    }

 

运行结果:

    3, 4

 

抱歉!评论已关闭.