C++学习宝典(笔记)_第1页
C++学习宝典(笔记)_第2页
C++学习宝典(笔记)_第3页
C++学习宝典(笔记)_第4页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

**********************2010年09月01日星期三13时42分08秒(第一天)生存的权カ,珍惜生命,因为不是每个人都有生存的权カ生存的责任,人存于世,不是只为自己,而是为回报关爱你的人生存的信念,生存的不应是肉体,而是一种精神,生存的价值,生存的中止当你结止生命的那一刻,linux2c6c++7数据结构4模板3??UC(脚木编程)运行前修改PATH,如不改执行./a.out改后可以在任何路径a.outvi〜/.bashrc在最后一行加入PATH=$PATH:.source/.bashrc在二/exrc中可以加入以下内容,提高在VI中的输入代码的效率setts=4 代表TAB是四个空格setnu 设置行号ab#i#include语句取别名ab#o#include<iostream>abususingnamespacestd;abmainintmain()abrereturnO;g++-chello,cppg++hello,oa.outg++-onewnamehello,cppnewname区别:C语言cchello,ca.outcchello,c-onewnamenewname区别:调试(有待增加)cchello.c-g-〇newnamegdbnewnameb25设25行为断点,可设多个r从头整体运行s执行下一行P变量名:可以输出执行到该行时变量的值quit退出命令都是shell处理的。每个程序都是ー个进程。ps可以看到系统中有哪些进程tcshcshkshbashzsh可切换到不同的shell中exit退出ー层•—层的退execcsh执行后用新的csh代替bashsu切换帐号如su用户名 要求输入密码(但不显示)也是用exit退出Is-a-R-F-1Is-F:给目录加标记,区别是文件还是目录1s-1:可以看 文件类型、文件的权限、硬链接数、用户名,组名,字节数,最后一次访问时间,文件名1s-1-d目录名;是看到目录本身ls-l:d开头是目录,ー开头是普通文件,1开头的是链接文件,.开头的文件是隐藏文件,文件名后跟・号表可执行文件,文件名后跟@表快悽方式touch:文件不存在新建,存在修改最后ー个访问时间硬链接:多个名子指同一个文件,Indir/flrename;(就是把f!在当前目录下硬连接成rename)这几个名子只要有一个还在就可以用(如可执行文件建立一个硬连接后,源文件删除,硬连接还能执行,就是防目丢失。)软链接:相当快捷方式In-s/bin/dateda;(/bin/data是个可执文件,在当前目录下建立一个快捷方式da,执行./da可执行)(可1s-1找到以・结尾的文件名即可执行文件)(软链接可以分别执行)区别: (软链接可以不在同一个目录下,也可以不在同一个物理设备下:硬链接必须在同ー个特理设备上)(软链接可节省空间:硬链接占用空间)(软链接依赖源文件;硬链接可独立执行,)umask屏蔽权限,默认〇022,同组各其他组人不可写;如umask0700就是把自己的所有权限给屏蔽了,(不可以这样作)0666屏蔽掉0022就是0644指定权限:可以用数字如chmod0744文件或目录名也可以用符号chmodu=rwx,g=-,o=r文件或目录名 (表自己可读可写可执行,同组什么都不可,外组只可读,)如chmodu-x,go+w文件或目录名(表去掉自己的执行权限,给同组及外组加上写权限)如chmoda+x文件或目录名(表任何人都可以执行)pwd查看当前位置,可以cddir然后pwd刚打开终端时pwd看到的是主目录。cd”是主目录,如cd、用户名:可进入指定用户的主目录严格区分大小写,参数一般可以合并写***********************2010年09月02日星期四11时00分10秒(第二建立目录:mkdir目录名;删除目录;rmdirdl,d2;删除文件:rmfl,f2,f3;删除文件中可用通配符:?代表一个字符,・代表多个字符。如rmf??:或rmf*;如rm*tj;删除指定目录和文件(不管是不是空):rm-r目录和文件名删除时要求确认是否删除的提示:rm-r-i目录和文件名;复制文件:cpflf2dirl;把fl,f2复制到dirl目录下(但不能复制目录)复制文件和目录:cp-rdirldir2flf2dir3;是将目录和文件复制到dir3目录下移动文件:mvfl..?表把fl移到上ー级目录下。文件改名:mvdirlnewname;给目录改名如cal看当前的日期date年日期时间查看文件:catfilename;如查看的文件比较大查看文件的前十行:headfilename;(默认前十行)如head-3filename(查看文件的前三行)查看文件的后十行:tailfilename;(默认是后十行)如tail-5filename(查看后五行)如:head-1filel>>file去(把文件filel中的前十行追加到file2中去)在屏幕上看ー些东西:echofilename;>,输出符号重定向:把输出到屏幕上的东西输出到文件中去如date>dirl/fl(如不是当前目录,一定带文件路径)>>追加如cal»dirl/fl(将cal追加到dirl/fl中去)如echohello,tanjie»dir/fl;(因为是字符用echo与>>配合使用)如fl>f2;cat>fl;(从键盘上输入内容到fl中)可catfl査看一下cat<f2>f1;catflf2f3>f4cat跟重定向在ー一起使用,可以用于文件的连接<,,称为管道:把ー个命令的输出直接转给令一个命令如ls-1/dirImore:就可以实现ー屏ー屏的显示査看用户名:who找自忆(详细):whoami找自己:whoami表求谁在哪个终端什么时候在干什么:w(whowherewhat)进程:同一个程序运行五次,就是五个进程:ps;(当前终端的进程)列出所有的进程不管是哪个终端:ps-e(s的值为:R表运行状态。〇表等待状态,T挂起状态暂停,Z僵尸进程)睡100秒:sleep100;ctrl+z;把这个进程挂起,让其去后台,然后ps-fT;可以看到sleep进入挂起状态让进程一开始到后台运行:如sleep100&;(就是多加一个&中止ー个进程:kill%后台任务编号;(后台任务号可通过jobs看到)kill进程号;强行中止这个进:kill-9进程号;()看目录下使用内存的情况:du/dirl;列出/dir目录下的磁盘使用情况以字节为单位看内存的使用情况:du-k/dirl;以字节为单位看该目录ー共使用多少字节du-k-s目录名看剩余空间:df-k〜(表看主目录下剩余的空间)查看网络是否畅通:pingip号内核IP路由表的使用情况:netstat-rn;每个命令都是一个可执行文件:可以看每个命令在什么地方:whereisIs(看Is命令在什么地方)也可以:whichIs可以给命令起别名:如aliasten=cal102010J执行ten命令;(ten就是这个命令的别名,可用ten执行)删除别名:unaliasten;(删除别名ten)环境变量:env:(例如可以修改PATH环境变量的值)如:env|grepPATH;修改环境:如exportPATH=$PATH:.(就是修改PATH环境变旦,加上当前目录)(只针对当前终端)$可以表示环境变量的值:$PATH;(表PATH=右边的内容)如想长期修改:就要修改配置文件〜/.bashrc(每次打开终端就会自运打开这个文件执行里面的命令)可用如echodate»7.bashrc;(则每次打开终端就显示一次时间)(bash下的配置文件是、/.bashrc; csh下的配置文件是〜/.cshrc)kate./bashrc;(是个编辑工具)vi./bashrc;(也是编辑工具)更新文件,使之后效:source./bashrc;表跳过空格:如echo'hello world)”"表会原样输出:如echo"hello world"‘命令’表这个命令拿来的输出结果如echo"hello'PWD'";会显示hellohfsdl006、转义字符:如echo"\$PATH";会显求$PATH,而不是PATH的值exporteditorkate;编辑定时任务crontab-1-e清楚定时任务crontar-r再kate中编辑如下分钟小时日月星期命令(这句是注释没有这句,・可表不管是星期几,也可写成1-5)3016 29 3*date>fl保存,(表示这个日期下输入日期到fl中)vi的使用方法 请忘记鼠标!vi文件名vi有两个模式:命令模式(只接收命令)(默认模式)插入模式(只接收文字)从命令模式进入插入模式a后插i前插 〇在光标之下插入ー个空行从插入模式进入命入模式按ESC命令模式下:20a会插入20个aI在这一行最前面插入,A在这一行在最后处插入0前插入行删除:x(删除光标所在的字符)5x可删除5个字符删除到ー个单词的末尾dw,从本行删除下ー个单词的开头。删除一整行dd从光标位置删除到时本行的行尾d$;从光标位置删除到本行的行首do;取消当初删除的内容u也可将删除的东西再粘贴回来p修改ー个字符rCC替换到行首CO替换到行尾c$;复制ー个字符,y复制5个字符5y粘贴P***********************2010年09月03日星期五08时22分15秒(第三开始C++!!!!!!!!C++程序运行过程g++-chello,cppg++hello,oa.outg++hello,cpp〇-newnamenewname也可以在命令行g++hello,cpp;a.out(写在一行)步骤编辑器 vigedit编译器 g++(其实g++也做了连接)连接器(linker) Id执行 a.out博行execute也可以只让g++编译g++hello.cpp-c得到目标文件hello.〇,然后再做连接g++hello.〇;也可g++hello.〇-〇hello;〃预处理:ifndef或include表预处理输入输出流:#include<iostream>域名空间usingnamespacestd;main函数是程序的入口;cout:输出流(可以自己识别数据类型)cin:输入流endl:换行;转义字符:\t(等于tab)\r(回退到行首前面输出内容无)\b(回退ー个字符)把另ー个文件插入(任意位置):#include〃myfile.tj〃(就会执行另ー个文件的内容)(注意没有;里面的内容也是C++语句函数

