ctoc++.doc_第1页
ctoc++.doc_第2页
ctoc++.doc_第3页
ctoc++.doc_第4页
ctoc++.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

由C语言转向C+的一本教材C TO C+子虚出版社张云聪 著C to C+序:本书面向的是学完了C一段时间之后,想学C+但不知从何下手的学习者。现在的C+入门级图书,大多是连带C语言的语法一起讲解,会让我上面所说的一批学习者浪费不少时间在和作者一起回顾C语言语法上。这本C to C+就是这么一本带领读者一步步由C转向C+的书,它不会将所涉及的C+知识点一一罗列出来,而是用一种循序渐进的方式让读者一点点从C转向C+,所以,你如果想使用本书,请尽量抛弃以前读书时,不看示例,只看知识点的习惯。如果你坚持只看本书所罗列的知识点,你会发现,你几乎什么也学不到。那么,你可以立刻把本书卖到旧书摊上了,没准还可以帮到其他的一些读者。本书分为四章,第一章为“初步了解C+”,第二章“深入了解类”,第三章“STL入门”,第四章“面向对象程序设计”。每一章分为多个小节,每小节讲述一种由C向C+的转变,有的小节可能很长,有的小节可能只有寥寥数笔。张云聪2009-11-15目录:C to C+1第一章:初步了解C+3转变一、基本输入输出3转变二、声明位置的转变4转变三、引用类型的引入4转变四、bool类型7转变五、初识string类型7转变六、结构体到类的转变9第一章: 初步了解C+转变一、 基本输入输出你有没有为下面几件事而抱怨过编译器或C语言标准的制定者?1. int data;scanf(%d,data);我保证你肯定犯过这种错误,而且,曾经花过不少时间找这段代码中的错误,最终却发现竟然是忘了加&。你甚至可能想骂编译器:编译时,你为啥连个警告都不说,却让我的代码在运行时出错?2. int data=3;printf(%s,data);输出的时候写错把%d、%s之类的格式控制字符写错的问题,你肯定也遇到过,运行的时候,屏幕上会输出一些莫名其妙的字符或数字,比如常见的:“烫烫烫烫”,这种问题也真是够“烫”的。而且,编译器竟然还是视而不见,一声不吭。你甚至会想,为啥scanf的后几个参数一定要放一个地址?为什么这个函数的制造者不把scanf设置成scanf(%d,data);就能输入呢?但仔细一想,你可能就会明白,C语言里,scanf是一个函数,而函数进行参数传递的时候,只是把实参的值传递给了形参,实参与形参不是同一片内存空间。所以,你对形参进行的一般性操作都不会影响到实参。、所以,scanf的编写者就只好让用户把data的地址传递给形参,并在scanf函数里用一个指针来接收,将来再利用这个指针来改变data的值。可是这么一来,用户就会抱怨了,这多不直观啊,输入变量的时候还得加&,还得用一些格式控制字符来表明我输入或输出的是什么类型,甚至于,如果用错了格式控制字符或忘加了&,由于C语言的语法上的一些原因,它也不可能提示你出错(因为实际上,这两种错误也是符合语法的)。那么,C+是如使这种不方便转变得更方便呢?那就是使用流输入与流输出。请看下面的程序:#include using namespace std;int main()int a,b;cinab;couta plus b is a+bendl;return 0;程序运行结果:输入:2 3并按下回车输出:2 plus 3 is 5(结尾有一个换行)咱们先来看看这段程序,第一句,包含了一个叫iostream的头文件,它的含义是:input-output-stream,也就是输入输出流的意思。一些细心的读者可能会发现,这个头文件不叫iostream.h而是叫iostream。第二句using namespace std的意思是使用标准命名空间。其中using namespace这两个词都是C+中的关键字,std表示的使用的命名空间名叫std。你可能会问,什么是命名空间?这点,你现在还不必知道,后面我会有详细的介绍,你可以像你刚学C时记住文件开头要写上#include 一样,记住,如果想这样用cin和cout,请务必在文件开头写上using namespace std(记住,这是一个语句,语句结尾时有一个分号)。由于历史原因,在一些编译器里,你可以用#include (有.h)来代替#include 和using namespace std;这两句,虽然这么写可以省掉一行话,但这我不提倡你这么做,而在一些新式编译器中,写iostream.h已经被视为错误(即使你的编译器允许你这么做,你最好也别这么做,因为iostream和iostream.h其实现方法是相差很大的)。好,我们还来说刚才这个简单的程序,这个程序里有两个很显眼的标识符:cin(读作see-in)和cout(读作see-out),它们被称为标准流输入对象和标准流输出对象。甚至我们还看到了右移符号和左移符号ab这一句是让用户输入两个数a和b,那么a,b是按什么类型输入的呢?是%d还是%f还是别的什么格式?这就是你所遇到的,C+的第一个方便之处,它可以不必输入格式控制字符,而根据接收数据的变量的类型而自动选择合适的方式来接收,而且,你应该也发现了,这里的a和b并不需要取地址之后再放在输入语句中。不少人可能会庆幸了,哇,这样,我就不会再忘了加那个可恶的&了,因为这里根本不需要加它。那么cout这一句呢,你也可能会发现,它也同样不需要格式控制字符,如果要输出的是int型数,它就按int的方式输出,如果它是 plus 之类这样的C传统字符串,它就按照C传统字符串的方式输出。其至,以后,在C+里你可以定义自己的类型,并为自己的类型定义它的输出方式。那么endl是干什么的?它叫做操纵符,它的作用是输出一个n并刷新输出缓存区。作业:1、 请编写一个程序,用以接收两个数,并用输出其中较大的数。其中输入与输出请使用流操作。2、 思索,cin,cout是不是函数?转变二、 声明位置的转变C语言里,变量声明必须放在一个函数的开头,但在C+里,却不需要这么做,你可以在任何地方声明一个变量。而且,建议你尽量等需要用的时候再去定义一个变量。转变三、 引用类型的引入先来看下面一个例子:#include void swap(int a,int b)int temp=a;a=b;b=temp;int main()int a=1,b=2;swap(a,b);printf(a=%d,b=%d,a,b);输出结果:a=1,b=2写出这个程序的人,它编写的swap函数本意是想让两个参数的值互相交换。但是,我们知道,C语言里参数的传递都是以值传递的方式进行的,也就是说,这里将把作为实参的a,b的值赋值给作为形参的a,b,这样形参与实参并不是同一片内存空间,对形参a所做的赋值操作根本不会对实参a有任何的影响,所以最终会发现这个swap函数根本没有起到任何作用。 作为C语言高手的你会告诉我,想实现两个数交换,应该这么写:#include void swap(int *a,int *b)int temp=*a;*a=*b;*b=temp;int main()int a=1,b=2;swap(&a,&b);printf(a=%d,b=%d,a,b);确实,这个程序能达到交换两个值的效果,可是,我们要操作的是两个变量的值,而不是其地址,却需要往函数里传递两个变量的地址。总是让人感到不太直观。C+里就出现了引用类型。这样,原程序就可以这么写#include void swap(int &a,int &b)/只有这一行与原来的程序不同int temp=a;a=b;b=temp;int main()int a=1,b=2;swap(a,b);printf(a=%d,b=%d,a,b);这样,这个swap函数就对它的两个参数a,b的值进行了交换。你可能会惊奇的问:什么?竟然在形参声明时对a取地址?咱们先撇开上面的例子来说一下引用类型变量:1. 引用类型相当于给变量起了一个别名变量名就是一个用以标识一片内存区域的标识符,而声明引用变量就相当于给这片内存区域重新起了一个名字。这句话你现在看肯定不太清楚它是什么意思,但,请带着这句话看下面的几点2. 引用类型变量的初始化定义一个引用类型的变量时,这个&仅仅是用来表示声明的变量是是引用类型变量(而并非取地址的意思)。如int a=123;int &b=a;b就是一个引用类型变量,它绑定在一个int类型的变量a上。如果现在输出b的值,就会得到b的值为123.我们定义一个引用类型的变量时,必须用它所绑定的类型的一个变量对它进行初始化。int a=123;int &b1=a;/正确int &b2;/错误,必须初始化int &b3=123;/错误,必须用int型变量来进行初始化,而不能用常量来初始化。3. 对引用类型变量进行赋值先来看下面一段代码。int a=123,b=234;int &c=a;c=b;这时,a和c的值是多少?有两种想法,第一种想法是c=b的意思和初始化时c=a那里差不多,表示让c从现在起开始绑定到b.所以a的值是123,c的值是234,这种想法很有依据,那就是指针变量就是这个样子,不过我可以很负责任的告诉你,这种想法在这里是错误的,至少,编译器和你的想法不一样。事实上,除了初始化的时候之外,你对一个引用类型的变量进行任何的操作,都相当于对它所绑定的变量进行了相同的操作,这个“任何”是包括赋值操作的。所以,这里c=b就相当于是a=b,执行了该操作后,a,c的值都变为234。好,现在我们再来回头看一下前面那个程序,为了区别形参a,b和实参a,b,这里我把实参a,b记作a,b.形参列表里的int &a,int &b就相当于int &a=a,int &b=b这样,a绑定到了a上,成了a的另一个名字,b就成了b的另一个名字,因此,对a,b做的任何操作,都相当于对a,b进行了对应操作,这也就使形参与实参共用了同一片内存地址,便可以实现在函数中改变实参的值了。这样,swap函数才真正直到了交换两个参数的值的作用。4. const引用const引用就是绑定在const对象上的引用。如const int data=123;const int& data2=data;/正确int &data3=data;/错误/不能将int&型变量绑定在const int型变量上但,可以用const int&变量绑定在int型变量上。如:int data=123;const int &data2=data;/正确此后,可以利用给data赋值来给这片内存区域赋值,但却不能给data2赋值,因为data2是const int&型。由于引用类型作为参数时,不是真正的值传递,形参与实参共用同一片内存区域,所以在用一些大的结构体对象或大的类对象(类是一种与结构体类似,但比结构体强大得多的东西,本书后面大部分内容都是在讲它)作参数时,可以把函数的形参声明为引用类型,以减小值传递所带来的开销。而且,在多数情况下,为了避免做为实参的对象在函数内不被修改,可以把形参设置为const引用。聪明的读者,引用类型也可以做为函数的返回值,请暂时自行试验一下其用法。将来后面我们将会详述作业:请试推测以下程序的执行结果:#include using namespace std;int &fun(int &b) return b;int main() int a=1;fun(a)=2;couta;return 0;转变四、 bool类型C语言里没有bool类型,它用0表示假,用非0表示真,但C+里,却出现了bool类型,这个类型只有两个值,true和false,需要注意的是它们都是小写。比如,我们定义一个函数:bool in(int data,int a10)int i;for (i=0;i10;i+)if(ai=data) return true;return false;这个函数用于判断一个数是否在一个10个元素的数组里,这个函数的返回值只可能是true或false。所以,我们就可以用bool类型来做它的返回值。bool类型可以与许多类型之间进行转换。比如true可以隐式的转换成int类型的1,false可隐式转换成0。所以couttrue;将会在输出1。转变五、 初识string类型C语言里没有字符串类型,字符串实际上是用结尾为0的字符型数组来实现的,而C+标准库里提供了字符串类型。想使用string类型,必须包含头文件string。(同样,不是string.h),而且,string和iostream一样都是C+标准库的一部分,使用前都需要“using namespace std;”。咱们先来两个例子来看看string相对于C-string(即C语言传统字符串)的优势在哪里:#include #include using namespace std;int main()string str1=Zhang,str2;str2= Yuncong;str1+=str2;coutstr1endl;coutstr1.size()endl;return 0; 输出结果:Zhang Yuncong13先来看main函数里的第一句,string str1=Zhang,str2;看起来C语言里的普通声明几乎一样,这里就是在声明一个string类型的变量str1,和string类型的变量str2,其中,用Zhang来为str1赋值,str2为一个空字符串。熟悉C语言的读者一定会对str2= Yuncong这一句有一些疑虑,因为C语言里规定,用字符串初始化字符型数组时,可以char str20= Yuncong这个样子来对字符串整体赋值,但不能在声明了char str20之后再写str= Yuncong。但在C+的string类里,这么做是允许的,甚至下面一句str1+=str2也是允许的,它表示str1=str1+str2,而+在这里执行的操作是把字符串str1和str2连成一个字符串。所以这里str1就被赋值成了Zhang Yuncong。但,有一点必须记住,+两边的两个操作数中,必须至少有一个是string类的对象,而不能全是C-string。在以下的几个示例中:string str1=abc;str1=str1+def;/这是正确的,因为a是st

温馨提示

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

最新文档

评论

0/150

提交评论