C++3类和对象

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章类和对象3.1类与对象的基本概念3.2构造函数与析构函数3.3对象数组与对象指针3.4string类3.5向函数传递对象3.6对象的赋值和拷贝3.7静态成员3.8友元3.9类的组合3.10常类型本章主要内容3.1类与对象的基本概念3.1.1结构体与类3.1.2成员函数的定义3.1.3对象的定义及使用3.1.4类的作用域和类成员的访问属性本节主要内容3.1.1结构体与类1.结构体的扩充例如:声明一个复数的结构体:structComplex{doublereal;//复数的实部doubleimag;//复数的虚部};C语言结构体一般格式如下:struct结构名{数据};C++对结构体类型进行了扩充,它不仅可以含有数据,而且还可以含有函数。C++扩充的结构体一般格式如下:struct结构名{数据函数};structComplex{doublereal;//数据,复数的实部doubleimag;//数据,复数的虚部voidinit(doubler,doublei){real=r;imag=i;//函数,给real和imag赋初值}doubleabscomplex()//函数,求复数的绝对值{doublet;t=real*real+imag*imag;returnsqrt(t);}};例如:C++声明一个名为Complex的结构体structComplex{doublereal;//数据成员doubleimag;//数据成员voidinit(doubler,doublei)//成员函数{real=r;imag=i;}doubleabscomplex()//成员函数{doublet;t=real*real+imag*imag;returnsqrt(t);}};结构中的数据和函数,分别称作数据成员和成员函数。#includeiostream#includecmathusingnamespacestd;structComplex{doublereal;//数据成员,复数的实部doubleimag;//数据成员,复数的虚部voidinit(doubler,doublei){real=r;imag=i;}doubleabscomplex(){doublet;t=real*real+imag*imag;returnsqrt(t);}};intmain(){ComplexA;A.init(1.1,2.2);cout复数的绝对值是:A.abscomplex()endl;return0;}成员函数,给real和imag赋初值成员函数,求复数的绝对值定义结构体Complex的变量A调用成员函数init,给real和imag赋初值例3.1C++声明一个名为Complex的结构体程序运行结果:复数的绝对值是:2.45967调用成员函数abscomplex,求复数的绝对值2.类的声明声明一个名为comple的类classComplex{doublereal;//数据成员,复数的实部doubleimag;//数据成员,复数的虚部voidinit(doubler,doublei){real=r;imag=i;}doubleabscomplex(){doublet;t=real*real+imag*imag;returnsqrt(t);}};用关键字class取代结构体的struct成员函数,求复数的绝对值成员函数,给real和imag赋初值第1行“classComplex”是类头。从第1行开头的左花括号起到最后一行的右花括号是类体。#includeiostream#includecmathusingnamespacestd;classComplex{doublereal;//数据成员doubleimag;//数据成员voidinit(doubler,doublei)//成员函数{real=r;imag=i;}doubleabscomplex()//成员函数{doublet;t=real*real+imag*imag;returnsqrt(t);}};intmain(){ComplexA;A.init(1.1,2.2);cout复数的绝对值是:A.abscomplex()endl;return0;}请问:程序运行结果??定义类Complex的对象A调用成员函数init,给real和imag赋初值例3.2用类类型替代例3.1中的结构体类型。用class取代struct调用成员函数abscomplex,求复数的绝对值编译错误编译错误为了保护类中数据的安全,在C++中将类中的成员分为两类:私有成员(用private声明)公有成员(用public声明)class类名{[private:]私有数据成员和成员函数public:公有数据成员和成员函数};私有成员只能被类内的成员函数访问,而不能被类外的对象访问公有成员既可被类内的成员函数访问,也可被类外的对象访问在默认情况下(即没有指定属于私有或公有时),类中的成员是私有的。类声明的一般形式如下:#includeiostream#includecmathusingnamespacestd;classComplex{doublereal;//数据成员doubleimag;//数据成员voidinit(doubler,doublei)//成员函数{real=r;imag=i;}doubleabscomplex()//成员函数{doublet;t=real*real+imag*imag;returnsqrt(t);}};intmain(){ComplexA;A.init(1.1,2.2);cout复数的绝对值是:A.abscomplex()endl;return0;}例3.2产生错误的原因。私有成员不能被类外的对象访问,编译错误私有成员不能被类外的对象访问,编译错误都是私有的#includeiostream#includecmathusingnamespacestd;classComplex{private:doublereal;//私有数据成员doubleimag;//私有数据成员public:voidinit(doubler,doublei)//公有成员函数{real=r;imag=i;}doubleabscomplex()//公有成员函数{doublet;t=real*real+imag*imag;returnsqrt(t);}};intmain(){ComplexA;A.init(1.1,2.2);cout复数的绝对值是:A.abscomplex()endl;return0;}将成员函数init和abscomplex设置为公有的,公有成员既可被类内的成员函数访问,也可被类外的对象访问程序运行结果如下:复数的绝对值是:2.45967在C++中,公有成员函数是类与外界的接口,类外的对象对私有成员的访问只能通过公有成员函数这个接口来进行。修改例3.2使其正常运行#includeiostream#includecmathusingnamespacestd;structComplex{doublereal;//数据成员doubleimag;//数据成员voidinit(doubler,doublei)//成员函数{real=r;imag=i;}doubleabscomplex()//成员函数{doublet;t=real*real+imag*imag;returnsqrt(t);}};intmain(){ComplexA;A.init(1.1,2.2);cout复数的绝对值是:A.abscomplex()endl;return0;}程序运行结果如下:复数的绝对值是:2.45967问题:为什么在例3.1中使用结构体,程序能够正常运行呢?原因:在默认情况下,结构体中的成员是公有的。变量A能够对成员函数init和abscomplex进行访问都是公有的#includeiostream#includecmathusingnamespacestd;structComplex{private:doublereal;//私有数据成员doubleimag;//私有数据成员public:voidinit(doubler,doublei)//公有成员函数{real=r;imag=i;}doubleabscomplex()//公有成员函数{doublet;t=real*real+imag*imag;returnsqrt(t);}};intmain(){ComplexA;A.init(1.1,2.2);cout复数的绝对值是:A.abscomplex()endl;return0;}private说明的部分称为结构体的私有部分public说明的部分称为结构体的公有部分程序运行结果如下:复数的绝对值是:2.45967结构体中也能说明私有部分和公有部分实际上,在C++中,类class和结构struct的功能基本上相同,都含有数据成员以及对这些数据进行的成员函数。类和结构的主要区别是:在默认情况下,结构体中的成员是公有的;类中的成员是私有的。原因是:1.考虑到设计C++语言的一条原则,即C++必须兼容C,所以,在C++中必须保留C结构体这种数据类型,并对其功能进行了扩充。2.考虑到C的传统原因,结构体中的成员默认为公有的(public)。3.C++提出了类和对象的概念,便于用户理解面向对象这个全新的思想。4.在默认的情况下,类成员是私有的,类提供了缺省的安全性。这一规定符合面向对象思想中数据隐藏的准则,使得类中的成员得到更好的保护。问题:类和结构体的功能基本上相同。那么,何必多此一举,在C++中设两种功能一样的类型呢?说明:(1)类声明中的private和public两个关键字可以按任意顺序出现任意次。但是,如果把所有的私有成员和公有成员归类放在一起,程序将更加清晰。(2)除了private和public之外,类中的成员还可以用另一个关键字protected来说明。被protected说明的成员称为保护成员,它不能被外部函数使用,但可以通过其他方法使用它。类声明的完整形式如下:class类名{[private:]私有数据成员和成员函数public:公有数据成员和成员函数protected:保护数据成员和成员函数};(3)不能在类声明中给数据成员赋初值。例如:classabc{private:chara=q;//错误intb=33;//错误public:…};C++规定,只有在对象定义之后才能给数据成员赋初值3.1.2成员函数的定义成员函数的定义通常采用以下3种方式:第一种定义方式:在类声明中只给出成员函数的原型,而将成员函数的定义放在类外部。例如:Student∷成员函数名(参数表)成员函数在类外定义的一般形式是:返回值类型类名∷成员函数名(参数表){函数体}在类名和成员函数名之间应加上作用域运算符“∷”classStudent{//学生类的定义-1private:intnumber;floatscore;public:voidinput(intnumber1,floatscore1);//函数原型1,输入成绩voidmodify(floatscore1);//函数原型2,修改成绩voidprint();//函数原型3,打印成绩};voidStudent::input(intnumber1,floatscore1)//函数定义1{number=number1;score=score1;}voidStudent::modify(floatscore1)//函数定义2{score=score1;}voidStudent::print()//函数定义3{cout\nnumber:numberscore:score;}在类声明中只给出成员函数的原型,而将成员函数的定义放在类外部。在函数名前应加上类名和作用域运算符“∷”第

1 / 190
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功