类学习二 (红皮书 P68-82)
2016.3.19.晚7:30
进一步的认识:
公有的成员函数相当于是类的对外接口,而私有的则是自己独享的隐私,外界的人不能随便更改,只能通过公有的成员函数进行得知。即实现了接口和实现的分离。
分离的好处:只要接口没有变,对私有的修改就不会引起错误。
编程习惯:把类的声明放在头文件中,成员函数的定义即类的实现放在主文件中
重点来啦。。。。构造函数
1、构造函数是类的初始化。类的初始化不能直接在定义中声明。
2、构造函数的名称必须与类名一致,没有返回值类型
3、在没有写出来的时候,默认调用的构造函数初值全是零,且构造函数的本质在于为对象分配存储空间
4、构造函数可以重载,系统的识别在于对象到底声明得是什么样的。
5、不使用参数而调用的构造函数有两种写法,一种有初值。一种无初值:
Box ();//无初值
Box(int=10,int=10,int=10)//有初值
这两者不能同时出现,不可兼得,互不相容
#include <iostream>
using namespace std;
class Box
{
public:
Box();
Box(double, double, double);//带参数的构造函数可为空Box();
double volume();
~Box();
private:
double length;
double width;
double height;
};
Box::Box()
{
length = 12;
width = 2;
height = 13;
}
Box::Box(double l, double w , double h)//函数定义时的形参
{
length = l;
width = w;
height = h;
}
//上面的构造函数等价于:(第二种初始化数据成员的方法,使用参数初始化表)
//Box::Box(double l, double w, double h) :height(h), width(w), length(l){}
double Box::volume()
{
return (length*width*height) ;
}
Box::~Box()
{
cout << "体积已计算并输出"<<endl;
}
int main()
{
Box box1;
cout << box1.volume() << endl;
Box boxes(12,2.5,13);//构造函数是到参数的,则声明的对象就是带参数的
cout<<boxes .volume()<<endl;
//system("pause");
getchar();
return 0;
}
//这样析构函数的结果是一闪而过的,因为析构函数只有在函数调用结束后才释放,也就是return 0执行完之后执行,所以看不到。
//要想解决这个问题,我们可以把那一部分写到函数里,函数结束则析构函数调用,而不是放在主函数中
重点来啦。。。。析构函数
1、~+类名组成的函数叫析构函数
2、由来:如果声明了一个对象,生成时会调用构造函数分配存储空间,但是对象用完之后就没用了,如果及时清理的话,会释放内存空间,节省内存。
3、和构造函数一样,也有默认的析构函数。默认的析构函数是在对象释放前自动执行析构函数。
4、先构造的后析构,后构造的先析构
总结构造和析构的时间:
1、在全局范围内定义的对象,既不在任一个函数中的对象,它的构造函数在所有函数之前。
2、在函数中定义的对象,则在建立对象时才调用构造函数
3、静态的局部对象,只在第一次调用时调用析构函数,而且不主动释放,即只有遇到main函数和exit函数的结束才调用其析构函数。
例:
void fun()
{
Student sdt1
static Student sdt2;
}
在这个函数开始时,都调用其构造函数;
在这个函数结束时,std1被析构,而std2并不被析构。
先写到这里吧,今天星期六了,该休息了。。晚安,world~