C++常见问题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

引言篇1.学习C++是否必须先了解C?2.怎样开始学习C++?3.改进C++程序的最好方法是什么?4.对于小的程序C优于C++,对吗?5.C是C++的子集吗?6.C++与C有什么区别?7.为什么用C++产生的HelloWorld的程序代码要比用C产生的长十倍?8.什么是面向对象的程序设计(OOP)?1.学习C++是否必须先了解C?不是,C++与C的公共部分比C还容易学习,由于C++比C的类型检查更严格更富于表现力,因此产生的错误就更少,又由于C++能使你毫不困难地描述更多的事物,因此所需的诀窍就更少,而且可利用的库也要比C多.所要学习的C++子集并不是C的全部.2.怎样开始学习C++?很显然,这非常依赖于你已经掌握的知识和你学习C++的动机.如果你是个编程新手,我强烈建议你找一位有经验的程序员来帮助你.否则概念性的错误以及程序实际执行过程中所发生的问题将使你的学习大受挫折.你需要一本C++学习教程.该教程起到在线帮助文档的作用.其原因是带有足够多代码的编程语言和库文档对概念的解释不见得就很清楚。当选择一本书时,要选将标准C++和标准库结合在一块描述的书.如,象字符串的输入应这样;strings;//标准C++风格cins;而不要象这样:chars[MAX];/*标准C风格*/scanf(%s,s);多看看有丰富编程经验的程序员推荐的书,记住,对任何人来说没有哪一本是最好的,看看ACCU(C和C++用户协会)站点上的书评.为了写出合乎习惯的C++语句,应避免简单地用你以前学过的语言的风格写C++代码,仅仅通过改变句子排列顺序是得不到什么进步的.看看《LearningStandardC++asaNewLanguage》一书中关于如何学习C++的讨论内容.3.改进C++程序的最好方法是什么?这我没法说,主要取决于你如何用它,有很多人都轻视抽象类和模板.相反他们过多地使用casts和宏.4.对于小的程序C优于C++,对吗?我没有这样的观点,我还未见过在不缺好的C++编译器的情况下,有优于C++的C小程序5.C是C++的子集吗?从严格的数学意义上讲,C不是C++的一个子集.有些程序是有效的C程序却不是有效的C++程序,甚至在一些代码的编写方面,C与C++也有不同的意思.不过C++支持C所支持的每一种编程技术.每个C程序从本质上来讲也都可以相同的方式用C++来编写,并且有着相同的时间和空间效率.在几小时内将几万行符合ANSI标准的C程序转换成C++风格的C++程序是常见的.因此C++是ANSIC的超集就像ANSIC是K&RC的超集而ISOC++又是C++的超集一样.一般的C程序都符合C++语法,比如Kernighan和Ritchie合著的《TheCProgrammingLanguage》(第二版)中的任何一个例子也都是C++程序.有关C/C++兼容的问题例子:intmain(){doublesq2=sqrt(2);/*不是C++程序:调用了一个未声明的函数*/ints=sizeof('a');/*在C中用sizeof(int).*/}调用一个未声明的函数是C中不好的风格而在C++中则是不合法的.voidf();voidg(){f(2);}在C语言中void类型的指针能被转换为任意类型的指针,分配内存的典型做法是调用函数malloc().....void*malloc(size_t);voidf(intn){int*p=malloc(n*sizeof(char));/*非C++用法,C++是用new分配内存的*/charc;void*pv=&c;int*pi=pv;/*隐含有将void类型指针转换为int类型的指针,在C++中不用*/}注意隐含地将void类型指针转换为int类型的指针会引起潜在的alignment错误.从C转换到C++时,需注意C++的关键字要比C来的多intclass=2;/*在C中是正确的,在C++中则有语法错误*/intvirtual=3;/*在C中是正确的,在C++中则有语法错误*/除了一些象上面所举的例子外(《TheC++ProgrammingLanguage》(第三版)的附录B中详细列出了标准C++与C的这类区别)C++是C的一个超集(附录B可以从网上下载)6.C++与C有什么区别?C++是C的直接后裔,几乎将C当作一个子集而差不多保留了C的全部内容,C++提供了更强的类型检查机制并直接支持范围更广的编程风格.在这种意义上说C++是更好的C,它支持C语言的编程风格并有更好的类型检查(又不失其原有的高效率).类似的,ANSIC是比K&RC更好的C,另外C++支持数据抽象,面向对象的编程和类编程(请见《TheC++ProgrammingLanguage》(第3版),可以从网上下载的附录B中讨论了兼容性问题.)我还未曾见过哪一个程序用C表达比用C++来得更好(我认为不存在这样一个C程序,其结构与C++完全等价)然而,在某些情况下由于C++得不到充分的支持,而使用C更有利.要理解有关C++的设计以及C++与C的关系的一些讨论,请见《TheDesignandEvolutionofC++》;7.为什么用C++产生的“HelloWorld”的程序代码要比用C产生的长十倍?在我的机器上不会有这种现象,在你的机器上也不会有.实际上,在我的机器“helloworld”程序的C++版本的目标代码比C要小.没有语言方面的原因使得一种版本的程序代码比另一种的要长.只有一种情况,那就是实现一种语言的人是如何组织标准库的.如果一种版本要比另一版本大得多,则要向大的一方的实现者提出所发现的问题.8.什么是面向对象的程序设计(OOP)?面向对象的设计方法是一种进行程序设计的新方法,它吸取了结构化程序设计的先进思想,为解决程序结构过于复杂而产生。它的思想是在进行程序设计时,把整个问题分成由相关部分组成的组,每个组考虑和组相关的代码和数据,同时这些分组将按层次关系组织起来,每个分组转换为对象的独立单元。面向对象的程序设计语言都具有多态性、继承性、封装性等特点。基础篇9.通常的C++程序包括哪几部分?10.什么是类型转换?11.何时执行构造函数和析构函数?12.如何创建数组?13.C++会自动检查数组越界吗?14.指针和数组有什么关系?15.指针使用中应注意哪些问题?16.向函数传递参数有几种方法?有什么不同?17.什么是类?18.什么是对象?19.什么是友元?20.友元违反数据封装原则吗?21.构造函数是用来做什么的?22.假设List是一个类的名字,那么Listx和Listx()之间有区别吗?23.析构函数通常做什么工作?24.编写析构函数时,需要显式调用成员对象的析构函数吗?25.编写派生类的析构函数时,需要显式调用基类的析构函数吗?26.结构和类有什么区别?27.联合与类有什么区别?28.哪些运算符可以被重载?哪些不能?29.如何进行文件操作?30.如何打开和关闭一个文件?31.如何读写一个文件?32.如何判断文件结束?-----------------------------------------------------------------------------------------------------------------9.通常的C++程序包括哪几部分?C++是面向对象的程序设计语言,所以C++程序和C程序在风格上有很大不同。用户编写的C++程序通常分为.cpp和.h两类,.h文件中通常是类的定义,函数原型或说明以及数据的声明等,然后在.cpp文件中通过包含(#include).h文件来使用。一个C++程序的结构通常是:在程序首部是预处理指令,可以声明需要用到的类库或者包含自定义的函数或类的.h文件,定义常量、宏等等。程序的主函数是main()函数,程序将从这里开始执行。10.什么是类型转换?当类型不同的变量出现在同一表达式中或者赋值符号两边时,会导致类型转换。转换的原则是赋值号右边的值将被转换成赋值号左边变量的类型,然后赋给左边的变量,同一表达式中的不同类型都将转换成与最大类型操作数相同的类型,即从低位字向高位字转换(如int转为float)。有时类型转换会造成数据的丢失。也可以在变量前加(type)来强制使变量转换为需要的类型。比如说某个float类型的变量在输出时需要输出浮点数的信息,而同时它也作为计数值在控制循环次数((int)varname)。11.何时执行构造函数和析构函数?局部对象的构造函数在遇到对象说明语句时执行,并按遇到对象的顺序依次调用,其析构函数则按构造函数的反序进行执行。全局对象的构造函数在main()开始之前执行,并在同一文件中按书写顺序依次执行,但是几个文件之间的全局对象的构造函数执行顺序是不可知的,其析构函数在函数main()结束之后按构造函数反序执行。12.如何创建数组?数组可以动态创建也可以静态创建。当已知数组大小时,可以简单的定义为intarray[10]。动态创建数组时数组大小可以是已知的,也可以是变元,此时用动态分配符new来创建,定义形式为type*array=newtype[size],当然用完数组时必须用delete[]array来释放空间。由于动态创建数组是分配了一块内存空间,因此当数组较大时最好静态分配。对于多维数组,静态分配同前,动态分配则从最高维开始依次用new分配,释放时则从低维到高维依次delete[]。13.C++会自动检查数组越界吗?回答是否定的,也就是说当你的数组越界使用时编译程序不会报错,而只能是在执行时产生非法操作或者得不到正确结果。因此在使用数组时一定要在编程时自己判断是否越界以保证程序的正确性。14.指针和数组有什么关系?指针和数组之间是有密切的关系的。当创建一个数组后,虽然没有定义,但是数组名即是一个指向该数组第一个元素的指针,同样也可以用这个指针对数组进行操作。例如定义数组intarray[10];int*p;p=array;执行后p即指向了数组的第一个元素array[0],最后一个语句相当于p=&array[0](很少这么用)。而任何一个指针变量都可以以数组的方式使用,即通过指针加下标来改变指针的指向。例如定义指针变量int*p;则有p[1]==*(p++)。15.指针使用中应注意哪些问题?指针虽然功能强大,使用灵活,但是很多时候它会导致致命的并且不容易发现的错误。因此使用指针时一定要特别小心,注意不要犯以下错误:首先,未经初始化的指针使用起来是很危险的,因为它可能指向某个未知的内存空间,这样对它操作可能导致严重的后果。解决方法是在使用指针前一定要初始化它的指向(有时null也是不安全的)。其次,对指针的错误理解也可能得不到正确结果甚至产生错误,如数组越界等。另外在使用delete时也容易产生指针错误,delete前一定要确认被释放的指针指向的是有效地址,例如在释放数组时如果忘记了[]将只释放数组的第一个元素所占的空间,而其余元素将被程序遗忘在死区,而且很可能当时未被发现,但是如果程序过大或者多次执行将导致资源不足而使系统崩溃。总之由于指针是对内存的直接操作,所以稍不注意就可能产生错误。只有彻底了解指针的使用,并且在编程过程中时刻注意检查指针的指向,指针才会成为有力的工具。16.向函数传递参数有几种方法?有什么不同?向函数传递的参数可以是传值参数,也可以是引用参数,还可能是指针。传值时形式参数即简单的写成typevarname,函数执行后将不改变实参的值。引用传递是把变元的地址传给函数,形式参数写成type&varname,调用时则直接写实参的名字即可,因此函数执行后对实参varname的修改将被保留。指针传递就是把变量的指针传给参数,形参形式为type*varname,显然函数将对指针指向的内存地址直接操作,修改将被保留。17.什么是类?类是面向对象程序设计的基础。一个类定义了一种数据类型,有一点儿像C语言中的结构类型(struct)。从计算机科学的观点来说,一种数据类型应该包括一系列的状态和一系列的操作,操作引起状态的

1 / 48
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功