第01章-C++语言基础(一)更好的C_第1页
第01章-C++语言基础(一)更好的C_第2页
第01章-C++语言基础(一)更好的C_第3页
第01章-C++语言基础(一)更好的C_第4页
第01章-C++语言基础(一)更好的C_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

业精于勤荒于嬉行成于思毁于随

——韩愈课程目的本课程主要介绍应用C++语言进行程序设计的基本原理与基本方法,通过课程学习和上机实习,培养学员使用C++语言进行程序设计的能力和实际系统开发的能力,为其它课程的学习和从事应用开发工作打下坚实的基础,特别为进行面向对象的系统开发和窗口程序设计打下基础。课程内容第01章C++语言基础(一)更好的C第02章C++语言基础(二)函数第03章类和对象(一)面向对象基础第04章类和对象(二)类与对象的进一步讨论第05章运算符重载第06章继承与派生第07章多态性与虚函数第08章标准模板库(STL)第09章C++最新发展30课时第01章C++语言概述C++与C语言的不同1、概述1/3C++的历史C++语言的原始设计者和实现者是美国贝尔实验室的BjarneStroustrup,最初在贝尔实验室内部使用。1983年开始广泛流行,1998年制定了ISO国际标准(ISO/IEC14882)。目前在世界范围采用C++语言作为主要编程工具的程序员在所有编程语言中最多。C++与C的关系C语言是C++的一个子集,C++包含了C语言的全部内容。兼容性本质差别扩充与增强1、概述2/3C++对C语言进行了扩充和增强。例如:灵活多样的注释----单行注释--//方便明了的变量说明----块(分程序)内任何位置可定义和声明有效的动态存储分配----new和delete运算符简单易用的输入/输出流机制----输入/输出流—cin/cout作用域限定运算符::结构体功能的延展显式类型转换新的形式函数重载更强的类型检查机制函数参数的默认值内联(inline)函数引用等等。1、概述3/3在面向对象方面的拓展增强主要包括如下方面:类(包括结构型)数据封装(类成员的访问控制)构造函数和析构函数对象和消息友元类中的运算符和函数重载类的继承(或派生)多态--虚拟函数等2C++语言扩充和增强C++语言的输入和输出注解动态存储分配和释放存储空间const说明符引用枚举名,结构名和联合名都是类型名C++语言的类型类型转换C++语言的运算符C++语言的语句2.1C++语言的输入和输出C++语言的输入和输出的方法。使用C语言的外部函数(如printf,scanf等),要包含头文件“stdio.h”C++语言还提供自己的输入输出方式。是通过“>>”和“<<”实现。包含“iostream.h”输入格式为:cin>>变量输出格式为:在输出表达式时,为避免二义性表达式最好加括号cin是标准输入流,通常对应于键盘的输入;>>是表示输入操作的运算符。cout是标准输出流,通常对应于屏幕的显示;<<是表示输出操作的运算符。下列程序程序显示一行字符串#include<iostream.h>voidmain(){cout<<"Hello,World";}因此,在屏幕上显示一行输出:Hello,World例1:键入一个代表英寸的整数,打印相应厘米数#include<iostream.h>voidmain(){intinch=0;cout<<"inches=";cin>>inch;cout<<inch;cout<<"inches=";cout<<inch*2.54;cout<<"cm"<<endl;}cin是C++语言的标准输入流;“>>”运算符从标准输入流cin中读入数据存入第二个参数。对于输入符号“>>”,如果需要连续输入多个数据,那么可以有以下两种方法:每行只输入一个数据,以换行符结束一个数据的输入。一行输入多个数据,以空格符作为一个数据的输入结束标记;以换行符结束一行数据的输入。例:intnum,pstr[20];cin>>num>>pstr;如果输入:120chengdu则num为120,而pstr仅指向字符串cheng,而不是chengdu。cout是C++语言的标准输出流;“<<”运算符把参数的内容输出到标准输出设备上。对于输入符号“<<”,如果需要连续输入多个数据,还可将上述程序后四句输出改写为:cout<<inch<<"inches="<<inch*2.54<<"cm";输出回车换行”<<endl”由于cout、cin、<<和>>是在头文件iostream.h中定义的,因此在程序中用到cout、cin、<<、>>都必须首先将头文件包含到程序中。一、C++和C的输入/输出比较

