第2章 C++基础知识课件_第1页
第2章 C++基础知识课件_第2页
第2章 C++基础知识课件_第3页
第2章 C++基础知识课件_第4页
第2章 C++基础知识课件_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章C++基础知识C++语言的产生C++是从C语言发展演变而来的。引入了类的机制,最初的C++被称为"带类的C"。1983年正式取名为C++。2C++语言的产生为了使C++具有更好的可移植性,美国国家标准局(AmericanNationalStandardsInstitute,ANSI)于1990年设立了ANSIX3J16委员会专门负责制定C++标准。不久,国际标准化组织ISO也成立了自己的委员会,负责制定C++标准。同年,ANSI和ISO将两个委员会合并,共同合作进行C++标准化工作,委员会称ANSI/ISO。3C++语言的产生1988年,经过委员会的不懈努力,C++的国际标准(ISO/IEC)获得了ISO、IEC(InternationalCommission,国际电工技术委员会)和ANSI的批准,这是第一个国际C++标准,称为标准C++或ANSI/ISOC++。2003年,委员会制定并发布了C++标准第2版。4C++语言的特点5C语言支持面向过程的程序设计语言C++语言支持面向过程和面向对象的程序设计语言C++不是一个纯面向对象的程序设计语言C++语言打着面向对象的幌子干着面向过程的勾当!C++编译器对C程序的兼容性造成了最底层的“过程勾当”。实际上用C++编程的人,大部分不自己创建类,而是使用类库,这样就造成了他们把类库作为一种高级的函数库来理解,并没有真正理解面向对象的思想。

C++给了我们第二条道路去走过程编程6控制台(console)应用程序DOS-like程序。以main函数为入口点。

Console窗口将成为其标准输入和输出装置。仍然可以调用部分的、不牵扯到图形使用者接口(GUI)的Win32API(尤其是KERNEL.DLL模块所提供的那一部分),所以它可以使用Windows提供的各种高级功能,它可以产生进程,产生线程。甚至还可以在其中使用部分的MFC类(同样是与GUI没有关联的),例如处理数组、链表等数据结构的collectionclasses(CArray,CList)、与文件有关的CFile、CStdioFile。7第一个C++程序-HelloWorld该程序在控制台输出一个字符串8#include<iostream.h>intmain(){ cout<<"HelloWorld"<<endl;return0;}第二个C++程序-还是HelloWorld该程序在控制台输出一个字符串9#include<iostream>usingnamespacestd;intmain(){ cout<<"HelloWorld"<<endl;return0;}分析第二个HelloWorld程序#include<iostream>预处理命令“#”usingnamespacestd;引用std名字空间10C++头文件11C++标准库的程序实体是在名字空间std中定义的,在C++程序,如果包含的是相应的C++的头文件,则应通过名字空间std来使用这些功能。C++头文件12

C++标准库包含了C语言和针对C++提供的新功能,其头文件定义如下:

C标准库提供的头文件,在C++标准库中也提供了相应的头文件,文件名的约定是:把C标准库头文件名的.h去掉,然后在文件名前加一个字母c。比如stdio.h

变为

cstdioC++提供的新功能的,去掉.h后缀,并放入std名字空间,比如

iostream.h

变为

iostream。

C++头文件13

现在很多的C++实现为了保证与C语言的兼容性,往往同时提供了两套头文件。但注意:在VC++6.0的C++标准中,从C标准包含进来的功能并没有在名字空间std中定义。分析intmain()程序入口点cout<<"HelloWorld"<<endl;cout:标准输出流对象,作用相当于printf<<:插入符,将后面的内容插入到cout中,即输出到屏幕上。endl:endofline14输出cout流输出格式cout<<输出数据;可以连续输出cout<<a<<b<<c<<endl;功能cout可以输出字符、整数、浮点数和字符串类似printf函数15输入cin流输入cin:标准输入流对象,作用相当于scanf>>:提取符,将用户输入的内容保存到后面的变量中。16输入cin流输入格式cin>>输入数据;可以连续输入(空白符:空格、横向制表符或回车符作为输入数据之间的分隔符)cin>>i>>j>>k;功能输入字符、整数、浮点数和字符串类似scanf函数172.2C++数据类型数据是程序处理的对象,在C++语言中,所有的数据对象都属于某种数据类型。18数据类型的分类基本数据类型派生类型复合类型(数组、类、结构体、共用体、枚举)指针引用19基本数据类型

