【项目1-三角形类的构造函数】
设计三角形类,通过增加构造函数,使对象在定义时能够进行初始化,可以由下面的类声明开始,需要自己实现相关的成员函数,以及增加要求的构造函数
(1)
使用带参数构造函数,即Triangle(double x, double y, double z),三边长在调用时由实参直接给出。需要的测试函数是:
int main()
{
Triangle Tri(7,8,9); //定义三角形类的一个实例(对象)
Tri.showMessage();
return 0;
}
头文件:
#include
#include//C++专用,也兼容C的
using namespace std;
class Triangle
{
public:
Triangle(double x, double y, double z) :a(x), b(y), c(z) {}//直接在类体中定义构造函数
double perimeter();//周长
double area();//面积
void showMessage();
private:
double a, b, c; //三边为私有成员数据
};
void Triangle::showMessage()
{
cout << "三角形的三边长分别为:" << a << ' ' << b << ' ' << c << endl;
cout << "该三角形的周长为" << perimeter() << ",面积为:" << area() << endl << endl;
}
double Triangle::perimeter()//不要忘记限定符
{
return (a + b + c);
}
double Triangle::area()
{
double s = (a + b + c) / 2;
return(sqrt(s*(s - a)*(s - b)*(s - c)));
================================================================================================
(2)设计无参构造函数,默认各边长为1。需要的测试函数是:
int main()
{
Triangle Tri; //调用默认构造函数,不指定参数时,默认各边长为1;
Tri.showMessage();
return 0;
}
Triangle()
{
a = 1;
b = 1;
c = 1;
}
================================================================================================
(3)使用带默认参数值的构造函数,不给定实参时,默认边长为1;注意——这个版本也只需要一个构造函数即可。需要的测试函数是:
int main()
{
Triangle Tri1; //定义边长为1 1 1的三角形类实例
Tri1.showMessage();
Triangle Tri2(1.5);//定义边长为1.5 1 1的三角形类实例
Tri2.showMessage();
Triangle Tri3(1.5,1.5);//定义边长为1.5 1.5 1的三角形类实例
Tri3.showMessage();
Triangle Tri4(7,8,9); //定义边长为7 8 9的三角形类实例
Tri4.showMessage();
return 0;
}
默认函数定义:
Triangle(double x=1, double y=1, double z=1) :a(x), b(y), c(z) {}
二
类文件:
using namespace std;
#include
class Date
{
public:
Date(int m = 1, int d = 1, int y = 2005) :month(m), day(d), year(y) {}//使用参数初始化表可以直接在类内定义
void display(); //使用默认参数可以避免函数重载
private: //一个类只能有一个默认构造参数
int month;
int day;
int year;
};
void Date::display()
{
cout << month << "/"<< day << "/" << year<< endl;
}
main函数:
int main()
{
Date d1(10, 13, 2005);
Date d2(12, 30);
Date d3(10);
Date d4;
d1.display();
d2.display();
d3.display();
d4.display();
system("pause");
return 0;
}
运行结果:
============================================================================================
描述
请定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干构造函数和一个移动的成员函数,可输出移动后新的坐标值。
输入
第一行的两个数分别表示点的x坐标和y坐标,第二行的两个数分别表示x方向和y方向移动的距离。
输出
移动后点的x坐标和y坐标。
样例输入
1 5
2 5
样例输出
3 10
#include
using namespace std;
class Point
{
public:
Point(int a, int b) :x(a), y(b) {};//设定原点的x-y坐标
void Pointx(int, int); //添加增量
void Disp();
private:
int x;
int y;
};
void Point::Pointx(int c, int d)//易忘作用域,导致函数无法调用类体中的x,y
{
x += c;
y += d;
}
void Point::Disp()
{
cout << x << " " << y << endl;
}
int main()
{
int a, b,c,d;
cin >> a >> b;
Point p(a, b);
cin >> c >> d;
p.Pointx(c,d);
p.Disp();
system("pause");
return 0;
}
================================================================================================
【项目1】对象数组
编写基于对象的程序,求5个长方体的体积和表面积。长方体类Bulk的数据成员包括长(length)、宽(width)、高(heigth)等。
对照已经给出的代码,要做的工作及要求有:
1.定义长方体类
2.定义由5个长方体对象构成的对象数组b;
3.b数组初始化;
①前3个对象b[0]、b[1]、b[2]直接参数初始化,需要定义构造函数,而初始化中,各对象提供的参数数目不同,需要有默认参数的构造函数(未给出的参数默认为1.0)
②第4个对象b[3]用默认构造函数初始化;
③第5个长方柱b[4]定义时不初始化,设计成员函数get_value,由键盘输入长、宽、高;
4.设计成员函数output,在main中调用输出这5个长方柱的体积和表面积;
}
#include
using namespace std;
class Bulk
{
public:
Bulk(double l=5 , double w=5, double h=5) :length(l), width(w), heigth(h) {};
double volume(){ return heigth * width*length; };
double area() { return 2 *( heigth * width + width * length + heigth * length ); };
void get_value()
{
cout << "分别输入长,宽,高"<> length>> length>> heigth;//直接调用私有成员,不用重新定义函数
cout<<"b[5]的体积为:"<< volume() <
总结:
1.默认参数列表和参数初始化表可以结合,如:
Bulk(double l=5 , double w=5, double h=5) :length(l), width(w), heigth(h) {};
【项目2】对象指针
设计一个学生类Student,数据成员包括学号(num)和成绩(score),成员函数根据需要自行设计(建议配备需要的set、get函数,以及必要的输入或输出)。在main函数中,要做到:
1.建立一个对象数组,通过初始化,设置5个学生的数据;
2.用指针指向数组首元素,输出第1、3、5个学生的信息;
3.设计一个函数int max(Student *arr);,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并返回值其学号。
下面给出部分程序,在此基础上完成项目:
}
#include
using namespace std;
class Student
{
public:
Student(int a, double b) :num(a), score(b) {};
int get_num() { return num; } //返回的意思是:将数据成员输入的值送到调用它的函数中.
double get_score(){ return score; }
void Disp();
private:
int num; //学号
double score; //成绩
};
void Student::Disp()
{
cout << num << " " << score << endl;
}
int max(Student *arr);//max函数返回arr指向的对象数组中的最高成绩(max并不是成员函数,而是普通函数)
//函数声明不可放在类前!程序在编译时是按顺序逐行编译的
int max(Student *arr) //把指针当成变量一样用.
{
double max_score = arr[0].get_score();
int j = 0; //需要定义3个变量,i遍历全部5条数据,max_score记录最高分者的成绩,j记录最高分者的学号
for (int i = 1; i < 5; i++)
{
if (arr[i].get_score() > max_score) //函数在定义时,绝不能忘了加()
{
max_score = arr[i].get_score();
j = i;
}
}
cout << "最高成绩为:" << max_score << endl;
system("pause");
return (arr[j].get_num()); //返回的意思是:将main函数输入的初始值经过运算,再送回main(){}中.
}
//-------------------------------------------------------------------------------
int main()
{
Student stud[5] =
{
Student(101, 78.5),
Student(102, 85.5),
Student(103, 100),
Student(104, 98.5),
Student(105, 95.5)
};
//输出第1、3、5个学生的信息(用循环语句)
Student *p=stud; //什么时候加&.什么时候不加?
for (int i = 0; i < 5;p=p+2,i=i+2) //普通对象加,数组不加
{
cout << "学生" << i + 1 << ":";
(*p).Disp(); //忘加()
}
//输出成绩最高者的学号
cout << "5个学生中成绩最高者的学号为: " << max(stud) << endl;
return 0;
}