#include<iostream.h>代替#include<stdio.h>cin>>代替scanf(cin>>无需在输入变量之前加取地址运算符&cout<<代替printf在同一个语句中,可以输出多个表达式的值,也可输入多个变量的值,但不可将输入和输出写在同一个语句中。二、面向流的I/O的好处:使程序具有更好的可读性减少出错的可能性(即安全性较好)使用较灵活2.2注解一、块(block)注解块注解的用法与C语言一致。以/*开头,以*/结束。可以是在一行中,也可在多行中。如:

/*thisisasinglelinecomment*/注解中有*时,前后要加空格不许镶嵌二、行(line)注解新的注解方法,Comment_to_end_of_line的结构,使用“//”开始,直到行结尾结束的注解,即

unm++;//incrementnum该注解以”//”开始,到行末结束。只能注解单行,可以镶嵌。不可能在行注解后的同一行中书写非注解的代码。2.3C++中的声明一、标识符声明的位置在C++中,局部(local)标识符的声明(declaration)是一种语句(statement),它可以出现在块(blockstatement)的任何部分,只要写在对应的标识符使用之前即可。而C中,声明不是一种语句,它只能写在一个块的开始部分。例如:

{

cout<<"Enternewtag:";

inttag;//在其它执行语句后才定义的标识符

cin>>tag;

cout<<"Tagis:"<<tag<<'\n';

}2.3C++中的声明二、局部标识符的作用范围和生命期局部标识符的作用范围(scope)和生命期(lifetime)与C语言一致,没有发生变化。局部标识符的作用范围从其声明开始至结束块语句的右花括号为止。2.3C++中的声明三、在for、if语句的头部声明标识符标识符声明也能放置在for、if语句头部的第一个表达式的位置。例如:

C++标准规定,for、if语句头部声明的标识符,作用范围为整个for、if语句。if(doubled=prim(number)){….}else{…….}for(intI=0;I<10;I++)

{

cout<<I<<'\n';

}2.3C++中的声明四、C++中的声明方法的好处C++语言中,为避免错用变量,通常将变量的使用限制在最小的作用域中,因此,可以在函数体内任何位置定义变量。可提高程序的可读性。一般,将局部变量推迟到使用时才定义(同时给出初始值)。

2.4const说明符关键字const有多种用途。1.说明符号常量C语言用符号来代表常量的方法是使用无参的宏定义量:#definePI3.14其中,PI并不是真正的符号常量,它仅仅是一个字符串,没有类型,不占用存储空间,不能取它的地址,只是在预处理时,将它替换为3.14。C++语言提供一个更灵活的方式来描述常数:consttypeconst_name=type类型的常数;如:constfloatPI=3.14;这时,PI是真正的符号常量,有类型,需要占用存储空间能取它的地址,但不能被无const约束的指针指向,它的值不能被修改。如:int*pint;constintMAX=100;intmin;pint=&min;//正确pint=&MAX;//错误说明函数的形参如函数voidfun(constintnum);在该函数内,num被认为是常数,只能使用,而不能修改。说明指针变量通常情况下指针变量的使用方法为:type*pointer;pointer=…;//修改指针的值,使该指针指向type类