1970/1/1/0:0::〇到现在的秒数:time(NULL) #include<ctime>字符串的实际长度(不包括、〇):strlen("字符串");结果是6 #include<cstring>比较字符串的大小是比ASCII码,返回正数负数和零:strcmp("hello","world") #include<cstring>可以直接输出函数cout«f()«endl;字符的ASCII码从〇〜127(计算计用8bit表示一个字符,即ー个字节)‘A'~'Z' 65-90'a‘〜'z' 97〜122‘〇’〜‘9' 48〜57ASCII是〇:0,false,'\0',NULL类型short短整形(一32768〜32767) 2个字节int整数 4个字节unsignedint表非负整数(〇、) 4个字节long长整型 4个字节(后缀L1)char字符(一128〜char字符(一128〜127)unsignedchar(0^255) string字符串 float单精度小数ーdouble双精度小数——longdouble长双度小数 bool布尔(布尔值truefalse)-1个字节!个字节-4个字节-4个字节-8个字节—12个字节(后缀f)(后缀d)(后缀Id)!个字节注意sizeof(string) 结果4sizeof("123456789")结果是10,因为有一个'、〇’相当于strlen()+lfloat/double类型如小数位数取决于前面整数部分的大小负数是用补码表示:一128表示(补码:正数到反再加1)(最高位符号位一定是1)128->10000000取反ー>01111111再加1—>10000000-1表示1->00000001取反>11111110再加1一>11111111C++中不能直接写二进制表示一个数;(十进制,ハ进制〇开头,十六进制Ox开头)变量名(见名知义):字母下划线开头,字线数了下划线组成,如学号StudentNumber关键字:编辑时会变颜色变量的类型及作用范围局部变量:在函数内部和复合语句中定义的变量,作用范围只在函数各复合语句中,形参也是局部变量全局变量:在函数外部定义的变量,作用范围,定义处到本源文件结束局部变量与全局变量发生命名冲突,在局部变旦的作用范围,局部变量起作用:定义命名空间namespace命名空间名{定义变量并初始化;定义函数;}使用命名空间中的变量命名空间名::变量名 表命名空间中的变量(同名可必免发生命名冲突)命名空间名::函数名〇 表命名空间中的函数::变量名 表全局的变量使用哪个命名空间要事先声明:usingnamespace命名空间名;(std是c++标准命名空间)也可以using命名空间名::变量名;先声明using命名空间名::f();常量:定义常量:constdoublepi;conststringmyname="tanjie”;〃常量的值称字面量符号常量:#definePI3.14159 (即以标识符形式出现的常量)(是预处理命令)算术运算:+—*/:有一个数是float型,则结果是double(因为C++对于float型都按double类型处理)%:两侧均应是整数/:有一个是负数,则结果是负数算术运算自动类型提升:boolcharshortint >int(运算必转,即使是两个shortint运算,结果也是int)float >double(必转)int>unsigned >long >double(两个运算数不同类时转)上面是自动类型转换:还有强制类型转换〇