整型(int)字符型(char,wchar_t)浮点型(实型)(float,double)逻辑型(布尔型)(bool)空值类型(void):用于函数和指针基本数据类型为了更加准确地描述数据类型,提供了4个关键字用来修饰基本的数据类型,分别是short、long、unsigned和signed2021类的声明形式

类是一种用户自定义类型,声明形式:class类名称{

public:

公有成员(外部接口)

private:

私有成员

protected:

保护型成员}22类和对象公有类型成员在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。23类和对象私有类型成员在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。24类和对象保护类型与private类似,其差别表现在继承与派生时对派生类的影响不同,第七章讲。25类和对象类的成员classclock{public:

voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();private:inthour,hinute,second;};26类和对象成员数据成员函数voidClock::setTime(intnewH,intnewM, intnewS){hour=newH;minute=newM;second=newS;}voidClock::showTime(){cout<<hour<<":"<<minute<<":"<< second;}27对象

类属于类型范畴的程序实体,它存在于静态的程序(运行前的程序)中。而动态的面向对象程序(运行中的程序)则由对象构成,程序的执行是通过对象之间互相发送消息来实现的,当对象接收到一条消息后,它将调用对象类中定义的某个成员函数来处理这条消息。计算机科学与技术学院张淼28对象的定义定义类后,再定义类的对象在定义变量时,如果变量的类型为类,则称该变量为对象,用变量名来标识相应的对象。定义类的同时定义类的对象即在定义类的右大括号“}”后直接写出对象名列表。29类名对象名;class类名称{

public:

公有成员(外部接口)

private:

私有成员

protected:

保护型成员}对象名列表;计算机科学与技术学院张淼3031this指针隐含于每一个类的成员函数中的特殊指针。明确地指出了成员函数当前所操作的数据所属的对象。当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。32this指针例如:Point类的getX函数中的语句:returnx;相当于:returnthis->x;内联函数的定义方法一内联函数的隐式声明——类内定义成员函数。33classStudent{private: intnumber,score;public: voidinit(){ number=1001; score=100;}};内联函数的定义方法二内联函数的显式声明34classStudent{private: intnumber,score;public: voidinit();};inlinevoidStudent::init(){ number=1001; score=100;}35构造函数什么是构造函数构造函数是一种特殊的成员函数,它是在对象诞生后第一个执行(并且是自动执行)的函数.构造函数的特点构造函数的名称必须与类名相同构造函数没有返回值,可以有参数,可以重载构造函数一般是public的,但有时也把构造函数声明为私有的(private),其作用是限制创建该类对象的范围,这时只能在本类和友元类中创建该对象。程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。36计算机科学与技术学院张淼37在创建一个对象时,对象类的构造函数会被自动调用来对该对象进行初始化。至于调用对象类的哪个构造函数,这可以在创建对象的时候指定。构造函数计算机科学与技术学院张淼38classA{……public:A();A(inti);A(char*p);}Aa1;或Aa1=A();

Aa2(1);或Aa2=A(1);或Aa2=1;Aa3(“abcd”);或Aa3=A(“abcd”);或Aa3=“abcd”;Aa1();39classA{……public:A();A(inti);A(char*p);}Aa[4];

Ab[5]={A(),A(1),A(“abcd”),2,“xyz”};

A*p1=newA;

A*p2=newA(2);A*p3=newA(“xyz”);