//型的其他数据。*pointer=…;//通过间接访问方式修改指针指向的数据const也可以与指针一起使用。分为三种情况:1)指向常量的指针。将指针声明前加上const,使指向的对象为常量,而不是指针为常量。该指针称为指向常量的指针。可以不初始化。例如:inta=1,b=2;constintc=3;constint*pi;pi=&a;*pi=10;//错:不能修改指向数据a=10;pi=&c;*pi=100;//错误c=100;//错误:修改常量2)常指针。要把指针本身而不是它指向的对象声明为常量,采用运算符*const。该指针称为常指针,必须初始化。通过它可以修改指向的数据;指针本身为常量,一旦初始化后,就不能让它指向其他的数据。实际上,该类指针只能指向变量,而不能指向真正的常量。例如:inta=1,b=2;constintc=3;int*constpi=&a;*pi=10;pi=&b;//错误:不能修改指针本身,即不能让它指向其他数据int*constpint=&b;*pint=20;pint=&a;//错误:int*constpint_c=&c;//错误不能指向常量3)指向常量的常指针。要使两个目标都是常量,二者都要声明为const。该指针称为指向常量的常指针。必须初始化;该类指针可以指向常量,也可以指向变量;但通过该指针不能修改它所指向的数据;初始化后也不能让它指向其他的数据。inta=1,b=2;constintc=3;constint*constpi=&a;*pi=10;//错误:通过它,不能修改它所指向的数据pi=&b;//错误:不能修改指针本身,即不能让它指向其他的数据constint*constpint=&c;//例2-5一般变量做形参的例子#include<iostream.h>voidfun(intnum){num=100;}voidmain(){intannum=10;fun(annum);cout<<annum;}//结果:10//例2-6指针变量做形参的例子。#include<iostream.h>voidfun(int*pnum){*pnum=100;}voidmain(){intannum=10;fun(&annum);cout<<annum;}//结果:100//例2-7指向常量的指针做形参的例子#include<iostream.h>voidfun(constint*pnum){*pnum=100;//错误,函数不能修改*pnum,只能使用*pnumcout<<*pnum+100;//正确}voidmian(){intannum=10;fun(&annum);cout<<annum;//输出10}//又如:字符串间的复制。voidassign(char*to,constchar*from){while(*to++=*from++);}2.5引用(1)引用的概念引用是某个变量或对象的别名。如果一个变量或对象一旦定义它的引用后,则该引用被“绑定”在这个变量或对象上,即变量或对象值被改变,则引用值也被改变,反之亦然。引用不是变量,它不被分配内存空间,它的地址值是引用它的变量或对象的地址值。定义引用的格式如下:

<类型>&<引用名>=<变量或对象名>;其中,&是修饰符,定义引用时必须用一个相同类型的变量或对象名进行初始化。(2)引用的应用引用在C++语言的程序中,通常用作函数参数和函数返回值。引用简单地说,就是给一个变量取一个别名。引用与它所用的变量共享存储单元。1.独立引用引用表示为:TYPE&,它的含义为“TYPE类型的引用”。TYPE&ref_name=TYPE的一个变量;例如:inti;int&j=i;intk=9;j=k;//i的值为9其中,int&j=i;创建了一个整数的引用j,j引用了i,j是变量i的别名;即j与i共享变量i的存储单元。以后,所有对j的操作都是对的的操作。又如:intii=0;int&rr=ii;rr++;语句rr++实际上是对ii递加。这种使用引用的方法称为独立引用。例:voidfun(){inti;int&r=i;//r引用ir=1;//i的值变为1int*p=&r;//p指向i,取r的地址也就是取i的地址

int&rr=r;//rr也引用i,某些版本不允许定义引用的引用

int*q;int*&qr=q;//qr是指针q的别名

intb;qr=&b;//使q指向b}由于一引用变量必须引用指向某一变量,独立引用必须在它被说明时加以初始化,初始化分为两种情况:1)初始化时,赋值表达式的右端是一个变量。例如int&rr=ii;//ii是一个变量2)初始化时,赋值表达式的右端是一个常量值。例如double&rd=1.0;在早期是允许的,但最近版本中,引用与一个常量相联系,使用constdouble&rd2=1.0;表示,表明rd引用的是一个常数单元,不能被赋值,这样语义更明确。实际上,constdoublerd2=1.0;//符号常量比constdouble&rd2=1.0;//引用一个常量更直观和方便。因此,严格地讲,引用是一个存储单元的别名,只是在一般情况下,引用代表一个变量。还可以定义常引用。intx=1;constint&rx=x;rx=120;//错误,只能使用rx,不能修改例2-9引用使用的例子。voidmain(){intj,k;int&i=j;j=10;printf("j=%d,i=%d",j,i);k=121;i=k;printf("\nj=%d\n",j);}该程序显示如下输出:

