欢迎来到天天文库
浏览记录
ID:45038245
大小:334.50 KB
页数:67页
时间:2019-11-08
《2+C++预备知识》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、二.C/C++预备知识变量的存储类型函数参数的传递封装类及其成员继承基类与派生类派生类对象访问基类成员一致性难题多态虚函数一致性与功能虚函数实现机制objectslice多重继承多重继承的虚表二义性RTTI类型转换显示转换(强行转换)动态转换静态转换动态链接库名字改编函数模板类模板友元函数.操作符重载11变量的存储类型全局变量:在任何函数之外定义,可以被任何代码所访问.在其他的文件中使用这些变量时,使用extern来声明之,使得编译器了解这些变量的类型和名字,但是不重新分配内存.Static全局变量:只在文件范围内可见.(使得开发者可以任意地使
2、用变量名字,不必担心重名.)自动变量:函数体内部.在stack中Static局部变量:在函数体内部定义,编译器为之生成永久存储单元,在调用之前就存在.只在函数内部可见.动态分配变量:newdelete在heap中.类的static成员变量:只与类有关.属于类而不属于对象的变量.(静态成员函数,没有this指针,其中只能访问静态成员变量.)以下例子见virtualfun工程22函数参数的传递引用运算符&用来定义一个引用.intnum;int&refn=num;refn是num的别名.此语句并没有在内存中创建一个新的变量refn,它只不过通知编译器
3、num有了一个新的名字叫refn.Refn和num是同一个变量.1.传值voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;};C++中缺省的参数初始化方法是把实参的值拷贝到参数的存储区中.形参的值可以改变,但此函数并不能改变实参的值.32voidswap2(int*px,int*py){inttemp;temp=*px;*px=*py;*py=temp;};同上,函数不能改变实参的值(即地址值),在这种意义下,传地址和传值是等价的.虽然不能改变实参的的值,但是改变了实参(即地址)所存储的值.如果要改变
4、一个指针的值,那么就要使用双重指针.3voidswap3(int&x,int&y){inttemp;temp=x;x=y;y=temp;}与前两个不同,形参是实参的别名.实参形参是同一个变量.4调用方法:1.inta=2,b=5;swap1(a,b);cout<5、成员类。mobiletelephone手机classmt{private:intprice;public:voidwork();voidsetprice(intinitp){price=inip;};voidgetprice(int*oldp){*oldp=price;};//数据成员是私有的,客户只能通过公有的方法,在方法内部来访问。mt(void);~mt(void);};6C++编译器对于数据成员和函数成员的处理:数据成员:静态的:定义了类,就会给静态数据分配内存.非静态的:new了实例,每个实例都为之分配.函数成员:定义了类,实现了该函6、数后,就有该函数的入口指针.对于新new的实例并不产生新的指针.必须通过实例来调用它,不同的实例都是调用同一个函数.因此存在者重入性和并发性的安全问题,如果函数体里使用了静态的变量(函数级的或者是外部的)的话.如果是非静态的成员函数,则每一个实例调用它时,会传入一个指向实例本身的指针this.实例借此可以访问其他的成员(变量或函数)如果是静态的成员函数,则在调用时无this指针,因此不能访问类的非静态的成员(变量或者函数).如果是虚函数,则会为此类建立一个虚表,每个表项是一个指针,指向此函数的实现.这是额外的开销.见后文.虚函数不能是静态的。77、4继承基类与派生类4.1派生类对象访问基类成员共有的性质提升到基类中。classEE//电子设备{protected:intprice;//保护的数据成员可以被派生类的成员函数访问public:voidWork();voidSetPrice(intinitp);voidGetPrice(int*oldp);voidNVWhoAmI(){cout<<“IamaEE”<8、d:intrent;//月租费.派生类可以有自己的数据成员和方法。price无需再进行申明.public:voidCall();voidMTSetPr
5、成员类。mobiletelephone手机classmt{private:intprice;public:voidwork();voidsetprice(intinitp){price=inip;};voidgetprice(int*oldp){*oldp=price;};//数据成员是私有的,客户只能通过公有的方法,在方法内部来访问。mt(void);~mt(void);};6C++编译器对于数据成员和函数成员的处理:数据成员:静态的:定义了类,就会给静态数据分配内存.非静态的:new了实例,每个实例都为之分配.函数成员:定义了类,实现了该函
6、数后,就有该函数的入口指针.对于新new的实例并不产生新的指针.必须通过实例来调用它,不同的实例都是调用同一个函数.因此存在者重入性和并发性的安全问题,如果函数体里使用了静态的变量(函数级的或者是外部的)的话.如果是非静态的成员函数,则每一个实例调用它时,会传入一个指向实例本身的指针this.实例借此可以访问其他的成员(变量或函数)如果是静态的成员函数,则在调用时无this指针,因此不能访问类的非静态的成员(变量或者函数).如果是虚函数,则会为此类建立一个虚表,每个表项是一个指针,指向此函数的实现.这是额外的开销.见后文.虚函数不能是静态的。7
7、4继承基类与派生类4.1派生类对象访问基类成员共有的性质提升到基类中。classEE//电子设备{protected:intprice;//保护的数据成员可以被派生类的成员函数访问public:voidWork();voidSetPrice(intinitp);voidGetPrice(int*oldp);voidNVWhoAmI(){cout<<“IamaEE”<8、d:intrent;//月租费.派生类可以有自己的数据成员和方法。price无需再进行申明.public:voidCall();voidMTSetPr
8、d:intrent;//月租费.派生类可以有自己的数据成员和方法。price无需再进行申明.public:voidCall();voidMTSetPr
此文档下载收益归作者所有