算术:+—*/%++— (结合性:后++(自左向右);前++(自右向左))关系:><==>=<=!=逻辑:&&||1位运算:くく》〉&一〜赋值:=+=-=*-/-%=»=«=&="=!=条件:?:逗号:,指针:*引用和地址符:&求字节符:sizeof()强制类型转换:(类型)成员:.指向成员:ー〉下标:ロ其它:〇动态分配空间运算符:new释放空间运算符:delete抛出异常运算符:throw(注意:逗号运算符结果是最后ー个表达式的值,但多个,结合性自左向右)优先级()ロ—>.单目算术关系逻辑(不包括!)条件赋值逗号结合性三目运算符?: 三目运算符?: 赋值运算符例:inti=123:输出〜i+1或inti=123I输出0-i例:inti=123:输出〜i+1或inti=123I输出0-i输出〜1 结果是。cout«trueくくendl;输出结果1;cout«boolalpha;cout«boolalpha;这句话是告诉输出布尔类型用字母表示cout«true<<endl;输出结果是true记住:非〇就是真!80 输出假〇!0.464674输出〇记住:输出表达式用括号cout«3>5«endl; 错误,因为<<输出运算符是单止的髙于双目〉cout«(3>5)«endl; 正确sizeof(类型) 输出类型所占有的了节数sizeof(变量/表达式) 分析结果的类型,输出占有多少字节指针知识点ーpointerl=&a;pointer2=&b;若不想改变a,b值,只想改变输出顺序,可用指针改变指向可int*p;p=pointer_l;pointer_l=pointer_2;pointer_l=p://完成交换指向,即些时pointerl=&b,pointer_2=&a,而a,b值并没有改变。指针知识点二:pointer_l=&a;pointer_2=&b;实参(pointer_l,pointer_2)形参(int*pl,int*p2)实参到形参之间的传递是单向的值传递,如写成voidswap(intx,inty);xy改变后a,b的值并不会改变而用指针作为形参与实参,传的是地址,让形参和实参指向同一个地址,形参可直接操作实参所指向地址中的数据。如操作・pl,*p2,用到中间变量应定义inttemp,而不是int*temp;因为temp所指的单元不可预见,如・temp=*pl这样就有可破坏系统中的数据。总结:实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作为函数的参数也是单向的值传递,就是形参如改变的是形参所指向的地址,不会传给实参,即实参的指向没有变:如果形参改变的是形参所指向变量的值,则主函数中变量的值会改变。??经典考试题:为什么使用指针做为函数参数答:因为函数调只可以得到ー个返回值,而使用指针变量做为函数参数,可以通过形参指针变量改变主调函数中变量的值,相当于通过函数调用从被调用的函数中得到多个值。指向数组元素的指针可以p=a:1加1循环输出・(p+i);或者可以for(p=a;p<a+10;p++)输出・P或者可以for(p=a;p〈a+10)输出・p++等价于*(p++)用指针变量作函数参数接收数组地址当用函数调用时用数组名和数组的个数做为函数的实参,因为传递的是数组的首地址,所以用指针做为函数的形参,可以接收从实参传递过来的数组首元素的地址。此时p=a;就可以用*(p+i)来操作数组中的元素。实参与形参的几中情况实参 形参数组名 数组名数组名 指针变量指针变量 数组名指针变量 指针变量〃注意:(1)实参数组名a是个常量,或者说是指针型常量,不能改变a的值,如a++错误而形参数组名a是个指针变量,不是ー个固定的地址值,它的值可以改变。在函数调用开始时,它接收了实参数组的首地址,在函数执行期间,它可以再被赋值。(2)当是第一种情况时,实参与形参都是数组名时,实质就是把实参的数组首地址赋给了形参作为首地址,实质操作的是同一数组,而用二个名子。多维数组inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};--------a[i][j]=*(a[i]+j)=*(*(a+i)+j)方法一:int*p;p=a[0]:循环条件p<a[0]+12;输出・p++二维数组的首行是指向ー个ー维数组,a[0]代表&a[〇][〇],而a代表的是&a[〇]并且P定义成int・类型,如赋值成a,是p应是ー个二级指针(即指向地址的指针)/如令循环初始值P=a;循环条件p〈a+12就代到p从数组开头向后移动了12个ー维数组,而不是12个元素方法二:int(*p)[4];p=a;输出*(*(p+i)+j);//即输出的是第i行j列的元素,ij都是从〇开始定义P是指向ー个int口的指针,p=a;代表p=&a[0];而p+1则表示的是&a[l],即p指向了下ー个ー维数组。而・(p+1)就是a[l],a[l]又表示&a[l][0];,所以(*(*(p+i)+j)=*(&a[i][O]+j)即得到每个元素注意:int*p[4];int(*p)[4];因为下标ロ的运算级别高于大,所以前者先p[4]表示p是个数组,每个元素是个int*;即p是ー个int・型的数组后者・P先结合表示P是个指针,再与口结合,表示P是个指向int[4I的指针用指向ー维数组的指针作为函数的参数,可以输出ニ维数组inta[3][4]的各个元素即int(*p)[4]作为形参,实参是ー维数组的地址a,或&a[0],然后用i,j分别控制双重循环,输出・(*(p+i)+j)重点:*(*(p+i)+j)=*(a[i]+j)=*(&a[i][0]+j)字符串的存放有四种方法(1)可以用字符数组,charstr口="IloveC++!”;(2)可以用字符串变量,stringstr="IloveC++!";(3)可以用字符指针指向ー个字符串,char*str="IloveC++!〃;可以直接把ー个字符串的常量赋值组ー个字符型指针变量,实质是把字符串的每ー个元素的地址赋给了str;(4)可以先用字符数组定义ー个字符串,再用字符指针指向这个字符数组即charsロ="IloveC++!";char*str=s;四种方法都可以将整个字符串一次性输出cout«str«endl;即会输出整个字符串字符串的存取方法(下面完成一个将串str!复制到str2的例子)(1)下标法与指针法相结合charstrl二'IloveC++!”;charstr2[20];char*pl二strl,*p2二str2;for(;*pl!二‘、〇’;)*p2++=・pl++;注意coutくくplくくendl;coutくくp2くくendl;之前要使plp2指到串首,即pl二strl;p2二str2;(2)用字符串变量来复制一个字符串相当方便:就是将一个字符串赋值给另一个字符串就可以了。stringstrl二IloveC++";stringstr2;str2二strl;cout直接输出strl,str2就可以了。函数的指针:一个函数在编译的时候分配给一个入口地址,这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。定义函数的指针变量的方法:int(*p)(int,int); 函数类型(・指针变量名)(函数形参表):可见P是ー个指针,指向int(int,int)的函数,就是说p是ー个指向返回值为int.两个形参也为int类型函数的指针区别于指针函数int*p(int,int) 即返回值是指针的函数因为()的优先级高于・,所以p与()先结合,说明p是ー个函数再与int・结合说明p是ー个返回值是int*的函数用函数指针变量调用函数方法:int(*p)(int,int);〃定义函数指针p=max;//让p指向函数max(这里的函数名代表的是函数的入口地址,而若写成max(a,b)则成了函数调用)intm=p(a,b);//通过函数指针调用max(a,b);等价于intm=max(a,b):当然前提是有个intmax(int,int);的子函数:注意:*p就是函数调用用指向函数的指针作为函数的参数思想是:把函数名作为实参传给其他函数的形参,这样就可以在调用•个函数的过程中根据给定的不同实参调用不同的函数如intf(inta,intb,int(*p)(int))分别编写几个函数fl,f2,f3;通过函数指针分别指向fl,f2,f3,(然后调用f()三次,就可以实现在ー个函数中完成不同的功能返回值是指针的函数如int*f(int,int) 类型名・函数名(参数列表):指针数组:char*pロ; *********************2010年09月06日星期ー09时38分43秒(第四操作符&:取地址符,(ハ位十六进制数表示)一般越先定义的变量地址越大,因为用到栈.变量不一定按顺序存放,有预留的空间,*:可以通过地址找变量・号与&是同一级别,但运算自右向左结合如・&n:取的是n的值,也可以・&n=67;重新给n赋值若&*n没有意义强制类型转换charc=,a(int)c=97 等价int(c)=97inti=65(char)i=,A" 等价char(i)='A'doubled=234.56 (int)d=234等价int(d)=234(注意是截取,不是四舍五入)inti=-l, (unsigned)i=很大的ー个数位运算:<く>>&r、«>>:不得超过类型的总位数,如int型共4个字节,最多位移31位くく左移:右边补〇>>右移:对于非负补0,可正可负补符号位或者说:对负数补1,非负数补〇&按位与:两个数的二进制数各个位按位相与(只有全为真オ为真,相当于乘法)例:可以把某一位置〇:因为任何位数与1相与都是它本身,即1&1=1,0与1=0,而0&0=01&0=0,按位或:各个位相或(有一个为真则为真,,)例:可以把某一位置1,因为0丨0=0,1或0=1,而1丨1=1。0或1=1”按位异或:各个位异或(相同则为〇,不同则为1,相当于加法)例:1跟谁异或就给谁取反,如0~1=1, 1*1=0&&逻辑与:(而且)短路运算问题: 如&&前为假,后面就不作运算判断,结果直接为假如:卡号有效&&密码正确&&取款金额<=存款额I!逻辑或:(或者)短路运算问题:如II前为真,后面就不作运算判断,结果真接为真有时会出现错误如a++>5|b++<10,当a++大于5后,b就没有++,所以要避开这种写法条件运算: 三目运算符,(高于赋值运算符,逗号运算符)表达式1)?表达式2:表达式3当表达式1为真,计算执行表达式2,为假,计算执行表达式3(可见也存在短路问题)经典例题:inta=10,b=10,c=10;cout«boolalpha;cout«(a++>5||b++>6||c++>7)<<endl;cout«*a=",«a«*b=*«b«*c=*«c«endl;//结果 a=llb=10c=10cout«(a++<5&&b++<6&&c++<7)«endl;cout«*a=*«a«*b=*«b«*c=*«c«endlJ〃结果 a=12b=10c=10上面是短路问题:丨I前如果为真,后面的不做计算,结果真接为真所以只执行了a++&&前面的为假,后面的不做计算,结果真接为假,所以只执行了a++另外,coutくくboolalpha;声明后面若输出真假时用true,false表示,否则输出的是1与。双目运算符,运算级别最低。(结果等于最后•个表达式),逗号运算符 双目运算符,运算级别最低。(结果等于最后•个表达式)如(a=3*5,a*4),a+5先a=15,再a*4=60,再15+5=20(因为a=15) 逗号表达式最终结果=20注意:++ーー=会改变变量的值,其它运算符会有一个空间保存临时结果goto标签名!;IBM取款机流程:循环插卡(判断是不是无效卡),输密码(反复三次)循环:菜单选择(分支){1查剩额取款存款退出)输金额取钞if—else经典:闰年的判断:if((y%4=0&&y%100!=0)||(y%400==0)) isleap=true;else isleap=falseswitch语句while语句作业:1、从键盘输入一个班所有同学的成绩,一1表示输入结束。请统计这个班的最高成绩,最低成绩,平均成绩(最好用dowhile)2、从键盘输入ー个整数,输出它的中文读法(如3906:叁仟玖佰零陆)如!00353,超市只有50、20、10、5、2、1(单位:元)、面额的钞票,从鋅盘输入需要找的钱数,输出找车钱的最佳方案。(就是钞票数最少的)*********************2010年09月07日星期二09时43分00秒(第五循环:也叫迭代,反复标志名:代码行while(true)!这是一个死循环,不过是假的if(条件)break;(只跳出ー层循环)goto标志名;(可以通过设置标志用goto跳出多层循环)}for(;;){for无限循环比while效率还高,因为不做判断do{先执行ー次do,然后判断,条件为真就执行do}while(条件);〃注意分号while(条件)(条件为真就执行!for(i=0;i<10;i++)〃for就是把真正控制循环的提取出来(cin»x;〃只有这一句是循环真正要做的)等价于inti=0;while(i<10)(cin»x;i++;echo1020304050>input将这些数追加到文件中catinput从文件中看这些数a.out<input执行时从文件中读a.out>input把执行结果写入文件continue:是跳出循环体,结束本次循环,而不结束整个循环,循环还向下继续continue到调整部分即i++,再到循环条件。例:continue与break的对照intmain()(intscore=0;intsum;intcnt=0;for(inti=l;;i++)〃注意这里不控制次数(coutくく"学生"くくiくく"的成绩”;cin»score;if(score==-l)break;if(score<0||score>100)(coutくぐ无效成绩”くくendl;continue;}sum+=score;〃若continue,break程序都没有执行cnt++;}coutくく"cnt="<<cntくくendl;cout«"sum="«sum«endl;return0;Fibonacci数歹リ:1123581321345589(第12个数为1,1从第3个数开始,每个数是其前面两个数之各)即:Fl=l (n=l)F2=l (n=2)Fn=FnT+Fn-2 (n>=3)用typef声明一个新的类型名来代替己有的类型名。(注意它不能创造新的类型)如:typedefintINTEGER;如:typedefstruct{intmonth:intday:intyear;}DATE; DATE是新的类型名,而不是结构体变量名;typeintNUM[100]; 声明NUM为整型数组类型,包含100个元素NUMn; 定义n为包含100个整型元素的数组typechar*STRING; 声明STRIGN为字符指针类型STRINGp,s[10]; p为字符指针变量,s为指针数组(有!0个元素)typeint(*P0INTER)() 声明POINTER为指向函数类型,函数返回整数型POINTERpl,p2; pl,p2为POINTER类型的指针变量typedefunsignedshortintUSI;〃给类型起新名。就是把无符号短整形起名USI测试因为USI最大是655535,USIa=65536;//会有警告,结果回到最小值,输出a为〇计算机或输出inf表无穷大,一inf表负无穷大enum枚举类型:是对整数的细分,让原本没有函义的数值变得有宜观的函义(定义方法: enum枚举类型名{枚举常量列表};如)enumWeekDay{MON=1,TUE,WED,THU,FRI,SAT,SUN=O};〃默认〇表MON,1表TUE……也可以指定:现在就变成1234560enumRadix{BIN=2,0CT=8,DEC=10,HEX=16};〃用整数表进制enumSuit{HEARTS,SPADES,DIAMONDS,CLUBS};〃红桃,黑桃,方片,梅花enumRank{TW0=2,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE=1};〃扑克牌枚举类型也是ー个变量Suits=CLUBS;cout«s«endl;结果是3intn;s=(Suit)n;〃必须强制转换,int不会自动转换成enum类型。直接定义枚举变量 enum{sun,mon,tue,wed,thu,fri,sat}workday,weekend;数组:有序数据的集合,数组中的数据称为数组元素(数组名和下标可以唯一标识一个数组元素。)在内存中占有一片连续的存储空间。定义ー维数组: inta[10];类型标识符 数组名[常量表达式];〃常量表达式:可以是常量,常变量,符号常量intn;cin>>n;inta[n];(以上三行错误)可以改为:constintn=5;〃代表n是常量inta[n];数组初始化:可以intaロ={1,2,3,4,5};系统会自动定义数组长度为5初始化可以成组初始化,但赋值必单个赋值。sizeof(数组名)如chara[6];inti[6];sizeof(a)=6;sizeof(i)=24;〃表明数组所占的字节数,而不是元素的个数。注意:在VC中不可以inta[6]二ロ; 要定成inta[6]={0};使用数组不要越界,二维数组inta[3][5]={{l,2,3,4},{6},{7,8}};〃相当于3个含有5个元素的ー维数组for(i=0;i<3;i++)(for(j=0;j<5;j++)cout«a[i][j];区别:C++:new:动态分配 delete:撤销内存的运算符(是运算符,执行快)C:mallocfree来来分配和撤消内存空间(是函数)new运用方法:如newint(100) new类型[初值]用new分配数组空间时不能定初值,如果因为内存不足等原因无法分配空间,用new会返回ー个空指针NULL,用户会根据该指针的值判断分配空间是否成功;newint;开辟ー个整数的存储空间,返回一个指向该存储空间的地址newint(100);开辟ー个整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址newcharU〇];开辟ー个存放字符数组*********************2010年09月08日星期三09时12分20秒(第五用户自定义的类型:结构体struct,共用体union,枚举类型。类类型class(结构体与共用体的变量都不可以直接输出,只能输出变量的成员。如)数组:数组中的各元素素是属于同一类型。结构体:可以把不同类型的数据组合成一个有机整体结构体类型的定义方法:struct结构体类型名{成员列表}; C++中的成员列表中可以有函数,但有class就不用了成员声明:类型名成员名;变量的定义如定义班级类型的数组structClass{〃在自定义类型名时关键字的首字母总是大写,防止与系统关键字冲突intid;〃班号intstudent_namber;//学号stringteacher;〃老师stringcourse;〃课程intdate[3];//共用体union:所有的成员共用同一块内存。共用体类型数据的特点:1、使用共用体的目的时希望使用同一个内存段存入几种不同类型的数据。2、能够访问的是共用体最后一次被赋值的成员,在对ー个新的成员赋值后原有的成员就失去了作用。3»共用体变量的地址和它各成员的地址是同一个地址。如&pl二&=&pl.age4、不能对共用体变量名赋值,不能企图引用变量名来得到ー个值5、不能在定义共用体变量时对它初始化,不用用共用体变量名作为函数的参数。#include<iostream>usingnamespacestd;unionIP{unsignedintaddr;〃占4个字节unsignedcharbyte[4];〃重复使用addr的4个字节,);intmain()(inti;unionIPmyip;coutくく"*************************************"くくendl;〃以下是~・个小用途myip.addr=0x41424344;for(i=0;i<4;i++)coutくくhexくく(int)myip.byte[i]くくendl;〃结果44434241(低位 >高位)return0;}/*int数在内存实际存储是:低字节 >到高字节;小用途:利用共用体,可以求出多字节类型数据,在内存中各个字节上所存的数据'共用体与结构体的区别:共用体:变量所占的内存长度等于最长的成员的长以。结构体:变量所占的内存长度等于是各成员所占内存长度之和。,每个成员分别占有自已的内存单元。输出十六进制cout«hex输出ハ进制cout<<oct输出十进制cout«dec函数调用:(用到变量的引用,用到数组名,作为参数)是实参中的数据复制ー份传到形参中,称为值传递,而值传递是单向的。&引用:就是给起了个别名,共用同一个内存空间〃注意:凡跟在类型后面的就不是运算符引用不分配空间,总是跟初始化它的变量用同一块内存空间,如果初如化的不是变量,要加const如constint&d=888;〃但没有任何意义引用必须使用之前必須要初始化,而目.终生不变intmain(){inta=13;int&c二a;〃引用:coutくく"a="くくaくく"c="<<c<<endl;a=14;coutくく"a="くくaくく"c="«c<<endl;cout<<"&a="«&a<<"&c="«&c«endl;return0;引用作为形参 (以下是使用方法),形参中使用实参的引用:可以使形参与实参共用同一个内存空间区别以下两个子函数Personsetdata(Personp,strings,boolb,intn,doubled){=s;p.gender二b;p.age=n;p.salary二d;returnp;〃必加这一句,因为是传递是单向的,如无返回值P不会给pl}主函数中pl二setdata(pl,"陈宗权",true,40,40000);voidsetdatal(Person&p,strings,boolb,intn,doubled)〃引用,实现双向传递{〃这里的形参引用是用实参来初始化Person&p=pl;=s;p.gender二b;p.age=n;p.salary二d;主函数中setdata(pl,"陈宗权",true,40,40000);静态局部变量staticintn=0;//,初始化只在每一次调用它的时候初始化一次,它的空间直到程序结束オ释放;(写在函数中,所以是局部的,作用范围也只是在定义他的函数中)引用作为返回值类型 (方法如下)int&count()(staticintn=0;//静态局部变量,初始化只在每一次调用它的时候初始化一次,它的空间直到程序结束オ释放;++n;returnn;}intmain(){for(inti=0;i<3;i++){cout<<count()«endl;)count()=0;〃正确;因为返回的是引用;实质全局静态变量可以达到这个目的,但尽量少用全局变量for(inti=0;i<3;i++)(cout<<count()«endl;)return0;}如果n不是static,在主函数中使用count()=0错误;因为n已经释放了,还要引用空间中的值所以错误如果int&count。{}不用&,错误因为return。带回一・个值时,是每次返回时,到值复制到一个临时空间作为结果;但返回的是引用,即返回值是n的引用时,这句就可以,达到归〇的目的cout«&counM)«endl;〃返回值用引用;意思带回返回值时不需要临时开ー个空间,真接使用return()的空间函数调用时实参是数组 总要传递两个参数一个是数组名,ー个是数组的个数注意swap(任何基本类型元素1,任何基本类型元素2);〃可直接使用。这是系统已经定义好的函数函数的声明,1放在函数定义最上面,也可以在ー个函数里面声明另ー个函数2,函数声明时,形参的名子可写可不写3I必加:号*********************2010年09月10日星期五09时04分05秒(第六遨归:recursive在调用ー个函数过程中又出现直接或间接地调用该函数本身(函数在实现过程中调用自己)重载 同一个函数名多次使用函数的重载:。verload(就是ー个名字定义多个函数,这些函数的参数个数和参数类型不同)就是说重载:要有不同的参数表(即1、参数的个数,参数的类型,参数的顺序不同),函数参数表与返回类型无关。编译器会根把参数的个数,和参数的类型,形参的顺序不同来区分调用哪ー个函数汇编中call函数名,所以发生冲突,而C++会在编译时对其名子进行更改测试:可在函数前加extern"C”定义函数部分。表明采用C的方法,不可以改名,编译就无法通过voidprinttime(inthour,intminute=0,intsecond)=0形参的默认值:在调用函数时有默认值的形参,可以不传值 ー减少工作量定义规则:没有默认值的形参,定义时要靠右,传参总是依次传递,不能中间跳过某个参数,即使中间有提示如14,,20如声明与定义分开,只允许在声明中指名默认值,定义时不允许/*模板与函数重:载的区别:1函数模板:比函数重载更方便,程序更简洁。它适用于函数体相同,函数的参数个数相同,参数类型不同的情况如参数个数不同不能用函数模板。2函数重载:是定义多个函数,但函数名相同,参数个数可不同,返回类型可不同,参数类型可不同但不能只有函数类型不同,而参数的个数和类型相同如intf(int);longf(int);voidf(int)如运算符也可以重载:« >>即是位移,又作为输出插入运算符,和输入提取运算符堆:heap,栈:stack,栈中临时变量和局部变量,形参内联函数:(inline): 申请嵌入到主调函数中,为提高程序的执行效率就是在编译时将所调用函数的代码直接嵌入主调函数中,而不是将会流程转出去,这种嵌入到主调函数中的函数称为内置函数。也称内联函数。方法:如inlineintmax(inta,intb)〃在函数定义时请求内存做为内联函数注意:原则上不要声明,直接定义,内联函数中不能所括复杂的控制语句,如循环,switch.总之只有那那些规模较小,而又被频繁调用的简单函数オ适合声明inline.注意,string可以带回返回值,而char口不可以多个文件怎么合成一个文件,也可以起到保密作用mkdirproject日录:src:1,io.cpp2,char,cppmain,cppio.hchar,hg++~cmain,cppio.cppchar,cpp得至リmain,o,io.o,char.〇main,o,io.o,char.〇io.hchar,h可以给别人 这样就不泄露原代码 别人可以g++・.o就可以执行通过char,h中可以放如下内容 头文件:放函数声明,全局变量的声明externintg;,类型的定义。voidupper(charstr[]);voidIsLower(charc);voidToUpper(char&c);externintg;〃声明有一个外部全局变量,typedefintzhengshu;enumColor{RED,BLACK};structx{};用到自定义类型就加声明自定义类型的头文件 这样会造成同名的自定义类型重复定义,发生冲突每个头文件都这要用这个框架 编译时防止同名的自定义类型重复定义#ifndef头文件名_H〃如果没有定义头文件名_H这个名字就#defineTANJIE#define头文件名_H用户自定义类型#endif作业:能用重载(几个函数)实现大数运算。(+—文/任选其ー),如大数的十进制形式在30位以内(而int只有十位),表示形式用字符数组来存储,运算用op来表示voidoperate(chardl[],chard2[],charresult[])voidoperate(chardl[],intd2[],charresult[1)voidoperate(intdl[],chard2[],charresult[])从键盘输入ー些超大数据分别试试这些函数。注意int传值不要超过2的30次方一1〃注意:最好不要有在.h中有新类型名的定义,和全局变量声明的定义,可是只作声明。然后在某个.cpp文件中定义externintg;〃声明有一个外部全局变量,static用在函数定义和全局变量前面,表明只许在定义它的本文件中访问。static用在函数声明处表明只能在定义处访问)staticintg;(前面用到的static是静态局部变量。)typedefintzhengshu;变量的存储类别作用域:是变量的一・种属性,从空间角度又分为全局变量与局部变量存储期(生命期):指变量在内存中的存在期间。的时间角度来分析,存储期分为静态存储期和动态存储期。*********************2010年09月13日星期ー08时37分26秒(第七区别:变量的指针丨:ー个变量的地址称为该变量的指针指针变量:ー个变量用来存放另ー个变量的地址(即指针)则称为指针变量。输出字符址址:不是地址,是ー个&c开始,找‘、0’的字符串,所以是乱码输出其它地址:是地址输出字符串数组名:是从字符串首地址开始到''0'为止的字符串输出其它数组名:是个地址可以能过变量名(直接访问)和・P来得到变量(间接访问)pl是保存地址的变量*pl是保存地址中变量的变量给*pl赋值,pl的值不会改变如int*p;charc;p=&c;〃错误不可以将char・赋给int*〃用指针作形参:可以在函数中改变实参的值。〃ー个指针总是占有4个字节的指针〃形参中的数组,实质是ー个指针。voidprint(doublea[],intn)(coutく〈sizeof(a)<<endl;〃结果是4)intmain()(doublea[5]={l.1,2.2,3.3,4.4,5.5};cout〈<sizeof(a)く<endl;〃结果是40字符串指针 (以下ー、二、三的区别)ー、/字符串常量 在内存中是匿名的字符数组,放在静态存储区。constchar*p="aaaaaaaa”;〃加上const,表示・p所指向的变量是常量,不能再被赋值,而P是ー个指针变量可以再被赋值如:*p="bbbbbbbbbbbbbbb”;错误。p="bbbbbbbbbbbbbbbb”;正确。因为这个是p中所保存的地址改变,并没有去改变p中地址的值二、char*constq;表示指向字符串变量的指针常量, 就是说q不可以再被赋值,而・q可以再被赋值。三、指向字符串常量的指针常量 指针常量表示指针中的地址不可以再被赋值,*q也不可以再被赋值constchar*constq=aaaaaaaaaaaaaz/;,cout<<q«endl;q="bbbbbbbbbbbbbbb";〃错误,q的地址不可以在改变注意:凡是常量都应该初始化,如有了默认值,再赋值,错误。因为不会再有每二次机会再给他赋值/*命令行参数:argv[O]="a.out",argv[l]="用户输入argc至少为1*/intmain(intargc,char*argv[]){cout«"argc二くくargcくくendl;for(inti二。;iくargc;i++){coutくく"argv["くくiくく"]二"くくargv[i]くくendl;return0;)注意:加头文件 #include<cstdlib>atoi(argv[i]):把ー个命令行上的数字字符串转化为整数atof(argv[i]):把ー个命令行上的数字字符串转化为实数itoa:把ー个整数转化为・个数字字符串结构指针:保存结构变量地址的指针注意:C中不能直接使用结构体名,要struct结构体名结构体变量={}; 而C++可以结构体名结构体变量={};C中可以typestruct结构体名{。。。。。}新名字;〃实参是结构体变量的地址,形参是指向结构体变量的指针structProduct{charname[20];doubleprice;};〃注意分号voidshow(Product*p)(cout«(*p).name«":"«(*p).price«endl;〃写两种表示方法等价coutくくpー〉nameくく":"くくpー〉priceくくendl;〃表指向结构体变量的name属性的值intmain()Producta={"冰箱",2345.6);show(&a);//〃二级指针:保存指针地址的变量inta=10;int*p=&a;cout<<"&a=*<<&a«endl;cout«"&p=*<<&p«endl;int**r=&p;coutくく"r="くくrくくendl;〃是&p的地址coutくく"*r二"くく*rくくendl;〃是&p中的内容,即&acoutくく"**r二"くく・*rくくendl;〃是&a中的内容,即acout«"&r="«&r«endl"/是・*r本身的地址int*****k二NULL;(防止野指针) 称为空指针coutくく"k二"くくkくくendl;〃结果k二〇表示指向地址为的地方如:strcpy(至ル串) 也可以像操作字符串ー样,操作内存memcpy(到,从,字节数):〃内存的复制memset(地址,数据,字节数)〃内存的填充memcmp(地址1,地址2,字节数)〃比较两块内存的大小下面程序完成内存的复制/*void・表示不管什么类型的地址。用到const,表示所指向变量是个常量*/voidCopy(constvoid*from,void*to,intbytes)〃形参是两个指向任何类型的指针,所以下面要强制类型转换(char*f=(char*)from;〃转换在char*,任何一个类型都可以ー个字节ー个字节的操作。是因为指针++表ー个字节char*t二(char*)to;for(inti=0;i<bytes;i++)*t++=*f++;)intmain()(doubledl=123.456,d2=567.123;intnl=123456,n2=4556;intal[5]={ll,12,13,14,15);inta2[8]={0};Copy(al,a2,sizeof(al));〃把al内存地址中的内容复制到a2内存地址中Copy(&dl,&d2,sizeof(dl));Copy(&nl,&n2,sizeof(nl));for(inti=0;i<8;i++)cout«a2[i]«""〃结果:1112131415000cout«endl;coutくく"d2="くくd2くくendl;〃结果:d2=123.456coutくく"n2="くくn2くくendl;〃结果:n2=123456指向函数的指针:一个函数在编译时被分配ー个入口地址,这个函数的入口地址就称为函数的指针,(可以用一个指针变量指向一个函数,然后通过该指针变量调用些函数)voidfl(intn){cout«n«endl;}intmain()(coutくく&flくくendl;〃输出函数的地址总是真coutくくboolalphaくく&flくくendl;coutくく“(void*)&f1="くく(void*)&f1くくendl;〃转换在void・输出函数的地址,cout«"(void*)fl="«(void*)flくくendl;〃函数的地址,可以和数组地址ー样,不用&typedefvoidA(intn);〃将void类型有参数的函数,取别名AA*q=fl;q(5);〃调用fl,传入参数5void(*r)(intn)二f2;〃定义一个指向函数的指针,该函数返回值为void,传入参数为ー个int,r(123);〃调用f2,传入参数123 和上面的方法等价,但上一种比较笨拙/*函数的指针作为形参;这样函数由第三方来调用,函数有更好的通用性。*/boolrule(intx,inty){returnx>=y;boolrule2(intx,inty)〃比个位returnx%10>=y%10;)intfindmax(inta[],intn,bool(*p)(int,int))(intm=a[0];for(inti=l;i<n;i++){if(!p(m,a[i]))m=a[i];}returnm;)〃rule()是ー个规则:用来比较两个数据,如果符合规则就返回true,否则就返回falseintmain(){inta[5]={l,95,520,12,52};cout<<findmax(a,5,&rule)<<endl;cout«findmax(a,5,&rule2)«endl;)*********************2010年09月14日星期二09时55分19秒(第ハ指针数组:ー个数组,其元素均为指针int*p⑸;(P与口结合,表P是数组,再与・结合,表示此数组每个元素是int*区别于数组的指针:int(*p)ロ;(p与・结合,表示p是指针,表示它指向int口成员指针:/*intDate::*p表int型的Data成员的地址。for(inti=0;iくn;i++)cout«a[i].*pくく"";等价于下面for(inti二〇;iくn;i++,a++)coutくく(*a)・・p«"";coutくくendl;等价于下面for(inti=0;i<n;i++,a++)coutくくaー)・pくく”";cout«endl:*/structDate{intyear;intmonth;intday;);voidshow(Datea[],intn){for(inti=0;i<n;i++)coutくくa[i].yearくぐー'くくa[i].month«'«a[i].day«*}voidshow(Datea[],intn,intDate::*p){for(inti=0;i<n;i++)cout«a[i].*p«*"ノ/*p表Date的成员,a[i]表变量,合起来变量的成员cout<<endl;)voidsort(Datea[],intn,intDate::*p)(for(inti=0;iくn;i++)for(intj=i+l;j<n;j++)(if((a[i].*p)>(a[j].*p))swap(a[i],a[j]);}}intmain()(Datea[4]={{2010,4,5),(2008,8,8),{2010,12,24},{2000,10,10}};show(a,4,&Date::year);show(a,4,&Date::day);sort(a,4,&Date::day);〃按指定的成员day来排序show(a,4);)void*malloc(size_tsize);〃内存分配void*realloc();〃重新分配内存void*calloc(size_tnmemb,size);〃把新分配的内存块用填满;利用数组进行冒泡排序!!!!TOC\o"1-5"\h\z冒泡排序:8 9 5 4 2 0第一趟: 895 94 92 90 9 (5次)第二趟:8 5 4 2 05 84 82 80 8 (4次)第三趟:5 4 2 04 52 50 5 (3次)第四趟:4 2 02 40 4 (2次)第五趟:2 00 2 (1次)总结:N个数比较N-1趟 第i趟比较N-i次思想:每ー趟都是相邻两个数比较,小数在前面,大数在后面,如不是就交换,比较一趟之后可以得到ー个最大的数在最下面*********************2010年09月16日星期四09时19分09秒(第九C++:ー个函数,也可以做为结构变量中的一个成员structStudent()intnum;〃学号stringname;Student*friendl;voidinit(intnum,stringname)〃函数做员(Student::num=num;〃可用域操作符解决重名问题,当然可以把形参取不同的名,不过也可以不用,因为局部优先Student::name=name;}Ratio。{coutくく”*******”;});在主函数中:stu.init(11,"tanjie");在创建变量时,系统会默认调用ー个和Studnet同名的函数StudnetO。这个函数无返因类形,称为构造函数。所以不必自己写ー个初始化函数,直接把初始化变量成员的语句放在,构造函数中。(初始化可以防止出现垃圾数据)this:表示用来调这个成员函数变量的地址,如stu.init()那么this就是&stu;如在stu.init(){函数中可以stul.friendl=this;}类:class与结构体有以下最大的不同类中所有成员默认,只允许自己的成员函数访问不允许外部访问,除非声明访问权限private:私有的public:公开的Object:对象,就是类的具体实例。00面象对象抽象abs:是封装的前提]封装之后,可以保护数据描述对象的类象,创建对象,使用对象Pointpl,p2(7,9);〃在定义对象的同时,系统自动调用了带参的构造函数,完成了初始化。Pointpl();〃错误,因为会认这是ー个函数声明;ー个对象可以没有名字,称为匿名对象,如Point(7,9);只能当场使作如returnPoint(9,9);如f().print();Pointf()returnPoint(9,9);如果直接Point(9,9),构造函数:destructor析构函数:ー个函数在结束的时候,编译器也会自动调用ー个函数,称为析构函数作业:写ー个随机数类,提供ー个有两个参数的构造函数指定随机数的范围,成员函数intRand。用来每次调用取得一个指定范围围的随机数。.rand()〃就可以产2,写ー个时钟类,提供ー个构造函数。,把时间初如化成〇点。分〇秒。成员函数set(inth,intm,ints)来设置时钟的时间,无参的函数run让时中走起来怎么样时间过一秒反复掉用longt=time(NUll); while((time(NULL)!=t),如取到的时间跟一次时间不同了,意味着时间过去了一秒。*********************2010年09月17日星期五09时19分43秒(第十类的四大特征:封装,继承,多态,抽象类: 数据一般私有, 行为一般公有。构造函数:创建对象时,先分配空间,再调构造函数。析构函数:对象释放时,先调用析构,现恢复空间对象.成员this,成员〃this指向当前对象类名::成员引用&:双方共用同一块空间对成员变量初始化:可以在构造函数中写初始化列表格式 :成员变量名(所赋的值)Array(unsignedlen):n(len),p(newT(len)) 成员变量初始化列表(只用于构造函数中,代替下面两句)(//p=newT[len];//realloc()//n=len;cout«"分配额外"<<len«"元素空间在"<<pくくendl;类中的函数方法,约定不允许修改成员变量 在函数头后加const(表只对当前对象的数据成员只作读操作。)voidprint()const(while(n>0)〃而n是成员变量,这样就修改了n»这样不可以,改为inti二n:输出p[-i];cout<<p[--n]<<endl;零初始化TO:如对基本类型而言就是〇,而对于类,表示匿名对象p[i]=T();〃如p[i]只能放string型,而要p[i]=0;就错误,所以赋值T()进行零初始化动态生成:Arraya(5);constArrayb二a;〃复制ー个数组对象。就是b,a指向同一块new,所指的空间。而程序结束后,调析构函数。a所指的内存已经释放,再释放b所指的空间,系统就会提示:一放弃区别const的用法Timeconsttl;或constTimetl;表小tl是常Array(unsignedlen):n(len),p(newT(len))(p=newT[len];//reallocn=len;cout«”分配额外〃くくlen«〃元素空间在"くくpくくendl;}对象,其值在任何情况下都不能初改变(这个对象只能调用带const的方法)拷贝构造函数,ー个类有一个默认的拷贝构造函数Array(constArray&x)作用:如当ー个对象复制给令一个对象时用到自己定拷贝构造函数Array(constArray&x)把ー・个x.:n(x.n),p(newT[x.n])(//n=x.n;//p=newT[x.n];for(inti=0;i<n;i++)p[i]=x.p[i];只有使用了动态内存,オ有必要自己改写拷贝构造函数,否则默认就够了。如何修改类中,const类型的数据成员原程序T*constp;通过函数。可以把ー个常量的const属性去掉,把ー个常量临时转化成一个变量constcast<(T*)&>(p)=newT[len];〃把p变成了原来类型的引用。n=len;临时对象:Time(13,15,25);如果临时对象Time(13)它的初始值只有一个时,可以看成是类型转换临时对象,用过一次之后就释放组合对象,一个对象里面的成员又是另ー个对象,如ー个电脑对象又的显示器,主机对象。组合对象一定要有初始化列表,因为在建组合对象系统自动调用构造函数,会建一个里面成员对象的拷贝构造函数,而成员对象如里面有没有默认的形参值。就会出错用这三个函数,来代替C语言中的强制类型转换const_castく类型&>(常量)〃可以将一个常量,转化成变量。static_castく类型>(数据)〃首选这个reinterpret_castく类型>(数据)〃明知不安全还要类型转换作业1,写ー个日期类,数据有年月日,函数有三参构造函数。无参输入函数,无参输出函数。无参下一天,下一月,下一年,三个函数,比较大小。跟另ー个日期比较大小(小于返回负,大于返回正,相等返回〇)。作业2,写一个分数,分子,分母。函数有两个参数的构造。输入、输出,是否非零。跟另ー个分数相加相减,相比较(分母为〇无效)作业3,写ー个大数类,数据就是不超过30位的大十进制数,函数有字符串构造和整数构造,输入、输出、是否非零,跟另ー个大数相加、相减、相比较。作业4,C++字符串类,sizeof(string)==4,动态实现自己写ー个字符串类,数据是可以任意长度的一串字符,函数有构造函数(形参可以是C风格的字符串constchar*,或者是整数int,还可以是两个形参分别表示字符及重符及其重得的次数charint。),追加一个字符串,ー个字符,ー个整数或者多少字符,输入输

温馨提示

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

评论

0/150

提交评论