学习的乐园

实践,交流,积累,提高!

导航

C++学习笔记之"类和对象II"

指向类成员的指针

#include <iostream>
class A 
{
public:    
A(int i) {a=i;}    
int fun(int b) {return a*c+b;}    
int c;private:    
int a;
};
void main()
{    
A x(8);    
int A::*pc;//指向类的数据成员的指针pc    
pc=&A::c;    
x.*pc=3;//通过指针对数据成员c赋值    
int (A::*pfun)(int);//指向类的函数成员的指针pfun   
pfun=&A::fun;    
A *p=&x;//注意是相同的类   
cout<<(p->*pfun)(5)<<endl;//通过指向对象的指针p调用指向成员函数的指针pfun,(p->*pfun)(5)等价于p->fun(5)等价于(x.*pfun)(5)
}

对象指针和对象引用做函数参数

对象指针作函数参数

#include <iostream> 

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 fun1(M m1,M *m2); 

void main()
{
M p(5,7),q;
q.copy(&p);//实参是某个对象的地址值
fun1(p,&q);
p.print();
q.print(); 

}
void fun1(M m1,M *m2)
{
    m1.setxy(12,15);//形参对象值改变了,实参对象值并没有改变
    m2->setxy(22,25);//指向对象的指针作参数所指向的对象的值改变了
} 

对象引用作函数参数

应用比对象指针作函数参数更普遍

#include <iostream> 

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 fun1(M m1,M &m2); 

void main()
{ 
M p(5,7),q;
q.copy(p);//实参是某个对象
fun1(p,q);
p.print();
q.print(); 

}
void fun1(M m1,M &m2)
{
    m1.setxy(12,15);//形参对象值改变了,实参对象值并没有改变
    m2.setxy(22,25);//对象引用作参数所引用的对象的值改变了
}

this 指针

一个隐含于每一个类成员函数中的特殊指针,指向一个正在被某个成员函数操作的对象的指针

#include <iostream> 

class M
{
public:
    M(){x=y=0;}
    M(int i,int j){x=i;y=j;}
    void copy(M &m);
    void print(){cout<<x<<","<<y<<endl;}
private:
    int x,y;
};
void M::copy(M &m)//形参是对象的引用
{

if (this==&m) return;//this是操作该成员函数的对象的地址
    *this=m;//*this操作该成员函数的对象

}

void main()

{

M p(5,7),q;
q.copy(p);
p.print(); 

}

指向数组的指针和指针数组

指向数组的指针

#include <iostream> 

class M
{
public:
    M(){x=y=0;}
    M(int i,int j){x=i;y=j;}
    void print(){cout<<x<<","<<y<<endl;}
private:
    int x,y;
};

void main()

{

M m[2][4];
    int x=10,y=10;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<4;j++)
        {
            m[i][j] = M(x+=2,y+=10);
        }
    }
//for(int i=0;i<2;i++)
//    {
//        cout<<endl;
//for(int j=0;j<4;j++)
//m[i][j].print();
//}
//    cout<<endl;
    M (*pm)[4](m);//定义一个一维对象数组的指针pm,指向2维对象数组m
for(int i=0;i<2;i++)
    {
        cout<<endl;
for(int j=0;j<4;j++)
(*(*(pm+i)+j)).print();
}
cout<<endl;
}

指针数组

#include <iostream> 

#include <string>

const int N=5; 

void main()
{ 

char *strings[N];//字符指针数组,可以用来存放N个字符串
    char str[80];
    cout<<"At each prompt ,enter a string:\n";
    for(int i=0;i<N;i++)
    {
        cout<<"Enter a string #"<<i<<":";
        cin.getline(str,sizeof(str));//从键盘上一次获取字符串,sizeof(str)给出str数组所占的内存空间字节数
        strings[i]=new char[strlen(str)-1];//给某个指针动态地分配一个内存地址
        strcpy(strings[i],str);
    }
    cout<<endl;
for(int i=0;i<N;i++)
cout<<"string #"<<i<<":"<<strings[i]<<endl; 

}

posted on 2010-07-25 18:33  CrazeCoder  阅读(266)  评论(0)    收藏  举报