A*p4=newA[20];

构造函数不带参数的(或所有参数都有默认值的)构造函数,即构造对象时不提供参数的构造函数称为默认构造函数。程序中不能同时出现无参数的构造函数和带有全部默认形参值的构造函数。4041classA{……public:A();A(inti=0);

};Aa;(ERROR)构造函数构造函数C++规定,每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。42构造函数C++又规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供),这个默认的构造函数是一个不带参数的构造函数,该构造函数的函数体为空,不做任何的初始化工作。43构造函数只要一个类定义了一个构造函数,不管这个构造函数是否是带参数的构造函数,C++就不再提供默认的构造函数。因此,如果为一个类定义了一个带参数(且不是所有参数都有默认值)的构造函数,还想要创建一个对象而不提供参数,就需要自己定义一个默认构造函数。4445classA{……public:A(inti);

};Aa;(ERROR)构造函数计算机科学与技术学院张淼46构造函数示例把Student类中的函数init改成构造函数classStudent{private: intnumber; intscore;public: Student(intnumber,intscore) { Student::number=number;

Student::score=score;}};voidmain(){ Students1(1002,90); Students2; //错误,类中没有默认构造函数}构造函数也可以“类内声明,类外定义”析构函数什么是析构函数在对象即将销毁但未销毁之前一刻,最后执行(并且是自动执行)的函数。析构函数是“反向”的构造函数,析构函数不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数.析构函数的作用正好与构造函数相反,对象超出其作用范围,对应的内存空间被系统收回或被程序用delete删除时,析构函数被调用.47析构函数析构函数的特点析构函数的名称与类名相同,前面加上“~”析构函数没有返回值,没有参数,不能重载当对象被撤销时,系统自动调用析构函数类中未定义析构函数,系统会自动生成默认的函数体为空的析构函数48析构函数根据析构函数的特点,我们可以在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源.49析构函数示例在构造函数申请空间,析构函数释放空间计算机科学与技术学院张淼50classStudent{private: char*name;intnumber;intscore;public:Student(char*name,intnumber,intscore){this->name=newchar[strlen(name)+1];strcpy(this->name,name);this->number=number;this->score=score;}

~Student() {deletename;}};析构函数同样可以“类内声明,类外定义”析构函数示例51namenumberscore栈内存堆内存zhangsanStu1对象Studentstu1(“zhangsan”,101,90);10190注意无论构造函数被调用还是析构函数被调用,对象都是存在的。522.6重载函数重载运算符重载(操作符重载)54重载函数的声明C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。例:形参类型不同intadd(intx,inty);floatadd(floatx,floaty);形参个数不同intadd(intx,inty);intadd(intx,inty,intz);

函数重载55注意事项重载函数的形参必须不同:个数不同或类型不同。编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:intadd(intx,inty);intadd(inta,intb);编译器不以形参名来区分intadd(intx,inty);voidadd(intx,inty);编译器不以返回值来区分intadd(intx,inty){returnx+

y;}floatadd(floatx,floaty){returnx-y;}

函数重载56例:重载函数应用举例编写两个名为sumOfSquare的重载函数,分别求两整数的平方和及两实数的平方和。#include<iostream>usingnamespacestd;intsumOfSquare(inta,intb){ returna*a+b*b;}doublesumOfSquare(doublea,doubleb){ returna*a+b*b;}

