再补充一个例子:
类引用举例(学生类:学生的姓名成绩及相关的运算)
#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) |