j=10,i=10j=121例2-10#include<iostream.h>voidmain(){intnum=500;int&ref=num;cout<<ref<<endl;ref+=100;cout<<ref<<endl;cout<<num<<endl;}该程序输出:500600600如果引用的不是变量,而是常量(包括自然表示的常量和用const说明的符号常量)那么,自动申请一个临时单元(临时变量),引用引用的是临时变量,而不是常量单元。例2-11该程序输出:500600500#include<iostream.h>voidmain(){constintnum=500;int&ref=num;//VC中不可用

cout<<ref<<endl;ref+=100;cout<<ref<<endl;cout<<num<<endl;}2.引用作为函数参数C语言采用传值方式进行参数传递。当一个函数需要修改对应地实参地值时,参数应明确为指针类型。例2-12#include<iostream.h>voidfun(intnum){num=100;}voidmain(){intannum=10;fun(annum);cout<<annum;}输出:10

例2-13结果:100#include<iostream.h>voidfun(int*pnum)//行参为指针变量{*pnum=100;//通过行参间接访问实参annum,//因为*pnum就是annum}voidmain(){intannum=10;fun(&annum);//实参为地址形式

cout<<annum;}结果:100例2-14#include<iostream.h>voidfun(int&pnum){pnum=100;}voidmain(){intannum=10;fun(annum);cout<<annum;}

例2-15输出为:i=10,j=20i=10,j=20实际上,并没有完成交换的功能。#include<stdio.h>voidswap(inta,intb){intt;t=a;a=b;b=t;}voidmain(){inti,j;i=10;j=20;printf("i=%d,j=%d\n",i,j);swap(i,j);printf("i=%d,j=%d",i,j);}

例2-16输出为:i=10,j=20i=20,j=10#include<stdio.h>voidswap(int*a,int*b){intt;t=*a;*a=*b;*b=t;}main(){inti,j;i=10;j=20;printf("i=%d,j=%d\n",i,j);swap(&i,&j);printf("i=%d,j=%d",i,j);}

例2-17输出:i=10,j=20i=20,j=10#include<stdio.h>voidswap(int&a,int&b);{intt;t=a;a=b;b=t;}voidmain(){inti,j;i=10;j=20;printf("i=%d,j=%d\n",i,j);swap(i,j);printf("i=%d,j=%d",i,j);}

总之,C++语言有两种参数传递方式:1)传值方式。(变量和指针作函数参数)2)传地址方式。(引用作函数参数)3.引用作函数的返回函数返回引用,实际上返回的是一个存储单元,因此,如果一个函数返回引用的话,则函数调用可以出现在赋值号的右边,也可以出现在赋值号的左边。例2-18输出为:120200#include"stdafx.h"#include<iostream.h>int&get_var(int*pint){return*pint;}voidmain(){intanint=10;intotherint;otherint=get_var(&anint)*12;get_var(&anint)=200;cout<<otherint<<""<<anint;}

函数返回引用,那么,return后面应该为引用。除了独立引用外,还可以是:数组元素

static变量指针所指向的变量,即*p

结构的分量联合的分量例2-19有一函数定义如下:

int&func(int*anArray,int&anInt){int&anotherInt=anArray[anInt];anInt=anotherInt/3;returnanArray[anotherInt];}

如果有intMyArray[]={14,6,15,3,21,89,31,6};intMyInt=1;func(MyArray,MyInt)=55;

将置MyInt为2,MyArray[6]为55;

这里,实参MyArray是一个初始化了的数组,实参MyInt的值为1。函数体的第一条语句:此时,函数调用func(MyArray,MyInt)=55;

