【类和对象】classTime{public:inthour;intminute;intsec;voidset(){cin>>a>>b>>c;}};可以用下面的语句来输出该类对象所占用的位元组数:cout<<sizeof(Time)<<endl;输出的值是12 。这就证明了一个对象所占的空间大小只取决于该对象中数据成员所占的空间,而与成员函式无关 。函式代码是存储在对象空间之外的 。如果对同一个类定义了10个对象,这些对象的成员函式对应的是同一个函式代码段,而不是10个不同的函式代码段 。需要注意的是: 虽然调用不同对象的成员函式时都是执行同一段函式代码,但是执行结果一般是不相同的 。不同的对象使用的是同一个函式代码段,它怎幺能够分别对不同对象中的数据进行操作呢?原来C++为此专门设立了一个名为this的指针,用来指向不同的对象 。需要说明:(1) 不论成员函式在类内定义还是在类外定义,成员函式的代码段都用同一种方式存储 。(2) 不要将成员函式的这种存储方式和inline(内置)函式的概念混淆 。(3) 应当说明: 常说的“某某对象的成员函式”,是从逻辑的角度而言的,而成员函式的存储方式,是从物理的角度而言的,二者是不矛盾的 。成员引用运算访问成员例如在程式中可以写出以下语句:stud1.num=1001;//假设num已定义为公用的整型数据成员表示将整数1001赋给对象stud1中的数据成员num 。其中“.”是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员 。注意不能只写成员名而忽略对象名 。访问对象中成员的一般形式为对象名.成员名不仅可以在类外引用对象的公用数据成员,而且还可以调用对象的公用成员函式,但同样必须指出对象名,如stud1.display( );//正确,调用对象stud1的公用成员函式display( );//错误,没有指明是哪一个对象的display函式由于没有指明对象名,编译时把display作为普通函式处理 。应该注意所访问的成员是公用的(public )还是私有的(private ) 。只能访问public成员,而不能访问private成员,如果已定义num为私有数据成员,下面的语句是错误的:stud1.num=10101;//num是私有数据成员,不能被外界引用在类外只能调用公用的成员函式 。在一个类中应当至少有一个公用的成员函式,作为对外的接口,否则就无法对对象进行任何操作 。指向访问成员class Time{public : //数据成员是公用的int hour;int minute;};Time t,*p;//定义对象t和指针变数pp=&t;//使p指向对象tcout<<p->hour;//输出p指向的对象中的成员hour在p指向t的前提下,p->hour,(*p).hour和t.hour三者等价 。对象访问成员如果为一个对象定义了一个引用变数,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已 。因此完全可以通过引用变数来访问对象中的成员 。如果已声明了Time类,并有以下定义语句:Time t1; //定义对象t1Time &t2=t1;//定义Time类引用变数t2,并使之初始化为t1cout<<t2.hour;//输出对象t1中的成员hour由于t2与t1共占同一段存储单元(即t2是t1的别名),因此t2.hour就是t1.hour 。套用举例例1最简单的例子 。#include<iostream>usingnamespacestd;classTime//定义Time类{public://数据成员为公用的inthour;intminute;intsec;};intmain(){Timet1;//定义t1为Time类对象cin>>t1.hour;//输入设定的时间cin>>t1.minute;cin>>t1.sec;//输出时间:cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;return0;} 运行情况如下: 1232 43↙12:32:43注意:(1) 在引用数据成员hour,minute,sec时不要忘记在前面指定对象名 。(2) 不要错写为类名,如写成Time.hour,Time.minute,Time.sec是不对的 。因为类是一种抽象的数据类型,并不是一个实体,也不占存储空间,而对象是实际存在的实体,是占存储空间的,其数据成员是有值的,可以被引用的 。(3) 如果删去主函式的3个输入语句,即不向这些数据成员赋值,则它们的值是不可预知的 。例2引用多个对象的成员 。(1)程式(a)#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Timet1;//定义对象t1cin>>t1.hour;//向t1的数据成员输入数据cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;//输出t1中数据成员的值Timet2;//定义对象t2cin>>t2.hour;//向t2的数据成员输入数据cin>>t2.minute;cin>>t2.sec;cout<<t2.hour<<″:″<<t2.minute<<″:″<<t2.sec<<endl;//输出t2中数据成员的值return0;}运行情况如下:103243↙10:32:43223243↙22:32:43程式是清晰易懂的,但是在主函式中对不同的对象一一写出有关操作,会使程式冗长 。为了解决这个问题,可以使用函式来进行输入和输出 。见程式(b) 。(2)程式(b)#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){voidset_time(Time&);//函式声明voidshow_time(Time&);//函式声明Timet1;//定义t1为Time类对象set_time(t1);//调用set_time函式,向t1对象中的数据成员输入数据show_time(t1);//调用show_time函式,输出t1对象中的数据Timet2;//定义t2为Time类对象set_time(t2);//调用set_time函式,向t2对象中的数据成员输入数据show_time(t2);//调用show_time函式,输出t2对象中的数据return0;}voidset_time(Time&t)//定义函式set_time,形参t是引用变数{cin>>t.hour;//输入设定的时间cin>>t.minute;cin>>t.sec;}voidshow_time(Time&t)//定义函式show_time,形参t是引用变数{cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;//输出对象中的数据}
- 试行 国家税务总局关于发布《煤炭资源税徵收管理办法》?
- 大学英语4级真题考点精解
- 龙珠时间
- 三江平原湿地
- 三花茶 三花茶
- 我还是一样的爱着你
- 白马王子的春天
- 东风悦达起亚新KX3
- 2018年俄罗斯世界盃会徽
- 小儿郎认知卡:拼音卡片