51CTO下载C++.docx
- 文档编号:740845
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:30
- 大小:30.36KB
51CTO下载C++.docx
《51CTO下载C++.docx》由会员分享,可在线阅读,更多相关《51CTO下载C++.docx(30页珍藏版)》请在冰点文库上搜索。
51CTO下载C++
C++中的四种类型转换
C++新加了四个类型转换操作符:
static_cast,const_cast,dynamic_cast,reinterpret_cast。
static_cast
这时最常用的转换操作符,用于合理情况下的类型转换,如int转换为float。
average=(float)hists/(float)at_bata;
等效于
average=static_cast
const_cast
该操作符时用于去除const属性,即将指向const对象的指针转化换指向非const对象的指针。
如:
Copycode
#include
usingnamespacestd;
constint*found(intval,constint*t,intn);
intmain()
{
inta[]={2,3,4};
int*ptr;
ptr=const_cast
inti;
if(ptr==0)
cout<<"notfound\n";
else
cout<<"found;value="<<*ptr<<'\n';
return0;
}
constint*found(intval,constint*t,intn)
{
inti;
for(i=0;i { if(t==val) return&t; return0;//notfound } } dynamic_cast 该操作符用于运行时检查该转换是否类型安全,但只在多态类型时合法,即该类至少具有一个虚拟方法。 dynamic_cast与static_cast具有相同的基本语法,dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。 Copycode classC{ //…C没有虚拟函数 }; classT{ //… } intmain() { dynamic_cast } 此时如改为以下则是合法的: classC{ public: virtualvoidm(){};//C现在是多态 } reinterpret_cast 通常为操作数的位模式提供较低层的重新解释,即对数据的二进制存在形式进行重新解释。 比如: Copycode inti; char*p="Thisisaexample."; i=reinterpret_cast 此时结果,i与p的值是完全相同的。 reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,一个明显的现象是在转换前后没有数位损失。 深入理解C++中的mutable关键字 mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。 被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。 但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。 下面是一个小例子: classClxTest { public: voidOutput()const; }; voidClxTest: : Output()const { cout<<"Outputfortest! "< } voidOutputTest(constClxTest&lx) { lx.Output(); } 类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。 函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。 如果现在,我们要增添一个功能: 计算每个对象的输出次数。 如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。 这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。 下面是修改过的代码: classClxTest { public: ClxTest(); ~ClxTest(); voidOutput()const; intGetOutputTimes()const; private: mutableintm_iTimes; }; ClxTest: : ClxTest() { m_iTimes=0; } ClxTest: : ~ClxTest() {} voidClxTest: : Output()const { cout<<"Outputfortest! "< m_iTimes++; } intClxTest: : GetOutputTimes()const { returnm_iTimes; } voidOutputTest(constClxTest&lx) { cout< lx.Output(); cout< } 计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。 C++类访问控制(public/protected/private) C++中public,protected,private访问标号小结 第一: private,public,protected访问标号的访问范围。 private: 只能由1.该类中的函数、2.其友元函数访问。 不能被任何其他访问,该类的对象也不能访问。 protected: 可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。 但不能被该类的对象访问。 public: 可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。 注: 友元函数包括3种: 设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。 第二: 类的继承后方法属性变化。 private属性不能够被继承。 使用private继承,父类的protected和public属性在子类中变为private; 使用protected继承,父类的protected和public属性在子类中变为protected; 使用public继承,父类中的protected和public属性不发生改变; 如下所示: public: protected: private: public继承 public protected 不可用 protected继承 protected protected 不可用 private继承 private private 不可用 protected继承和private继承能降低访问权限。 C++之模板(Template) C++之模板(Template) 原创: Greenfood 2002年4月22日 模板是C++提供进行编程的一种类书工具。 所以在看本文以前请先了解一下C++类书的概念及相关的知识。 1.模板的概念: 模办是实现类属机制的一种工具,它的功能非常强,它是无约束类属机制和约束类属机制的集合。 它可以让用户构造模板函数。 模板,对象,函数之间的关系见下图 : 2.函数模板与模板函数: 先见下例: #include template Tmax(Tx,Ty) //定义模板 { return(x>y)? x: y; } main() { inti=10,j=56; floatx1=50.34,x2=56.34; doubley1=673.36,y2=465.972; cout<<"themaxofi,jis: "< cout<<"themaxofx1,x2is: "< cout<<"themaxofy1,y2is: "< return1; } 上面的这个程序虽然只是实现一个很简单的比较大小的问题,但如果不用模板,而用我们以前的方法,由于参数类型和返回值类型不同将需要三个函数来实现,这样是十分麻烦的。 模板成功的解决了这个问题,程序中生成了三个模板函数,其中max(i,j)用模板实参int将类型实参数T进行了实例化;max(x1,x1)用模板实参float将类型参数T进行了实例化;max(y1,y2)用模板实参double将类型参数T进行了实例化。 从上面的例子我们可以看出,函数模板提供了一类函数的抽象,它以任意类型T为参数及函数返回值。 由一个函数模板产生的函数称为模板函数,它是函数模板的具体实例。 函数模板和模板函数的关系图: 要提醒大家注意的一点是: 虽然模板参数T可以实例化成各种类型,但是采用模板参数T的各种参数T的各参数之间必须保持完全一致的类型。 例如: Tmax(Tx,Ty) { return(x>y)? x: y; } voidfunc(inti,charc,float) { max(i,i); //正确 max(c,c); //正确 max(c,i); //错误 max(f,i); //错误 } 解决上面的问题就需要引入一个型的概念—重载,既可以用非模板函数重载一个同名的函数模板。 重载有两种表述方式: 1.利用函数模板的函数体 使用次方法是必须注意各模板参数的实参类型必须一致。 例如: intmax(int,int) 2.重新定义函数体 对于要重新定义函数体的重载函数,所带参数的类型可以随意,就象一般的重载函数一样定义。 定义重载函数特别要注意避免产生预期的和非预期的二义性。 例如: intmax(int,int); charmax(intx,chary) { //...... } 当进行函数调用时有这样一个调用形式: msx(i,j); 此处i为int,f为float,这个函数调用就存在着二义性。 这时的调用就需要按照一定的规则安排先后顺序,这些规则就是函数模板与同名的非模板函数的重载方法均遵循的约定: (1)寻找一个参数完全匹配的函数,如果找到了就调用它。 (2)在 (1)失败后,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若找到了,就调用它。 (3)在 (1) (2)均失败后,再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等,若找到了,就调用它。 (4)若 (1) (2)(3)均失败,则这是一个错误的调用。 3.类模板与模板类 类模板与模板类的概念 一个类模板可以让用户为类定义一种模式,使得类中的某些数据成员,某些成员函数的参数,某些成员函数的返回值,能取任意类型。 定义一个类模板,一般由两方面的内容: (1)首先要定义类,其格式为: template classname { //.... } name为类名,在类定义体中如采用数据类型的成员,函数参数的前面需加上T。 例如: template classvector { T*data; intsize; pulic: vetor(int); T&operator[](int); //... }; (2)在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则需在函数体外进行模板声明,并且在函数名前的类名后缀上“ template vector : vector(inti) { //.... } template T&vector : operator[](inti) { //.... } 类模板的使用 类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为: 类名<实际的类型> 例如: main() { vector for(inti=0;i<=5;i++) x[i]=i; for(i=0;i<5;++i) cout< cout<<"\n"; } 类模板和模板类之间的关系,如图: 类模板使用需要注意的几点: (1)在每个模板定义之前,不管是类模板还是函数模板,都需要在前面加上模板声明: template (2)类模板和结构模板在使用时,必须在名字后面缀上模板参数 list 深入探讨C++中的引用 引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。 我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源。 故在本篇中我将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。 引用简介 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法: 类型标识符&引用名=目标变量名; 【例1】: inta;int&ra=a;//定义引用ra,它是变量a的引用,即别名 说明: (1)&在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。 ra=1;等价于a=1; (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。 故: 对引用求地址,就是对目标变量求地址。 &ra与&a相等。 (6)不能建立数组的引用。 因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。 引用应用 1、引用作为参数 引用的一个重要作用就是作为函数的参数。 以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。 但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。 【例2】: voidswap(int&p1,int&p2)//此处函数的形参p1,p2都是引用 {intp;p=p1;p1=p2;p2=p;} 为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。 如: 对应上面定义的swap函数,相应的主调函数可写为: main() { inta,b; cin>>a>>b;//输入a,b两变量的值 swap(a,b);//直接以变量a和b作为实参调用swap函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 CTO 下载 C+
文档标签
- 51CTO下载ServU
- 51CTO下载CoreJava
- 51CTO下载VPLEX
- 51CTO下载cisco
- 51CTO下载Win
- 51CTO下载
- 51CTO下载FTP
- 51CTO下载IBMX3650M3RAID
- 51CTO下载Dynamipsgui
- 51CTO下载VPN
- 51CTO下载下半年
- 51CTO下载KB66MFBMF
- 51CTO下载windows
- 51CTO下载IBM
- 51CTO下载Android
- 51CTO下载VMware
- 51CTO下载ServerGuide
- FTP服务器构建软件ServU图解教程FTP服务器
- servu安全配置
- Oracle11g服务端安装教程
- 下载和安装软件下载安装软件
- SQLServer安装和配置过程安装
- 软件安装配置
- WINDOWSSERVER终端服务器安装
- FileZillaServer配置FTP服务器教程Server配置
- 服务器安全设置教程