就等价于MyArray[6]=55;例2-20从终端上输入一正文,将每个出现的单词存入一数组,要求记录下每个单词的出现次数。首先,定义一个简单的结构:#include<string.h>#include<iostream.h>structpair{char*name;intval;};constintlarge=1024;//最多1024个不同单词staticpairvec[large];//存储所有的单词对vec数组的初始化要求:每个空项的name域里都放‘\0’。该函数在vec数组的各name域中寻找与p指向的字符串相匹配的字符串。如找到,返回该vec项的地址;找不到,返回vec空项的地址;如果没有空项(i等于lager),返回最后一项的地址。pair*find(char*p){for(inti=0;vec[i].name;i++)//成员被初始化为0if(strcmp(p,vec[i].name)==0)return&vec[i];if(i==large)return&vec[large-1];return&vec[i];}下面的函数value()给定串参数p,找到相应的整型对象,然后返回对它的引用。int&value(char*p){pair*res=find(p);if(res->name==0){res->name=newchar[strlen(p)+1];strcpy(res->name,p);res->val=0;}returnres->val;}函数find()和value()用了两种不同的方式来说明函数的返回值。find函数返回的是指向pair的指针,value()函数返回的是vec数组中需要加1的某一单词的val单元。下面主程序使用上述定义的函数。constintmax=256;//单词的最大长度voidmain(){charbuf[max];while(cin>>buf)value(buf)++;for(inti=0;vec[i].name;i++)cout<<vec[i].name<<':'<<vec[i].val<<'';}输入aabbbbccaaaabbaaaaCtRL^Z则输出:aa:5bb:3cc:1#include<string.h>#include<iostream.h>structpair{char*name;intval;};constintlarge=1024;staticpairvec[large];pair*find(char*p){for(inti=0;vec[i].name;i++)if(strcmp(p,vec[i].name)==0)return&vec[i];if(i==large)return&vec[large-1];return&vec[i];}int&value(char*p){pair*res=find(p);if(res->name==0){res->name=newchar[strlen(p)+1];strcpy(res->name,p);res->val=0;}returnres->val;}constintmax=256;//单词的最大长度voidmain(){charbuf[max];while(cin>>buf)value(buf)++;for(inti=0;vec[i].name;i++)cout<<vec[i].name<<':'<<vec[i].val<<'';}引用在定义时要初始化;对引用的操作就是对被引用的变量的操作;可以用某个引用的地址值赋给一个指针,而指针则指向被引用的变量;可以用某个引用给一个变量赋值,该变量的值便是被引用的变量值;引用与指针的比较引用是C++中的概念,初学者容易把引用和指针混淆一起。引用的一些规则如下:(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。2.6枚举名,结构名和联合名都是类型名C++语言中,枚举名,结构名和联合名都是类型名(及类名)。当实例变化时,不必在一个枚举名或结构名之前再加上enum,struct,union(class)。例:enumTraffic{red,green,yellow};structString{char*str;intlength;};当实例化为变量时,可以使用Trafficlight;Stringstr1;不必写为enumTrafficlight;structStringstr1;在C语言中例2-21其中,salary是结构data_rec的分量,也是匿名联合的变量。structdata_rec{char*name;intid_number;union{floatannual_salary;floathourly_wage;}salary;};匿名联合是可以在结构内定义没有名字的联合。可以使用下面方式访问匿名联合和的成员:data_recmy_record;data_recyour_record;my_record.salary.annual_salary=50000.0;your_record.salary.hourly_wage=120.50;2.7C++语言的类型C语言的类型有:基本类型:BOOL,char,int,double…特殊类型:void。用户定义类型:数组,结构,联合,枚举。指针类型:type*C++类型完全包括了C的类型。新增了两个类型:布尔类型:类型名bool,包括的数据true和false,表达逻辑操作的结果。bool类型还可以作为函数的返回类型,表示条件测试的结果。true可以对应整数1,false对应整数0。不为0的整型数据对应ture;等于0的整型数据对应false。抽象数据类型:类类型。2.8类型转换

