描述:创建一个矩形类,要有两种构造函数,计算他的周长和面积。然后在这个基础上增加静态变量count来计数(类与对象作业、类的静态成员作业)
#include <iostream>
using namespace std;
class Rectangle
{
private:
double width;
double height;
static int count;
public:
Rectangle(double width = 0.1, double height = 0.1) {
this -> width = width;
this -> height = height;
count++;
} //构造函数,可以以两种方式调用
~Rectangle() {
count--;
} //内容为空
double getWidth() {
//注意这种函数不需要参数
return width;
}
double getHeight() {
return height;
} //get函数
double setWidth() {
this -> width = width;
}
double setHeight() {
this -> height = height;
} //set函数
double getArea() {
return width * height;
}
double getPerimeter() {
return (width + height) * 2;
}
static int getCount() {
return count;
} //增加一个返回静态属性的函数
void display() {
cout << "width =" << getWidth() << "height =" << getHeight();
cout << "Area =" << getArea() << "Perimeter =" << getPerimeter();
cout << "矩形对象的个数为:" << Rectangle::getCount() << endl; //调用类中函数的形式要注意加上作用域运算符
}
};
int Rectangle :: count = 0; //静态属性要在类的外面进行初始化
dispaly函数用来显示对象的基本信息。注意输出语句不要太长,在这里分成了两条来写。
int main()
{
double width, height;
Rectangle r1;
cout << "输出第一个缺省的矩形对象的信息:" << endl;
r1.display(); //显示基本信息
cout << "输入矩形的宽度和高度(width, height):";
cin >> width >> height;
Rectangle r2(width, height);
cout << "输出第二个带参矩形的信息" << endl;
r2.display();
return 0;
}
这样的程序其实还不够好。当系统规模比较大的时候,把类放在一个普通的cpp文件之中并不是最好的办法,会带来管理的问题。所以应该尽量按照类名称定义文件存储名。应该把类的声明部分放在Rectangle.h文件中,把实现部分放在Rectangle.cpp,包含了main函数的那个cpp文件可以看成是测试程序,可以随便命名。
Rectangle.h
//声明类,包含了所有函数的函数头,注意,不要写函数体。
Rectangle.cpp
//具体实现类,所有成员函数的具体代码写在这里,比如:
Rectangle :: Rectangle(double wdith = 0.1, double height = 0.1) {
this -> width = width;
this -> height = height;
count++;
}
//写好函数属于的类
job1.cpp
//创建Rectangle对象,并调用成员函数。其实就是那个main函数部分。注意:
#include "Rectangle.h"
//最后只需要编译main函数部分
也就是说 .h 和 .cpp 文件是成对的在定义一个类,只需要查找 .h 文件就可以知道这个类有什么功能可以用,非常方便。
对象数组作业:
1、在上面建立的矩形类的基础上,创建一个对象数组,用这样的语句声明对象数组,放在main函数之中
Rectangle rect[3] = {Rectangle(3,4), Rectangle(7,6), Rectangle(5,6)};
思考点:什么时候释放内存
2、创建一个指针数组,定义形式如下
Rectangle *pRectangle[3];
思考点:指针数组的内存和所生成的对象所占据的内存分别在什么时候释放
//注意点
//1、在构造函数和析构函数中增加输出语句
缺省的构造函数:Default Constructor called
含参数的构造函数: Constructor called
析构函数: Destructor called
//2、静态对象数组:
//对象数组的N的定义:
const int N = 3;
Rectangle rect[N] = {Rectangle(3, 4), Rectangle(5, 6), Rectangle(7, 6)};
//3、动态对象数组
Rectangle *rect = new Rectangle[num];
rect[0].setWidth(3.0);
rect[0].setHeight(4.0); //在这里不会自动调用析构函数,所以需要调用delete语句
delete [] rect;
总结:静态对象数组,系统在main函数结束时自动释放。如果是new语句的动态对象数组,则是需要自己用delete释放
//指向对象的指针数组,每一个指针指向一个对象
Rectangle *pRectangle[3];
//循环输入每个对象的信息。每个元素(对象)在for循环的反括号结束时就消亡了。
这个指针数组是静态创建的,(虽然他的元素是一个一个用new动态分配空间的)所以不能用这种方式释放内存
delete [] pRectangle;
只能用一个循环
for (i = 0; i < n; i++) {
delete pRectangle[i];
}