函数重载intmain(){ intm,n; cout<<"Entertwointeger:"; cin>>m>>n; cout<<"Theirsumofsquare:"<<sumOfSquare(m,n)<<endl; doublex,y; cout<<"Entertworealnumber:"; cin>>x>>y; cout<<"Theirsumofsquare:"<<sumOfSquare(x,y)<<endl; return0;}57运行结果:Entertwointeger:35Theirsumofsquare:34Entertworealnumber:2.35.8Theirsumofsquare:38.935859问题举例——复数的运算classComplex{ //复数类声明public: Complex(doubler=0.0,doublei=0.0){real=r;imag=i;} voiddisplay()const; //显示复数的值private: doublereal; doubleimag;}; 运算符重载60问题举例——复数的运算用“+”、“-”能够实现复数的加减运算吗?实现复数加减运算的方法

——重载“+”、“-”运算符运算符重载61运算符重载运算符重载的实质运算符重载是对已有的运算符赋予多重含义必要性C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。计算机科学与技术学院张淼62规则和限制可以重载C++中除下列运算符外的所有运算符:

.

.*::?:只能重载C++语言中已有的运算符,不可臆造新的。不改变原运算符的优先级和结合性。不能改变操作数个数。经重载的运算符,其操作数中至少应该有一个是自定义类型。63运算符函数声明形式函数类型operator运算符(形参){......}重载为类成员函数时

参数个数=原操作数个数-1 (后置++、--除外)重载为非成员函数时参数个数=原操作数个数,且至少应该有一个自定义类型的形参。运算符重载64运算符成员函数的设计双目运算符B如果要重载B为类成员函数,使之能够实现表达式oprd1Boprd2,其中

oprd1为A类对象,则B应被重载为A类的成员函数,形参类型应该是oprd2

所属的类型。经重载后,表达式

oprd1Boprd2

相当于oprd1.operatorB(oprd2)运算符重载65运算符重载

例:

将“+”、“-”运算重载为复数类的成员函数。规则:实部和虚部分别相加减。操作数:两个操作数都是复数类的对象。#include<iostream>usingnamespacestd;classComplex{ //复数类定义public: //外部接口

Complex(doubler=0.0,doublei=0.0):real(r),imag(i){} //构造函数

Complexoperator+(constComplex&c2)const;

//运算符+重载成员函数

Complexoperator-(constComplex&c2)const;

//运算符-重载成员函数

voiddisplay()const; //输出复数private: //私有数据成员

doublereal; //复数实部

doubleimag; //复数虚部};66ComplexComplex::operator+(constComplex&c2)const{ //重载运算符函数实现

returnComplex(real+c2.real,imag+c2.imag);

//创建一个临时无名对象作为返回值}ComplexComplex::operator-(constComplex&c2)const{ //重载运算符函数实现

returnComplex(real-c2.real,imag-c2.imag);

//创建一个临时无名对象作为返回值}voidComplex::display()const{ cout<<"("<<real<<","<<imag<<")"<<endl;}67intmain(){

//主函数

Complexc1(5,4),c2(2,10),c3; //定义复数类的对象

cout<<"c1=";c1.display(); cout<<"c2=";c2.display(); c3=c1-c2; //使用重载运算符完成复数减法

cout<<"c3=c1-c2=";c3.display(); c3=c1+c2; //使用重载运算符完成复数加法

cout<<"c3=c1+c2=";c3.display(); return0;}6869单目运算符重载规则:前置(++i)单目运算符,重载函数没有形参,后置(i++)单目运算符,重载函数需要有一个整型形参。运算符重载例:运算符前置++和后置++重载为时钟类的成员函数。操作数是时钟类的对象。实现时间增加1秒钟。#include<iostream>usingnamespacestd;classClock{ //时钟类声明定义public: //外部接口

Clock(inthour=0,intminute=0,intsecond=0); voidshowTime()const;

Clock&operator++();

//前置单目运算符重载

Clockoperator++(int);//后置单目运算符重载private: //私有数据成员

inthour,minute,second;};70//前置单目运算符重载函数Clock&Clock::operator++(){

second++; if(second>=60)

{ second-=60; minute++; if(minute>=60)

{ minute-=60; hour=(hour+1)%24; } } return*this;}71//后置单目运算符重载ClockClock::operator++(int){

//注意形参表中的整型参数

Clockold=*this; ++(*this); //调用前置“++”运算符

