1、1C+面向对象程序设计面向对象程序设计第第4章章 类和对象(二)类和对象(二)2C+面向对象程序设计面向对象程序设计4.1 自引用指针自引用指针this 例例 4.1 this指针的引例。指针的引例。#include class A public:A(int x1)x=x1;void disp()coutx=xendl;private:int x;main()A a(1),b(2);cout a:;a.disp();cout b:;b.disp();return 0;a.disp()与与b.disp()在存储在存储时是同一个函数,它怎么时是同一个函数,它怎么区分是区分是a调用还是调用还是b调用
2、它调用它呢?呢?3C+面向对象程序设计面向对象程序设计1什么是this指针 4C+面向对象程序设计面向对象程序设计例例4.2 显示显示this指针的值。指针的值。#includeclass A public:A(int x1)x=x1;void disp()coutnthis=thiswhen x=x;private:int x;main()A a(1),b(2),c(3);a.disp();b.disp();c.disp();return 0;5C+面向对象程序设计面向对象程序设计为了帮助大家更深一步了解this指针是如何在“幕后”工作的,我们再看一个例子。假设有一段程序如下:class a
3、bc private:char a;int b;public:void init(char ma,int mb)a=ma;b=mb;main()abs ob;ob.init(x,12);return 0;6C+面向对象程序设计面向对象程序设计 ob.init(x,12);那么C+如何使用this指针指向对象ob呢?实际上,C+在编译过程中做些了简单的工作,将上述调用init()函数的语句转换成如下形式:init(&ob,x,12);换句话说,C+把类对象作为参数传递给函数(传地址)。虽然程序中的成员函数init()没有对应的形参,但程序编译时C+将其转换成以下形式:void init(abc*
4、this,char ma,int mb)this-a=ma;this-b=mb;由于函数调用时,第一个参数是按照地址传递的,因此当对象ob调用函数init()时,this指针便指向ob,于是隐式指针this保证了成员函数init()的操作对象确实是对象ob。7C+面向对象程序设计面向对象程序设计何时显式使用this指针?(1)当需要在一个成员函数内标识被该成员函数操作的对象时,就需要显式使用this指针。8C+面向对象程序设计面向对象程序设计#include class Sample int x,y;public:Sample(int i=0,int j=0)x=i;y=j;void copy
5、(Sample&xy);void print()coutx“,”yendl;void Sample:copy(Sample&xy)if(this=&xy)return;/通过判断,避免不必要的复制 *this=xy;main()Sample p1,p2(5,6);p1.copy(p2);p1.print();9C+面向对象程序设计面向对象程序设计(2)当成员函数的形参名与该类的数据成员同名时,必须用this指针来显式区分。#include class sam int a,b;public:sam(int a,int b)this-a=a;this-b=b;coutaendl;void prin
6、t()couta=a b=bendl;main()sam s2(2,2);s2.print();return 0;10C+面向对象程序设计面向对象程序设计this指针的另外一个作用:获取对象自身。因为this指针的值是对象自身的首地址,*this 是指针所指向的对象,即当前对象。如果一个类的成员函数返回值是*this,程序就可以用这个返回值去调用另外一个成员函数。11C+面向对象程序设计面向对象程序设计【举例】#include class Classroom public:Classroom(int n=100,double l=8.0,double w=6.0);Classroom&set(
7、int n,double l,double w);void print();private:int seats;double length,width;12C+面向对象程序设计面向对象程序设计Classroom:Classroom(int n,double l,double w)seats=n0?n:100;length=l0?l:8.0;width=w0?w:6.0;Classroom&Classroom:set(int n,double l,double w)seats=n0?n:100;length=l0?l:8.0;width=w0?w:6.0;return*this;13C+面向对象
8、程序设计面向对象程序设计void Classroom:print()coutwidth meters width and length meters length,contains seats seats.endl;main()Classroom a101(80,6,4);coutClassroom a101 is;a101.print();coutset and print:endl;coutClassroom a101 is;a101.set(90,7.0,5.0).print();return 0;14C+面向对象程序设计面向对象程序设计this指针指针是一个const指针,不能在程序中
9、修改它和给它赋值是一个局部数据,它的作用域仅在一个对象内部在系统中隐含存在。一般不必特别地去使用它。15C+面向对象程序设计面向对象程序设计4.2 对象数组与对象指针 4.2.1 对象数组对象数组 所谓对象数组是指每一数组元素都是对象的数组。定义一个一维数组的格式如下:类名 数组名下标表达式;16C+面向对象程序设计面向对象程序设计 例例4.4 对象数组的应用。对象数组的应用。#includeclass exam public:void set_x(int n)x=n;int get_x()return x;private:int x;int main()exam ob4;int i;for(
10、i=0;i4;i+)obi.set_x(i);for(i=0;i4;i+)coutobi.get_x();cout”操作符。20C+面向对象程序设计面向对象程序设计 例例4.7对象指针的使用。对象指针的使用。#include class exe public:void set_a(int a)x=a;void show_a()coutxshow_a();/利用对象指针访问对象的成员 return 0;21C+面向对象程序设计面向对象程序设计2.用对象指针访问对象数组 例如将例4.7的main()改写为:main()exe ob2,*p;ob0.set_a(10);ob1.set_a(20);p
11、=ob;p-show_a();p+;p-show_a();return 0;22C+面向对象程序设计面向对象程序设计4.3 向函数传递对象 本节内容中,把对象当作普通变量理解就行了本节内容中,把对象当作普通变量理解就行了4.3.1 使用使用对象对象作为函数参数作为函数参数-值传递值传递 4.3.2 使用使用对象指针对象指针作为函数参数作为函数参数-地址传递地址传递4.3.3 使用使用对象的引用对象的引用作为函数参数作为函数参数-形参值的改变就是形参值的改变就是改变实参值改变实参值 23C+面向对象程序设计面向对象程序设计例例4.11 使用对象作为函数参数。使用对象作为函数参数。#include
12、class aClass public:aClass(int n)i=n;void set(int n)i=n;int get()return i;private:int i;void sqr(aClass ob)ob.set(ob.get()*ob.get();coutcopy of obj has i value of;coutob.get()n;main()aClass obj(10);sqr(obj);coutobj.i is unchanged in main:;coutobj.get()endl;return 0;24C+面向对象程序设计面向对象程序设计【例】对象指针作函数参数示例
13、。#include iostreaminclude.h class M class M public:public:M()x=y=0;M()x=y=0;M(int i,int M(int i,int j)j)x=i;y=j;x=i;y=j;void copy(M*m);void setxy(int i,int j)x=i;y=j;void print()coutx“,”yx;y=m-y;void fun(M m1,M*m2);/一般函数说明一般函数说明 main()M p(5,7),q;/定义对象定义对象 q.copy(&p);fun(p,&q);p.print();q.print();以p对
14、象的地址为实参26C+面向对象程序设计面向对象程序设计 void fun(M m1,M*m2)/一般函数定义一般函数定义 m1.setxy(12,15);m2-setxy(22,25);实参形参 形参pqm1m2 实参5 70 05 720082008过程调用中5 7200820085 75 75 722 25过程调用后27C+面向对象程序设计面向对象程序设计例例4.12 使用对象指针作为函数参数。使用对象指针作为函数参数。#includeclass aClass public:aClass(int n)i=n;void set(int n)i=n;int get()return i;priv
15、ate:int i;void sqr(aClass *ob)ob-set(ob-get()*ob-get();coutCopy of obj has i value of;coutget()n;main()aClass obj(10);sqr(&obj);coutobj.i in main has been changed:;coutobj.get()n;return 0;28C+面向对象程序设计面向对象程序设计例例4.13使用对象引用作为函数参数。使用对象引用作为函数参数。#includeclass aClass public:aClass(int n)i=n;void set(int n)
16、i=n;int get()return i;private:int i;void sqr(aClass&ob)ob.set(ob.get()*ob.get();coutCopy of obj has i value of;coutob.get()n;main()aClass obj(10);sqr(obj);coutobj.i in main()has been changed:;coutobj.get()n;return 0;29C+面向对象程序设计面向对象程序设计例例#include class M public:M()x=y=0;M(int I,int j)x=I;y=j;void co
17、py(M&m);void setxy(int i,int j)x=I;j=j;void print()coutx“,”yendl;private:int x,y;30C+面向对象程序设计面向对象程序设计void M:copy(M&m)/成员函数定义成员函数定义 x=m.x;y=m.y;void fun(M m1,M&m2);/一般函数说明一般函数说明void main()M p(5,7),q;/定义对象定义对象 q.copy(p);fun(p,q);p.print();q.print();void fun(M m1,M&m2)/一般函数定义一般函数定义 m1.setxy(12,15);m2.s
18、etxy(22,25);31C+面向对象程序设计面向对象程序设计实参形参 形参pqm1m2 实参5 70 05 7过程调用中5 75 75 75 722 25过程调用后32C+面向对象程序设计面向对象程序设计4.4 静态成员 4.4.1 静态数据成员静态数据成员 在一个类中在一个类中,若将一个数据成员说明为若将一个数据成员说明为static,这种成员称为静态数据成员。这种成员称为静态数据成员。与一般的数据成员不同与一般的数据成员不同,无论建立多少个无论建立多少个类的对象类的对象,都只有一个静态数据的拷贝。从而都只有一个静态数据的拷贝。从而实现了同一个类的不同对象之间的数据共享实现了同一个类的不
19、同对象之间的数据共享。定义静态数据成员的格式如下定义静态数据成员的格式如下:static 数据类型数据类型 数据成员名数据成员名;33C+面向对象程序设计面向对象程序设计例例4.15静态数据成员的使用引例。静态数据成员的使用引例。#include#includeclass Student public:Student(char*name1,char*stu_no1,float score1);Student();void show();/输出姓名、学号和成绩输出姓名、学号和成绩 void show_count_sum_ave();/输出人数、总成绩和平均成绩输出人数、总成绩和平均成绩 priv
20、ate:char*name;/学生姓名学生姓名 char*stu_no;/学生学号学生学号 float score;/学生成绩学生成绩 static int count;/统计学生人数统计学生人数 static float sum;/统计总成绩统计总成绩 static float ave;/统计平均成绩统计平均成绩;34C+面向对象程序设计面向对象程序设计Student:Student(char*name1,char*stu_no1,float score1)name=new charstrlen(name1)+1;strcpy(name,name1);stu_no=new charstrle
21、n(stu_no1)+1;strcpy(stu_no,stu_no1);score=score1;+count;/累加学生人数累加学生人数 sum=sum+score;/累加总成绩累加总成绩 ave=sum/count;/计算平均成绩计算平均成绩 Student:Student()delete name;delete stu_no;-count;sum=sum-score;35C+面向对象程序设计面向对象程序设计void Student:show()coutn name:name;coutn stu_no:stu_no;coutn score:score;void Student:show_c
22、ount_sum_ave()coutn count:count;/输出静态数据成员输出静态数据成员count coutn sum:sum;/输出静态数据成员输出静态数据成员sum coutn ave:ave;/输出静态数据成员输出静态数据成员aveint Student:count=0;/静态数员静态数员count初始化初始化float Student:sum=0.0;/静态数员静态数员sum初始化初始化float Student:ave=0.0;/静态数员静态数员ave初始化初始化36C+面向对象程序设计面向对象程序设计void main()Student stu1(Liming,99020
23、1,90);stu1.show();stu1.show_count_sum_ave();Student stu2(Zhanghao,990202,85);stu2.show();stu2.show_count_sum_ave();1、静态变量属于类,为类创建的所有对象所公用。、静态变量属于类,为类创建的所有对象所公用。2、类中的非静态变量,在类创建对象时,不同的对、类中的非静态变量,在类创建对象时,不同的对象拥有各自的变量存储空间。象拥有各自的变量存储空间。3、静态变量可以实现同一类中不同对象间的数据共、静态变量可以实现同一类中不同对象间的数据共享。享。37C+面向对象程序设计面向对象程序设计
24、有关静态成员变量的语法规定静态成员变量要用静态成员变量要用static声明。声明。静态成员变量的初始化要在类外单独进行,而且要在对象定义之前,静态成员变量的初始化要在类外单独进行,而且要在对象定义之前,一般在类定义之后、一般在类定义之后、main()之前初始化。之前初始化。初始化的格式:初始化的格式:数据类型数据类型 类名类名:静态数据成员名静态数据成员名=值值;如如 int Student:count=0;注意:初始化时数据成员名前面不加注意:初始化时数据成员名前面不加static。静态成员变量属于类,公有的静态成员变量可以用静态成员变量属于类,公有的静态成员变量可以用 类名类名:静态数成静
25、态数成员名员名 的方式在类外直接调用。(也可通过的方式在类外直接调用。(也可通过对象对象调用,私有的静态成调用,私有的静态成员变量不能在类外调用。)员变量不能在类外调用。)与普通静态变量一样,在编译时创建并初始化。在该类的任何对象与普通静态变量一样,在编译时创建并初始化。在该类的任何对象被建立之前就已经存在。被建立之前就已经存在。静态成员变量实际代替了全局变量的作用。静态成员变量实际代替了全局变量的作用。38C+面向对象程序设计面向对象程序设计例4.16公有静态数据成员的访问。#include class myclasspublic:static int i;int geti()return
26、i;int myclass:i=0;main()myclass:i=200;myclass ob1,ob2;coutob1.i=ob1.geti()endl;coutob2.i=ob2.geti()endl;ob1.i=300;coutob1.i=ob1.geti()endl;coutob2.i=ob2.geti()endl;return 0;39C+面向对象程序设计面向对象程序设计4.17静态数据成员和一般数据成员的不同。#include class Studentpublic:Student()+count;StudentNo=count;void print()coutstudentSt
27、udentNo;coutcount=countendl;private:static int count;int StudentNo;int Student:count=0;main()Student student1;student1.print();cout-静态成员函数名静态成员函数名(实参表实参表)41C+面向对象程序设计面向对象程序设计例例4.18静态成员函数来访问静态数据成员。静态成员函数来访问静态数据成员。#include#includeclass Student private:char*name;/学生姓名学生姓名 char*stu_no;/学生学号学生学号float sco
28、re;/学生成绩学生成绩static int count;/静态数据成员静态数据成员,统计学生人数统计学生人数 static float sum;/静态数据成员静态数据成员,统计总成绩统计总成绩 public:Student(char*name1,char*stu_no1,float score1);Student();void show();/普通成员函数普通成员函数,输出姓名、学号和成绩输出姓名、学号和成绩static void show_count_sum();/静态成员函数静态成员函数,输出学生人数和总成绩输出学生人数和总成绩;42C+面向对象程序设计面向对象程序设计Student:S
29、tudent(char*name1,char*stu_no1,float score1)name=new charstrlen(name1)+1;strcpy(name,name1);stu_no=new charstrlen(stu_no1)+1;strcpy(stu_no,stu_no1);score=score1;+count;/累加学生人数累加学生人数 sum=sum+score;/累加总成绩累加总成绩 Student:Student()delete name;delete stu_no;-count;sum=sum-score;43C+面向对象程序设计面向对象程序设计void Stu
30、dent:show()coutn name:name;coutn stu_no:stu_no;coutn score:score;void Student:show_count_sum()/静态成员函数静态成员函数 coutn count:count;/输出静态数据成员输出静态数据成员 coutn sum:sum;/输出静态数据成员输出静态数据成员int Student:count=0;/静态数据成员初始化静态数据成员初始化float Student:sum=0.0;/静态数据成员初始化静态数据成员初始化44C+面向对象程序设计面向对象程序设计void main()Student stu1(L
31、iming,990201,90);stu1.show();Student:show_count_sum();/使用类名访问使用类名访问 静态成员函数静态成员函数 Student stu2(Zhanghao,990202,85);stu2.show();stu2.show_count_sum();/使用对象使用对象stu2访问访问 静态成员函数静态成员函数 45C+面向对象程序设计面向对象程序设计 有关静态成员函数可以定义成内嵌的,也可类外定义,类外定义时可以定义成内嵌的,也可类外定义,类外定义时不要不要static。一般用来访问全局变量或同一类中的静态变量。一般用来访问全局变量或同一类中的静态
32、变量。私有静态成员函数不能被类外部函数和对象访问私有静态成员函数不能被类外部函数和对象访问使用静态成员函数可以在创建对象之前处理静态使用静态成员函数可以在创建对象之前处理静态数据成员,这是普通函数所不能实现的功能。数据成员,这是普通函数所不能实现的功能。静态成员函数没有静态成员函数没有this指针。一般不访问类中的非指针。一般不访问类中的非静态成员静态成员(变量、函数变量、函数),访问时,要把对象作为参,访问时,要把对象作为参数传递。数传递。46C+面向对象程序设计面向对象程序设计例4.19静态成员函数访问非静态数据成员。#include class small_catpublic:small
33、_cat(double w)weight=w;total_weight+=w;total_number+;static void display(small_cat&w)coutThe small_cat weights w.weightkgn;static void total_disp()couttotal_number small_cat total weight;couttotal_weight kg endl;private:double weight;static double total_weight;static double total_number;47C+面向对象程序设计
34、面向对象程序设计double small_cat:total_weight=0;double small_cat:total_number=0;main()small_cat w1(0.9),w2(0.8),w3(0.7);small_cat:display(w1);small_cat:display(w2);w1.display(w3);w3.total_disp();return 0;48C+面向对象程序设计面向对象程序设计4.5 友 元 友元既可以是不属于任何类的一般函数友元既可以是不属于任何类的一般函数,也可以是另一个类的成员函数也可以是另一个类的成员函数,还可以是整个还可以是整个的类
35、。的类。49C+面向对象程序设计面向对象程序设计4.5.1 友元函数 友元函数不是当前类的成员函数友元函数不是当前类的成员函数,而是独立于而是独立于当前类的外部函数当前类的外部函数,但它可以访问该类的所有对象的但它可以访问该类的所有对象的成员成员,包括私有成员、保护成员和公有成员。包括私有成员、保护成员和公有成员。1.将非成员函数声明为友元函数将非成员函数声明为友元函数 50C+面向对象程序设计面向对象程序设计例例4.22 友元函数的使用。友元函数的使用。#include#includeclass girl public:girl(char*n,int d)name=new charstrle
36、n(n)+1;strcpy(name,n);age=d;girl()delete name;friend void disp(girl&);/声明友元函数声明友元函数 private:char*name;int age;void disp(girl&x)/定义友元函数定义友元函数 coutGirls name is x.name,age:x.agen;void main()girl e(Chen Xinwei,18);disp(e);/调用友元函数调用友元函数 友元函数没有友元函数没有this指指针!针!51C+面向对象程序设计面向对象程序设计一个函数可以定义为多个类的友元函数。一个函数可以定
37、义为多个类的友元函数。【例【例4.19】(】(110页)页)52C+面向对象程序设计面向对象程序设计2.将成员函数声明为友元函数 一个类的成员函数也可以作为另一个类的一个类的成员函数也可以作为另一个类的友元友元,这种成员函数不仅可以访问自己所在类这种成员函数不仅可以访问自己所在类对象中的所有成员对象中的所有成员,还可以访问还可以访问friend声明语声明语句所在类对象中的所有成员。句所在类对象中的所有成员。这样能使两个类相互合作、协调工作这样能使两个类相互合作、协调工作,完完成某一任务。成某一任务。53C+面向对象程序设计面向对象程序设计 例例4.24 一个类的成员函数作为另一个类的友元。一个
38、类的成员函数作为另一个类的友元。#include#include class girl;class boy public:boy(char*n,int d)name=new charstrlen(n)+1;strcpy(name,n);age=d;void disp(girl&);/声明声明disp()为类为类boy的成员函数的成员函数 boy()delete name;private:char*name;int age;class girl public:girl(char*n,int d)name=new charstrlen(n)+1;strcpy(name,n);age=d;frien
39、d void boy:disp(girl&);girl()delete name;private:char*name;int age;54C+面向对象程序设计面向对象程序设计 void boy:disp(girl&x)/定义友元函数定义友元函数disp()coutBoys name is name,age:agen;/访问访问boy类对象的成员类对象的成员 coutGirls name is x.name,age:x.agen;/访问访问girl类对象的成员类对象的成员 void main()boy b(Chen Hao,25);girl e(Zhang Wei,18);b.disp(e);程
40、序运行结果如下程序运行结果如下:Boys name is Chen Hao,age:25 Girls name is:Zhang Wei,age:18 类的成员函数作为另一类的友元时,类的成员函数作为另一类的友元时,该类应该先定义该类应该先定义55C+面向对象程序设计面向对象程序设计4.5.2 友元类 一个类也可以作为另一个类的友元。一个类也可以作为另一个类的友元。例如例如:class Y class Y /;class X class X /friend Y;/friend Y;/声明类声明类Y Y为类为类X X的友元类的友元类 /;一个类被声明为另一个类一个类被声明为另一个类的友元时,它的
41、所有成员的友元时,它的所有成员函数都成为另一个类的友函数都成为另一个类的友元函数。元函数。56C+面向对象程序设计面向对象程序设计【例】友元类的示例。#include class Sample int x;public:Sample(int a)x=a;friend class Operation;/把类Operation当作友元(好朋友);57C+面向对象程序设计面向对象程序设计class Operationpublic:int add(Sample&s1,Sample&s2)return s1.x+s2.x;int subtract(Sample&s1,const Sample&s2)re
42、turn s1.x-s2.x;int main()Sample s1(10),s2(6);Operation obj;coutobj.add(s1,s2)endl;coutobj.subtract(s1,s2)endl;return 0;58C+面向对象程序设计面向对象程序设计4.6 类的组合 如果一个类的对象是另一个类的数据成员如果一个类的对象是另一个类的数据成员,则称则称这样的数据成员为对象成员(子对象)。例如这样的数据成员为对象成员(子对象)。例如:class A class A /./.;class B class B A a;/A a;/类类A A的对象的对象a a为类为类B B的对
43、象成员的对象成员 public:public:/;使用对象成员要注意的问题是对象成员的初始化使用对象成员要注意的问题是对象成员的初始化问题问题,即即类类B B的构造函数如何定义的构造函数如何定义?59C+面向对象程序设计面向对象程序设计例如有以下的类例如有以下的类:class Xclass X 类名类名1 1 对象成员名对象成员名1;1;类名类名2 2 对象成员名对象成员名2;2;类名类名n n 对象成员名对象成员名n;n;一般来说一般来说,类类X X的构造函数的定义形式为的构造函数的定义形式为;X:X(X:X(形参表形参表0):0):对象成员名对象成员名1(1(形参表形参表1),1),对象成
44、员名对象成员名i(i(形参表形参表i),i),对象成员名对象成员名n(n(形参表形参表n)n)/构造函数体构造函数体 60C+面向对象程序设计面向对象程序设计练习:写出程序的运行结果练习:写出程序的运行结果#includeclass Object int val;public:Object();/构造函数Object(int i);/构造函数Object();/析构函数;61C+面向对象程序设计面向对象程序设计Object:Object()/默认构造函数 val=0;coutn Default constructor for Object.n;Object:Object(int i)/构造函数
45、定义构造函数定义 val=i;coutn Constructor for Object:valendl;Object:Object()/析构函数定义析构函数定义 coutn Destructor for Object:valendl;62C+面向对象程序设计面向对象程序设计class Container/定义新类,它含Object的对象 private:int date;Object one;/对象成员Object two;/对象成员 public:Container();/构造函数Container(int i,int j,int k);/构造函数Container();/析构函数;63C+
46、面向对象程序设计面向对象程序设计Container:Container()/默认构造函数定义 date=0;coutn Default constructor for Container.n;Container:Container(int i,int j,int k):two(i),one(j)date=k;coutn Constructor for Container.n;Container:Container()coutn Destructor for Container.n;int main()/主程序 coutn.Entering main.n;Container obj(5,6,10
47、);coutn.Exiting main.n;return 0;64C+面向对象程序设计面向对象程序设计4-7 共享数据的保护 4.7.1 常引用 如果在说明引用时用const修饰,则被说明的引用为常引用。常引用的说明形式如下:const 类型说明符&引用名例如:int a=5;const int&b=a;其中,b是一个常引用,它所引用的对象不允许更改。65C+面向对象程序设计面向对象程序设计例例4.28 常引用作函数形参。常引用作函数形参。#includeint add(const int&i,const int&j);void main()int a=20;int b=30;couta+b
48、=add(a,b)endl;int add(const int&i,const&j)return i+j;66C+面向对象程序设计面向对象程序设计4.7.2 常对象 如果在说明对象时用如果在说明对象时用constconst修饰修饰,则被说则被说明的对象为常对象。明的对象为常对象。常对象的说明形式如下常对象的说明形式如下:类名类名 const const 对象名对象名(参数表参数表););或者或者 const const 类名类名 对象名对象名(参数表参数表););在定义对象时必须进行初始化在定义对象时必须进行初始化,而且不而且不能被更新。能被更新。67C+面向对象程序设计面向对象程序设计例例4
49、.29 4.29 非常对象和常对象的比较。非常对象和常对象的比较。#includeiostream#include.h class Sample class Sample public:public:int int m;m;Sample(int i,int Sample(int i,int j)m=i;n=j;j)m=i;n=j;void setvalue(int void setvalue(int i)n=i;i)n=i;void disply()coutm=mendl void disply()coutm=mendl;coutn=nendl coutn=nendl;private:priv
50、ate:int int n;n;void main()void main()Sample a(10,20);a.setvalue(40);Sample a(10,20);a.setvalue(40);a.m=30;a.disply a.m=30;a.disply();();68C+面向对象程序设计面向对象程序设计4.7.3 常对象成员 1.常数据成员常数据成员 使用使用const说明的数据成员称为常数据成说明的数据成员称为常数据成员。员。如果在一个类中说明了常数据成员如果在一个类中说明了常数据成员,那那么构造函数就只能通过初始化列表对该数么构造函数就只能通过初始化列表对该数据成员进行初始化据成