类型转换是一种类型的值转换为另一种类型的值。隐式转换隐式转换发生在下述情况:混合运算:级别低的类型向级别高的类型转换。将表达式的值赋给变量:表达式的值向变量类型的值转换。实参向行参传值:实参的值向形参的值进行转换。函数返回结果:返回的值向函数返回类型的值进行转换。显示类型转换C语言的方式为:(类型名)表达式或者(类型名)(表达式)C++语言中,还提供了函数表示法:类型名(表达式)注意:类型转换要申请一个临时单元,将要转换的值先复制到临时单元,转换发生在临时单元中。例:floatfnum=5.8;intinum=int(fnum);int(fnum)是一个表达式,结果为5;但fnum的值没有改变,仍是5.8。对于复合类型(对类型有两个或两个以上限制的类型,如所有的指针类型,unsignedint等)不能用函数表示法进行类型的转换,只能用C语言的强制转换表示法。例如:intnum;int*pnum=#char*pc;pc=(char*)pnum;那么pc和pnum;指向的是同一个单元;从pnum的角度看,指向的是两个字节的一个整数,而从pc的角度看,指向的是字符数组。2.9C++语言的运算符一、单目作用域运算符的意义和用法要在局部范围内访问一个全局(不能是局部)标识符,必须使用单目(unary)作用域运算符(scopeoperator)::。当在局部范围内没有定义同名的标识符时,该运算符可省略。在C语言中,在局部范围内不可能使用与局部变量同名的全局变量。单目作用域运算符的用法为:

::全局标识符该表达式的类型和值与全局标识符相同。2.9C++语言的运算符注意:单目作用域运算符的操作数必须是全局标识符。不可能在一个块语句内使用到与该块语句内同名的外层非全局的局部标识符。二、使用单目作用域运算符的例子2.10C++语言的语句1断言的表达形式1.1语法1.2作用1.3诊断信息2断言的使用方法2.1函数调用时检查入口参数的合理性。2.2检查内存分配成功与否2.3防治野指针3注意事项(1)断言捕捉的是非法操作的情况,而不是错误。不要试图用断言来排错。(2)一旦函数对参数有任何假定,一定要在函数的入口处使用断言来确认假定是否实现。(3)给每一个断言加上注释,以便使断言有目的的防错。assert(表达式)的意思是当表达式为真时,程序继续运行,如果表达市为假,那程序就会停止运行,并提示错误信息。注意:assert是一个宏,只在debug版本中起作用,在release版本中,该语句是不起任何作用的。程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。注意:由于assert宏只在debug版本中起作用,所以不要在assert表达式中作用有后续作用的语句。断言是一个宏,格式为:

assert(逻辑表达式booleanExpression)断言仅仅在Debug过程中产生作用。当逻辑表达式出现了FALSE(0)的时候,编译程序将自动停止程序的运行,并给出相关的程序诊断信息。对于Release版本的代码,ASSERT宏不会被处理,因而不会对程序的正常运行其任何阻拦作用。对于MFC,假如希望在Release版本中依然有类似的功能,可以使用VERIFY宏。该宏作用和断言类似。assertionfailedinfileinline以上为诊断信息的格式。其中filename代表了出错程序代码所在的文件,linenumber是该出现问题的断言所在行。在函数内检测参数的合理性有两个好处:1保证函数本身的健壮性;2使问题容易定位。主调给出的参数有时候可能是莫名其妙的,使用断言,能够发现许多难以发现的逻辑错误。pBuf=(char*)malloc(sizeof(char)*100);ASSERT(NULL!=pBuf)ASSERT(NULL==pCount);//ifyou'veforgottendelete,herewilloutputanalart.c++中使用断言2.3动态存储分配和释放存储空间2.3.1new和delete在C语言是利用malloc和free函数完成的。函数原形为:

void*malloc(size_tsize);voidfree(void*p);比如要分配100个整型数的存储空间,将起始地址赋给指针变量pint*p;p=(int*)malloc(sizeof(int)*100);…free(p);C++的运算符new和delete提供了动态存储分配和释放存储空间的功能。优点:new自动计算要分配类型的大小,而不给出要分配的存储区的大小,这比较方便,也可以避免偶然地分配错误存储量。它自动返回正确的指针类型,不必对返回指针进行强制类型转换。可以用new将分配的存储空间进行初始化。运算符new用于内存分配。使用形式为type*p;p=newtype;其中,type是一个数据类名;p是指向该数据类型的指针;new从称为堆的一块空闲内存区中为程序分配一块内存,其大小与type类型的数据一样,该地址被存于指针p中。如果分配失败,new返回一个空指针。type可以是任何类型,包括函数指针,但不允许函数类型。当type为数组类型时,new返回的指针指向数组的第一个元素,当用new创建多维数时,必须提供所有维的大小。运算符delete释放new分配的存储空间,将其交还给堆。它的使用形式一般为deletep;其中p是一个指针,保存着new分配的内存的首地址。动态分配管理的方法要求delete的操作数必须是一个new返回的指针,对不是new得到的任何其它地址类型,使用delete将产生严重错误。2.3.2new和delete典型用法动态分配和释放单个数据的存储区语法为type*p;p=newtype;…deletep;通过*p的方式访问new申请的空间。看下面的例子例2-2该程序把一存储区地址赋给p,该存储区足够容纳一个整数。然后把值20赋给该存储区,并把其内容显示在屏幕上。最后,释放该动态分配的存储区。//例2-2#include<iostream.h>intmain(){int*p;p=newint;if(!p){cout<<"allocationfailure\n";return1;}*p=20;cout<<*p;deletep;return0;}用new运算符初始化单个数据区域语法为type*p;p=newtype(…………);………deletep;例2-3用new运算符初始化单个数据的存储区的例子。#include<iostream.h>intmain(){

int*p;

p=newint(99);//99为初始值,初始值可以为常量、已经

//有值的变量或表达式if(!p)

{

cout<<"allocationfailure\n";

return1;

}

cout<<*p;

deletep;

return0;}动态分配数组的存储空间一维数组语法为type*p;p=newtype[s]; //s为整数。指定数组中的元素个数,可

//以是常量或表达式,不能省略…delete[]p;通过p[i]的方式访问数组元素。例2-4动态分配数组的存储空间的例子。分配一个数组要记住的重要一点是不能对之初始化。#include<iostream.h>intmain(){float*p;inti;p=newfloat[10];if(!p){cout<<"allocationfailure\n";return1;}for(i=0;i<10;i++)p[i]=100.0f+i;for(i=0;i<10;i++)cout<<p[i]<<'';delete[]p;return0;}n维数组。语法为:type(*p)[常量1][常量2]…[常量n-1];p=newtype[s][常量1][常量2]…常量[n-1];//s指定数组中的第一维元素,可以是整//数的常量、变量或表达式,不能省略!…delete[]p;通过p[i1][i2]…[i3]的方式访问数组元素。例如:数组的第一维可能为变量,但所有后继维必须为常量,每维大小都不能缺省。int(*mat_ptr)[10][12],(*mat_ptr1)[10][12],(*mat_ptr2)[10][12],(*mat_ptr3)[10][12];mat_ptr=newint[3][10][12];intx=3;mat_ptr1=newint[x][10][12];mat_ptr2=newint[3][][12]; //错误mat_ptr3=newint[][10][12]; //错误回顾1/3C++语言的输入和输出的方法。使用C语言的外部函数(如printf,scanf等),要包含头文件“stdio.h”C++语言还提供自己的输入输出方式。是通过“>>”和“<<”实现。包含“iostream.h”输入格式为:cin>>变量输出格式为:cout格式控制

回顾2/3运算符new使用起来要比函数malloc简单得多:int*p1=(int*)malloc(sizeof(int)*length);int*p2=newint[length];这是因为new内置了sizeof、类型转换和类型安全检查功能。new在创建动态对象的同时可完成初始化工作。在用delete释放对象数组时,留意不要丢了符号‘[]’。例如delete[]objects;//正确的用法deleteobjects;//错误的用法,相当于deleteobjects[0],漏掉了另外99个对象。int*p;p=newint;i

温馨提示

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

评论

0/150

提交评论