returnold;}72//其它成员函数的实现略intmain(){ ClockmyClock(23,59,59); cout<<"Firsttimeoutput:"; myClock.showTime(); cout<<"ShowmyClock++:"; (myClock++).showTime(); cout<<"Show++myClock:"; (++myClock).showTime(); return0;}732.7友元类的主要特点是数据的封装,即类的私有部分在该类的作用域之外是不可见的。#include<iostream>#include<cmath>usingnamespacestd;classPoint {public: //外部接口

Point(intxx=0,intyy=0){X=xx;Y=yy;}

intGetX(){returnX;}

intGetY(){returnY;}private: //私有数据成员

intX,Y;};计算机科学与技术学院张淼75doubleDist(Point&a,Point&b){doubledx=a.X-b.X;doubledy=a.Y-b.Y;returnsqrt(dx*dx+dy*dy);}intmain(){Pointmyp1(3.0,5.0),myp2(4.0,6.0);

doubled=Dist(myp1,myp2);

cout<<"Thedistanceis"<<d<<endl;

return0;}计算机科学与技术学院张淼76#include<iostream>#include<cmath>usingnamespacestd;classPoint {public: //外部接口

Point(intxx=0,intyy=0){X=xx;Y=yy;}

intGetX(){returnX;}

intGetY(){returnY;}frienddoubleDist(Point&a,Point&b);private: //私有数据成员

intX,Y;};77友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元关系,一个普通函数或一个类中的成员函数可以访问其他类中的私有和保护成员。声明为友元的外界对象既可以是不属于任何类的一般函数,也可以是另一个类的成员函数,还可以是整个类(此时该类中的所有成员函数都称为友元函数)。友元函数

在类中说明友元函数的一般格式为:friend

<类型><友元函数名>(<参数列表>)在<参数列表>中,通常包含一个与该友元函数具有友元关系的类的类型的参数,该参数可以是一般类型、指针类型或引用类型,但通常为引用类型。

友元函数的定义和调用方式与一般函数一样,只是在类中要进行友元声明。

注意:友元是C++提供的一种破坏数据封装和数据隐藏的机制。友元函数是一种外部函数访问类中私有成员或保护成员的有效工具,如果使用不当,则是非常危险的。为此,通常只将友元函数用于获取对象中的成员数据值,而不修改对象中的成员数据。为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。

友元类(Friend

Class)

可以定义一个类作为另一个类的友元(朋友),则此类的所有成员都能访问对方类的私有成员。

声明友元类的一般形式:

friend

class

类名;

如friend

class

MyClass;

classA{friendclassB;public:voidDisplay()

{cout<<x<<endl;}private:intx;}classB{public:voidSet(inti);voidDisplay();private:

Aa;};voidB::Set(inti){

a.x=i;}voidB::Display(){a.Display();}2.8this指针82this指针是类的一个自动生成、自动隐藏的私有成员,它隐含于每个类的非静态成员函数之中,指向被调用函数所在的对象的地址。当一个对象被创建时,该对象的成员均含有由系统自动产生的指向当前对象的this指针,指向对象数据的首地址。

成员函数访问类中成员变量的格式可以写成:

this->成员变量83#include<iostream>usingnamespacestd;classPoint{private:

intx,y;public:

Point(inta,intb){x=a;y=b;}

voidMovePoint(inta,intb){x+=a;y+=b;}

voidprint(){cout<<"x="<<x<<"y="<<y<<endl;}};void

main(){

Pointp1(10,10);

p1.MovePoint(2,2);

p1.print();}84当对象p1调用MovePoint(2,2)函数时,即将p1对象的地址传递给了this指针。

MovePoint函数的原型应该是voidMovePoint(Point*this,inta,intb);

第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样p1的地址传递给了this,所以在MovePoint函数中便显式的写成:voidMovePoint(inta,intb){this->x+=a;this->y+=b;}即可以知道,p1调用该函数后,也就是p1的数据成员被调用并更新了值。85关于this指针的一个经典回答:

