类和对象第二讲
还是用程序说明:
#include <iostream>
using namespace std;
class time
{
public:
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};
void time::set_time()
{
cin>>hour>>minute>>sec;
}
void time::show_time()
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
int main()
{
time t1;
t1.set_time();
t1.show_time();
return 0;
}
注意:
(1)在主函数中调用两个成员函数时,应该指明对象(t1)。
(2)在类外定义函数时,应该指明函数的作用域(如void time::set_time())。也可以显式的写出类名并使用域运算符:
void time ::show_time()
{
cout<<time::hour<<":"<<time::minute<<":"<<time::sec<<endl;
}
(3)还应该注意区分什么场合用域运算符“::”,什么时候用成员运算符“.”。
例:用类和对象的方法求十个数中的最大值
#include <iostream>
using namespace std;
class qiu_max
{
public:
void set_num();
void max_num();
void show_num();
private:
int a[10];
int max;
};
void qiu_max::set_num()
{
for(int i=0;i<10;i++)
{
cin>>a[i];
}
}
void qiu_max::max_num()
{
max=a[0];
for(int i=0;i<10;i++)
{
if(max<a[i])
{
max=a[i];
}
}
}
void qiu_max::show_num()
{
cout<<"max="<<max<<endl;
}
int main()
{
qiu_max m1;
m1.set_num();
m1.max_num();
m1.show_num();
return 0;
}
需要注意的是成员函数定义与调用成员函数的关系,定义成员函数只是设计了一组操作代码,并未实际执行,只有在被调用时才真正地执行这一组操作。
类的封装性和信息隐蔽
类的作用是把数据和算法封装在用户声明的抽象数据类型中。把需要让外界条用的成员函数指定为公用的,外界通过公用的函数来实现对数据的操作。外界与对象唯一的联系渠道就是调用公用的成员函数。
构造函数。
首先较少为何要引入构造函数这个名词,因为类的数据成员是不能在声明类时初始化的。例如:
class time
{
hour=0;
minute=0
sec=0;
};
这是错误的,以为类并不是一个实体,而是一种抽象的类型,不占存储空间,所以无处容乃数据。
如果一个类中所用的成员都是公用的,则可以在定义对象时对数据成员进行初始化。如:
class time
{
public:
hour;
minute;
sec;
};
time t1={1,2,3}; //将t1初始化为1:2:3
简单的构造函数:
#include <iostream>
using namespace std;
class myclass
{
public:
myclass()
{
hour=0;
minute=0;
sec=0;
}
void set_myclass();
void show_myclass();
private:
int hour;
int minute;
int sec;
};
void myclass::set_myclass()
{
cin>>hour>>minute>>sec;
}
void myclass::show_myclass()
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
int main()
{
myclass t1,t2;
t1.set_myclass();
t1.show_myclass();
t2.show_myclass();
return 0;
}
当然了,也可以在类中声明构造函数,在类外定义构造函数。
在类中写:myclass();
在类外写:
myclass::myclass() //在类外定义构造函数成员函数,要加上类名myclass和域限定符“::”
{
hour=0;
minute=0;
sec=0;
}
构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户调用它,而是在建立对象时自动执行。构造函数的名字必须和类名同名,不能自己指定。它不具备任何类型,不返回任何值。
有关构造函数的使用:
(1)什么时候调用构造函数呢?在类对象进入其作用域时调用构造函数。
(2)构造函数没有返回值。
(3)构造函数不需用户调用,也不能被用户调用。
(4)在构造函数的函数体重不仅可以对数据成员赋初值,而且也可以包含其他语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰。
(5)如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。