Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160458
  • 博文数量: 83
  • 博客积分: 3956
  • 博客等级: 中校
  • 技术积分: 663
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-24 16:29
文章分类

全部博文(83)

文章存档

2010年(83)

我的朋友

分类: C/C++

2010-10-22 20:47:45

再补充一个例子:

类引用举例(学生类:学生的姓名成绩及相关的运算)

#include <iostream>
#include <cstring>

using namespace std;

class Stu {
    char Name[20];
    float Chinese;
    float Math;
public:
    float Average(void);
    float Sum(void);
    void Show(void);
    void SetStudent(const char *, float, float);
    void SetName(const char *);
    char *GetName(void);
};

float Stu::Average(void)
{
    return (Chinese+Math)/2;
}

float Stu::Sum(void)
{
    return Chinese+Math;
}

void Stu::SetStudent(const char *name, float chinese, float math)
{
    strcpy(Name, name);
    Chinese = chinese;
    Math = math;
}
void Stu::Show(void)
{
    cout << "Name=" << Name << endl << "Score: " << Chinese
        << '\t' << Math << '\t' << "average: " << Average()
        << '\t' << "Sum= " << Sum() << endl;
}

char *Stu::GetName(void)
{
    return Name;
}

void Stu::SetName(const char *name)
{
    strcpy(Name, name);
}
int main(void)
{
    Stu p1, p2;
    p1.SetStudent("Li qing", 98, 96);
    p2.SetStudent("Wang Gang", 90, 98);
    p1.Show();
    p2.Show();
    p1.SetName("Zhao jian");
    p1.Show();
    cout << "p1.Name: " << p1.GetName() << endl;
    cout << "p1.average: " << p1.Average() << endl;
}

运行结果:

Name=Li qing

Score: 98    96    average: 97    Sum= 194

Name=Wang Gang

Score: 90    98    average: 94    Sum= 188

Name=Zhao jian

Score: 98    96    average: 97    Sum= 194

p1.Name: Zhao jian

p1.average: 97

成员函数的重载

类中的成员函数与前面介绍的普通函数一样,成员函数可以带有缺省的参数,也可以重载成员函数。重载时,函数的形参必须在类型或数目上不同。

class Test{
        int x , y;
        int m, n;
    public:
        void Setxy(int a, int b){x=a;    y=b;}
        void Setxy(int a,int b,int c,int d){ x=a;y=b;m=c;n=d;}
        void Printxy(int x){cout<< “m="<<<n<<endl;}
        void Printxy(void) {cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}
} ;
void main(void)
{     Test p1,p2;
        p1.Setxy(3, 5); p2.Setxy(10,20,30,40);//参数不同        

       p1.Printxy();
    p2.Printxy(); p2.Printxy(2);//参数、类型不同

}

class Stu
{    char Name[20];
    float Chinese;
    float Math;
    float English;
    float Physical;
public:
    float Average(void);//语文、数学平均成绩

    float Average(int n);//四门课的平均成绩

    float Sum(void);//语文、数学总分

    float Sum(int n);//四门课总分

    void Show(void);
    void SetStudent(char*,float,float);//置姓名、语文、数学初值

    void SetStudent(char *, float,float,float,float);//置姓名、成绩

    void SetName(char *);
    char *GetName(void);
};

可以有缺省参数的成员函数,若形参不完全缺省,则必须从形参的右边开始缺省。

缺省参数的成员函数

class A{
    float x,y;
public:
    float Sum(void) { return x+y; }
    void Set(float a, float b=10.0) { x=a;    y=b;}
      void Print(void) {    cout<<"x="<<x<<'\t'<<"y="<<y<<endl; }
};
void main(void)
{    A a1,a2;
    a1.Set (2.0,4.0);
    cout<<"a1: ";     a1.Print ();
    cout<<"a1.sum="<<a1.Sum ()<<endl;
    a2.Set(20.0);
    cout<<"a2: ";     a2.Print ();
    cout<<"a2.sum="<<a2.Sum ()<<endl;
}

定义类的指针及如何用指针来引用对象

class A{
    float x,y;
public:
    float Sum(void) { return x+y; }
    void Set(float a,float b) { x=a;    y=b;}
      void Print(void) {    cout<<"x="<<x<<'\t'<<"y="<<y<<endl; }
};
void main(void)
{    A a1,a2;
    A *p;        //定义类的指针

    p=&a1;    //给指针赋值

            p->Set(2.0, 3.0); //通过指针引用对象的成员函数

            p->Print();
            cout<<p->Sum()<<endl;
    a2.Set(10.0, 20.0); a2.Print();
}

定义类的数组及数组中元素的引用

void main(void)
{
    Stu stu[3];    //定义类的数组

    Stu *pstu;    //定义类的指针

    pstu=stu;    //为指针赋值

    int i;
    stu[0].SetStudent (“A”,90,90);//通过数组元素的引用赋值

    stu[1].SetStudent ("B",80,80);
    stu[2].SetStudent ("C",70,70);
    for(i=0;i<3;i++)
    {
        pstu->Show ();//指针变量指向数组元素

        pstu++;    //指针变量加一,指向下一元素

    }
}

返回引用类型的成员函数(可以返回私有数据成员的引用)

class A{
    float x,y;
public:
    float &Getx(void ) { return x; }     //返回x的引用

    void Set(float a,float b) { x=a; y=b; }
    void Print(void) { cout<<x<<'\t'<<y<<endl; }
};
void main(void)
{    A a1,a2;
    a1.Set (3,5);
    cout<<"a1: ";     a1.Print ();
    a1.Getx()=30;    //将a1对象中的x成员赋值

    cout<<"changed a1: ";
    a1.Print ();
}

this 指针

    不同对象占据内存中的不同区域,它们所保存的数据各不相同,但对成员数据进行操作的成员函数的程序代码均是一样的.

    当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,也隐含使用this指针。

    this指针具有如下形式的缺省说明:

       Stu   *const    this; 

即 this 指针里的地址是一个常量。

阅读(426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~