当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身计算机科学与技术学院张淼86类的this指针有以下特点:(1)this只能在成员函数中使用。全局函数、静态函数都不能使用this,实际上,成员函数默认第一个参数为T*constthis。(2)this在成员函数的开始前构造,在成员函数的结束后清除。它的生命周期同任何一个函数的参数是一样的,没有任何区别。(3)this指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局变量。(4)大多数编译器通过ecx寄存器传递this指针。事实上,这也是一个潜规则。一般来说,不同编译器都会遵从一致的传参规则,否则不同编译器产生的obj就无法匹配了。(5)this指针只有在成员函数中才有定义。获得一个对象后,不能通过对象使用this指针。所以,我们无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。而在成员函数里,可以知道this指针的位置的(可以通过&this获得),还可以直接使用它。2.9继承计算机科学与技术学院张淼87保持已有类的特性而构造新类的过程称为继承。在已有类的基础上新增自己的特性而产生新类的过程称为派生。被继承的已有类称为基类(或父类)。派生出的新类称为派生类。计算机科学与技术学院张淼88计算机科学与技术学院张淼89计算机科学与技术学院张淼90计算机科学与技术学院张淼91继承与派生的目的继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。计算机科学与技术学院张淼92派生类的声明class派生类名:继承方式基类名{

成员声明;}三种继承方式公有继承私有继承保护继承931、公有继承(public)基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。计算机科学与技术学院张淼94例:公有继承举例classPoint //基类Point类的声明{public: //公有函数成员

voidInitP(floatxx=0,floatyy=0){X=xx;Y=yy;} voidMove(floatxOff,floatyOff){X+=xOff;Y+=yOff;} floatGetX(){returnX;} floatGetY(){returnY;}private: //私有数据成员

floatX,Y;};计算机科学与技术学院张淼95classRectangle:publicPoint//派生类声明{public: //新增公有函数成员

voidInitR(floatx,floaty,floatw,floath) {InitP(x,y);//调用基类公有成员函数

W=w;H=h;}

floatGetH(){returnH;} floatGetW(){returnW;}private: //新增私有数据成员

floatW,H;};计算机科学与技术学院张淼96#include<iostream>#include<cmath>usingnamecpacestd;intmain(){Rectanglerect; rect.InitR(2,3,20,10);//通过派生类对象访问基类公有成员

rect.Move(3,2); cout<<rect.GetX()<<','<<rect.GetY()<<',' <<rect.GetH()<<','<<rect.GetW()<<endl; return0;}计算机科学与技术学院张淼972、私有继承(private)基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。计算机科学与技术学院张淼98例:私有继承举例classRectangle:privatePoint //派生类声明{public: //新增外部接口

voidInitR(floatx,floaty,floatw,floath) {InitP(x,y);W=w;H=h;} //访问基类公有成员

voidMove(floatxOff,floatyOff)

{

Point::Move(xOff,yOff);} floatGetX(){returnPoint::GetX();} floatGetY(){returnPoint::GetY();} floatGetH(){returnH;} floatGetW(){returnW;}private: //新增私有数据

floatW,H;};计算机科学与技术学院张淼99#include<iostream>#include<cmath>usingnamecpacestd;intmain(){//通过派生类对象只能访问本类成员

Rectanglerect; rect.InitR(2,3,20,10); rect.Move(3,2); cout<<rect.GetX()<<','<<rect.GetY()<<',' <<rect.GetH()<<','<<rect.GetW()<<endl; return0;}计算机科学与技术学院张淼1003、保护继承(protected)基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员对建立其所在类对象的模块来说,它与private成员的性质相同。对于其派生类来说,它与public成员的性质相同。既实现了数据隐藏,又方便继承,实现代码重用。计算机科学与技术学院张淼101多重继承class派生类名:继承方式1基类名1,

继承方式2基类名2,...{

成员声明;}注意:每一个“

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论