C++课件第7 章类与对象.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C++课件第7 章类与对象.pdf》由会员分享,可在线阅读,更多相关《C++课件第7 章类与对象.pdf(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 7 章类与对象7.1 类与对象的定义与使用一、类和对象的定义类可以理解为用户定义的数据类型,而“int”和“double”是系统定义的简单数据类型。变量是简单数据类型的实例,对象是类的实例。一个对象由几个简单数据类型的变量,和几个函数,封装在一起组成。把数据和函数封装在一起组成对象,是面向对象技术的基本特征。用成员访问符访问对象中的成员。也可以用指向对象的指针访问,此时”(*p).a”等效于例:复数类class complex(private:复数的实部和虚部double real;double image;public:void set(double r,double i)共有函数成员,
2、设定复数值(real=r;image=i;)void dislayO 输出复数值(coutreal,+M im ag e,i,endl;);void main()(complex x,y,*p;x.set(l,3);调用对象x 的成员函数,设定复数值y.set(3,5);x.dislayO;y.dislayO;p=&x;(*p).set(6,6);p-dislay();coutx.real;错误,私有成员只能被complex类的成员函数访问,不能被main函数访问注意:1.定义类时,用关键字“publicprivate”protected”来表示各数据成员和函数成员的访问权限。公有权限的成员,
3、在程序的任何位置都可以被访问:私有和保护权限的成员,只有本类(不是本对象)的成员函数可以访问。2.用关键字“class”和“struct”都可以定义类,区别在于,不指定访问权限的情况下,“struct”默认公有,包括公有成员和公有继承;“class”默认私有,包括私有成员和私有继承。3.类的定义只是说明了 组对象的共同特征,所以类定义中说明的数据成员并不是具体的变量,没有分配内存空间,也不能赋初值。定义对象的时候,才会把类实例化,对象的数据成员有对应的内存空间。4.类定义结尾有分号二、定义对象的其他方法I.定义类的同时定义对象class complex(private:复数的实部和虚部doub
4、le real;double image;public:void set(double r,double i)共有函数成员,设定复数值(real=r;image=i;)void dislay()输出复数值(coutreal+im ageiendl;)x,y;定义类以后立刻定义了对象,因为类定义是放在全局位置,这里的“x”和“尸两个对象也是全局变量。2.不出现类名定义对象class(private:复数的实部和虚部double real;double image;public:void set(double r,double i)共有函数成员,设定复数值real=r;image=i;void d
5、islayO 输出复数值coutreal,+im age,i,endl;x,y;因为类没有名字,以后不能再定义该类的对象,这个类只有“x”和“y”两个对象。三、定义类时,可以把成员函数的实现代码放到类外class complex(private:double real;double image;public:void set(double r,double i);void dislayO;);void complex:set(double redouble i)(real=r;image=i;)void complex:dislay()(coutreal+im ageiendl;)注:L:“是
6、作用域操作符,函数名前加“complex:表示“set”和“dislay”函数是类“complex”的成员函数。2.当类的成员函数实现代码写在类内部时,这个函数被默认定义成内联函数。实现代码写在类外部的函数,要想定义成内联函数,需加关键字“inline”。7.2 类的特殊成员一、this指针在对象调用自己的非静态成员函数时,会自动传给成员函数一个指针参数“this”,这个指针指向该对象自己。该参数是隐含的不可见,在被调用的成员函数内,出现的所有本类成员前都隐含的加上“this-”,也可以显式使用this指针。例:class complexprivate:double real;double i
7、mage;public:void set(double r,double i)(this-real=r;this-image=i;)void display()(coutreal,+,im ag e,iendl;);void main()(complex x,y;x.set(l,3);x.displayO;y.set(3,5);y.display();)注:“set”函数把this指针显式写出了,和原先效果-样。this指针使得对象能够访问自己的成员。二、静态成员类的静态成员属于类本身,而不属于具体的某个对象,所以一个类静态成员只有一个数据拷贝。类的静态数据成员是在类定义语句被执行时即创建,所
8、以是静态生存期,与对象的创建和注销无关。定义方法:在类成员定义中加关键字“static”,然后在类外为静态数据成员分配内存空间并初始化。调用方法:内部,任何成员函数都可以直接调用;外部,用任何一个该类成员调用,或者用类 名 加“直接调用。例:class complex(private:double real;double image;public:static int sum;void set(double r,double i)real=r;image=i;sum+;用静态成员统计set函数的调用次数)void displayO(coutreal+im ageiendl;);int comp
9、lex:sum=0;void main()(complex x,y;x.set(l,3);y.set(3,5);coutx.sum;coutcomplex:sum;)注:也可以定义静态函数成员。静态成员函数的特点是,不会自动传递this指针,所以静态成员函数一般专用于处理静态数据成员。三、友元在类中可以指定另个类或别的函数为自己的友元。友元和类内部成员函数的访问权限相同,即友元可以访问类的所有成员。例:class complex(friend void set(double r,double i,complex*p);声明了一个友元函数friend class c;声明了类c 是类comple
10、x的友元friend void b:fl();声明了类b 的成员函数f l 是友元函数private:double real;double image;public:void displayO(coutreal+im ageninendl;);void set(double r,double i,complex*p)(p-real=r;p-image=i;void main()(complex x;set(l,3,&x);x.display();)注意:1.友元函数并不是类的一个成员,而是单独的一个外部函数。友元函数要访问类的成员,需要利用对象指针等参数,指定要访问的是哪个对象的成员。2.如果
11、指定类b 是 类 a 的友元类,则类b 中的所有成员函数都可以任意访问类a 的成员。但是反过来类a 并不是类b 的友元,不能任意访问类b 的成员。四、常量成员和对象成员类中的数据成员是常量或者另个类的对象的情况。例:class B(int s;);class A(B x;const int y;);注意:定义类的时候不能给常量成员指定初值,常量成员是属于对象的,每个对象的同名常量成员可以取不同的值。五、构造函数1.因为对象定义后在外部无法访问私有的成员,所以用个特殊的成员函数,构造函数给对象初始化。当系统新定义一个对象时.,会自动调用构造函数。构造函数名字与类名相同,没有返回值类型,可以重载,
12、应设置为公有权限。如果没有定义任何构造函数,系统会自动产生一个默认构造函数,这个默认函数没有参数并且什么也不做。如果自定义了构造函数,系统就不会自动产生默认构造函数,注意这时不带参数定义对象可能就会出错。例:class complex(private:double real;double image;public:complex(double r,double i)构造函数(real=r;image=i;)void set(double r,double i)(real=r;image=i;)void display()(coutreal,+,im ag e,iendl;);void main
13、()(complex x(l,3),y(3,4);通过构造函数初始化complex z;错误,此时已经没有自动生成的无参构造函数了x.displayO;y.set(3,5);y.displayO;)注:构造函数如果要求参数,定义对象时必须用括号加上初始化参数。构造函数不要求参数,定义时对象名后不加括号。构造函数的参数可以带上默认值。例:class complex(private:double real;double image;public:complex(double r=0,double i=0)构造函数(real=r;image=i;);void main()(complex x;构造函
14、数默认参数,复数为0complex y(3,4);2.冒号初始化列表C+允许构造函数在冒号后加成员初始化列表,列表中用括号给出初始化参数。初始化列表中列出的数据成员初始化的顺序,按照类的声明中这些成员出现的顺序进行,不是按照初始化列表中出现的顺序。一般初始化列表中的顺序应和声明的顺序一致。类的对象成员,类的常量成员,对象继承,引用型的参数,这些情况下都必须使用初始化列表。对于有构造函数的数据成员,用初始化列表效率较高。例:class complexprivate:double real;double image;public:complex(double r=0,double i=O):rea
15、l(r),image(i);void main()(complex x;complex y(3,4);例:class clpublic:cl(int i=0):a(i)int a;);class c2public:c2(int i=O):t(5),a(b+l),b(i)cl t;const int b;int a;);void main()(c2 x,y(3);coutx.ay.a;)3.构造函数中开辟动态空间在类中有一个指针成员,这个指针用来挂载动态申请的存储空间。例:class person(private:char*name;int age;public:person(int a,cha
16、r*p=nonamen);void display()(coutname:n n a m e u age:ageendl;);person:person(int a,char*p):age(a)(name=new charstrlen(p)+l;strcpy(name,p);)void main()(char t20;int a;person x(18,tom);cout请输入名字”;cint;coutvv请输入年龄”;cina;person y(a,t);x.displayO;y.display();六、析构函数析构函数用来在对象注销之前执行一些操作,特别是释放动态开辟的内存空间等操作。析
17、构 函 数 名 字 是 类 名 前 加 没 有 返 回 值 类 型,一个类只有一个析构函数,不可以重载,没有参数,应设置为公有权限。例:class personprivate:char*name;ini age;public:person(int a,char*p=nnonamen):age(a)(name=new charstrlen(p)+1;strcpy(name,p);)person()(delete name;)void display()(coutuname:n am en age:uageendl;七、转换构造函数1.如果构造函数可以只带一个参数,这个构造函数就是隐式定义的类型转
18、换构造函数,可以把这个参数的数据类型转换为该类得类型。定义过转换构造函数后,系统会在必要时自动调用进行隐式类型转换,包括赋值、表达式计算、参数传递等。例:重载复数类的构造函数class complex(private:double real;double image;public:void set(double r,double i)(real=r;image=i;)void displayO(coutreal,+,iTnage,i,endl;complex(double redouble i)real=r;image=i;)complex(double x):real(x),image(x)
19、转换构造函数);void main()(complex x(2,3);complex y(4);y=6;x.displayO;y.display();2.显示定义的转换函数,用 operator加类型名,重载成成员函数,无返回值类型。可以把对象转换成其他类型。例:class complex(private:double real;double image;public:void set(double redouble i)(real=r;image=i;)void displayO(coutreal+,im ag e,iendl;)complex(double r,double i):real
20、(r),image(i)operator double。转换函数(double t;t=real+image;return t;);void main()complex x(2,3);double a;a=x;coutaendl;x.displayO;八、拷贝构造函数1.根据现有对象,创建一个相同的新对象时,需耍用到拷贝构造函数。例:class complex(private:double real;double image;public:void set(double r,double i)(real=r;image=i;void displayO(coutreal+im ageiendl;
21、)complex(double r,double i)real=r;image=i;)complex(const complex&t)拷贝构造函数,形参是一个只读的引用(real=t.real;image=t.image;);void main()(complex x(2,3);complex y(x);使用拷贝构造函数y.display();除了在定义对象时使用拷贝构造函数,当函数参数是对象时,实参对象传给形参会调用拷贝构造函数;当函数返回值是一个对象时,会利用拷贝构造函数产生一个临时对象表示函数返回值。这也是为什么拷贝构造函数的参数是对象的引用。由于对象的创建和注销都耗费系统资源,一般函数
22、参数和函数返回值都用对象的引用。为了保证函数调用的成功,如果没有自定义拷贝构造函数,系统会创建一个默认拷贝构造函数,它的功能是复制参数对象的所有数据成员到新建对象。2.深拷贝和浅拷贝当对象中含有指针和动态开辟的内存空间时,可以看到简单的数据复制不能正确的拷贝对象。例:class person(private:char*name;int age;public:person(int a,char*p=,nonameM);person(const person&t);void displayO(cout,nam e:nam e,age:ageendl;void setname(char*p)(del
23、ete name;name=new charstrlen(p)+l;strcpy(name,p);)person()(delete name;);person:person(int a,char*p):age(a)(name=new charfstrlen(p)+l;strcpy(name,p);person:person(const person&t):age(t.age)(name=new charstrlen(t.name)+1;给新对象开辟内存空间strcpy(name,t.name);)void main()person x(18,ntomn);person y(x);y.setna
24、me(nmikeM);x.displayO;y.display();)简单的数据复制称为浅拷贝,带有动态申请空间和指针的数据复制称为深拷贝。系统自动生成的拷贝构造函数只能实现浅拷贝。九、成员函数重载例:person类重载set函数class person(private:char*name;int age;public:person(int a,char*p=Hnoname);person(const person&t);person()(deleted name;)void display()(coutname:n n a m e u age:ageendl;)void set(char*p
25、)参数是字符串,改名字(delete name;name=new charstrlen(p)+l;strcpy(name,p);)void set(int a)参数是数字,改年龄age=a;void set(int a,char*p)改名字年龄set(p);set(a););person:person(int a,char*p):age(a)(name=new charstrlen(p)+l;strcpy(name,p);)person:person(const person&t):age(t.age)(name=new charstrlen(t.name)+1 ;strcpy(name,t.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+课件第7 章类与对象 C+ 课件 对象
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内