常见问题答疑

  • 格式:pdf
  • 大小:281.64 KB
  • 文档页数:10
局部对象的构造函数在遇到对象说明语句时执行,并按遇到对象的顺序依次调用,其析构函数则按构 造函数的反序进行执行。全局对象的构造函数在 main()开始之前执行,并在同一文件中按书写顺序依次 执行,但是几个文件之间的全局对象的构造函数执行顺序是不可知的,其析构函数在函数 main()结束之 后按构造函数反序执行。 12. 如何创建数组?
C++常见问题解答 引言篇 1.学习 C++是否必须先了解 C? 2.怎样开始学习 C++? 3.改进 C++程序的最好方法是什么? 4.对于小的程序 C 优于 C++,对吗? 5.C 是 C++的子集吗? 6.C++与 C 有什么区别? 7.为什么用 C++产生的"Hello World"的程序代码要比用 C 产生的长十倍? 8.什么是面向对象的程序设计(OOP)? 基础篇 9.通常的 C++程序包括哪几部分? 10.什么是类型转换? 11.何时执行构造函数和析构函数? 12.如何创建数组? 13.C++会自动检查数组越界吗? 14.指针和数组有什么关系? 15.指针使用中应注意哪些问题? 16.向函数传递参数有几种方法?有什么不同? 17.什么是类? 18.什么是对象? 19.什么是友元? 20.友元违反数据封装原则吗? 21.构造函数是用来做什么的? 22.假设 List 是一个类的名字,那么"List x"和"List x()"之间有区别吗? 23.析构函数通常做什么工作? 24.编写析构函数时,需要显式调用成员对象的析构函数吗? 25.编写派生类的析构函数时,需要显式调用基类的析构函数吗? 26.结构和类有什么区别? 27.联合与类有什么区别? 28.哪些运算符可以被重载?哪些不能? 29.如何进行文件操作? 30.如何打开和关闭一个文件? 31.如何读写一个文件? 32.如何判断文件结束? 提高篇 33.new 和 delete 比 malloc 和 free 有哪些优点? 34.C++ 中可以使用 printf()和 scanf()吗? 35.C++中的输出 cout<<能够指定输出数据的域宽和精度吗? 36.如何向函数传递数组? 37.我如何才能防止其他的程序员看到我的类的私有成员从而维护数据封装性呢? 38.封装是一种安全机制吗? 39.可以向构造函数传递变元吗? 40.如何向函数传递对象?
很显然,这非常依赖于你已经掌握的知识和你学习 C++的动机.如果你是个编程新手,我强烈建议你找一 位有经验的程序员来帮助你.否则概念性的错误以及程序实际执行过程中所发生的问题将使你的学习大受 挫折.
你需要一本 C++学习教程.该教程起到在线帮助文档的作用. 其原因是带有足够多代码的编程语言和库 文档对概念的解释不见得就很清楚。
面向对象的设计方法是一种进行程序设计的新方法,它吸取了结构化程序设计的先进思想,为解决程 序结构过于复杂而产生。它的思想是在进行程序设计时,把整个问题分成由相关部分组成的组,每个组考 虑和组相关的代码和数据,同时这些分组将按层次关系组织起来,每个分组转换为对象的独立单元。面向 对象的程序设计语言都具有多态性、继承性、封装性等特点。 9.通常的 C++程序包括哪几部分?
当类型不同的变量出现在同一表达式中或者赋值符号两边时,会导致类型转换。转换的原则是赋值号 右边的值将被转换成赋值号左边变量的类型,然后赋给左边的变量,同一表达式中的不同类型都将转换成 与最大类型操作数相同的类型,即从低位字向高位字转换(如 int 转为 float)。有时类型转换会造成数 据的丢失。也可以在变量前加(type)来强制使变量转换为需要的类型。比如说某个 float 类型的变量在 输出时需要输出浮点数的信息,而同时它也作为计数值在控制循环次数((int)varname)。 11.何时执行构造函数和析构函数?
回答是否定的,也就是说当你பைடு நூலகம்数组越界使用时编译程序不会报错,而只能是在执行时产生非法操作 或者得不到正确结果。因此在使用数组时一定要在编程时自己判断是否越界以保证程序的正确性。 14.指针和数组有什么关系?
指针和数组之间是有密切的关系的。当创建一个数组后,虽然没有定义,但是数组名即是一个指向该 数组第一个元素的指针,同样也可以用这个指针对数组进行操作。例如定义数组 int array[10];int* p; p=array;执行后 p 即指向了数组的第一个元素 array[0],最后一个语句相当于 p=&array[0](很少这么用)。 而任何一个指针变量都可以以数组的方式使用,即通过指针加下标来改变指针的指向。例如定义指针变量 int* p;则有 p[1]==*(p++)。 15.指针使用中应注意哪些问题?
在我的机器上不会有这种现象,在你的机器上也不会有.实际上,在我的机器“hello world”程序的 C++ 版本的目标代码比 C 要小.没有语言方面的原因使得一种版本的程序代码比另一种的要长.只有一种情况, 那就是实现一种语言的人是如何组织标准库的.如果一种版本要比另一版本大得多,则要向大的一方的实现 者提出所发现的问题. 8.什么是面向对象的程序设计(OOP)?
当选择一本书时,要选将标准 C++和标准库结合在一块描述的书.如,象字符串的输入应这样; string s;// 标准 C++风格 cin>>s; 而不要象这样: char s[MAX]; /* 标准 C 风格 */ scanf("%s",s); 多看看有丰富编程经验的程序员推荐的书,记住,对任何人来说没有哪一本是最好的,看看 ACCU(C 和 C++用户协会)站点上的书评. 为了写出合乎习惯的 C++语句,应避免简单地用你以前学过的语言的风格写 C++代码,仅仅通过改变句 子排列顺序是得不到什么进步的.看看《Learning Standard C++ as a New Language》一书中关于如何学 习 C++的讨论内容. 3.改进 C++程序的最好方法是什么? 这我没法说,主要取决于你如何用它,有很多人都轻视抽象类和模板.相反他们过多地使用 casts 和宏. 4.对于小的程序 C 优于 C++,对吗? 我没有这样的观点,我还未见过在不缺好的 C++编译器的情况下,有优于 C++的 C 小程序 5.C 是 C++的子集吗? 从严格的数学意义上讲,C 不是 C++的一个子集.有些程序是有效的 C 程序却不是有效的 C++程序,甚至 在一些代码的编写方面,C 与 C++也有不同的意思.不过 C++支持 C 所支持的每一种编程技术.每个 C 程序从 本质上来讲也都可以相同的方式用 C++来编写,并且有着相同的时间和空间效率.在几小时内将几万行符合
数组可以动态创建也可以静态创建。当已知数组大小时,可以简单的定义为 int array[10]。动态创 建数组时数组大小可以是已知的,也可以是变元,此时用动态分配符 new 来创建,定义形式为 type *array=new type[size],当然用完数组时必须用 delete[] array 来释放空间。由于动态创建数组是分配 了一块内存空间,因此当数组较大时最好静态分配。对于多维数组,静态分配同前,动态分配则从最高维 开始依次用 new 分配,释放时则从低维到高维依次 delete[]。 13.C++会自动检查数组越界吗?
41.为什么友元关系不具有传递性,也不能通过继承得到? 42.如何在一个构造函数的内部调用另一个构造函数? 43.对于类 C 来说,缺省构造函数一定是 C::C()的形式吗? 44.为什么含有静态成员的类产生链接错误? 45.局部对象的析构顺序是怎样的? 46.能够重载类的析构函数吗? 47.如果我的对象是通过 new 创建的,那么我可以显式地调用析构函数清除这个对象吗? 48.说明指针变量和引用变量时,*或&应该与类型名连在一起还是变量名连在一起? 49.如何进行运算符重载? 50.在函数定义中使用 const 修饰符有何作用? 51.派生类可以继承基类的哪些部分? 52.public,protected,private 有什么区别? 53.什么要使用模板? 54.C++中可以嵌入汇编吗?
int main() {
double sq2=sqrt(2); /* 不是 C++程序:调用了一个未声明的函数 */ int s=sizeof('a'); /* 在 C 中用 sizeof(int) . */ } 调用一个未声明的函数是 C 中不好的风格而在 C++中则是不合法的. void f(); void g() { f(2); } 在 C 语 言 中 void 类 型的 指 针 能 被 转换 为 任 意 类型的 指 针 ,分 配 内 存的 典 型 做法 是 调 用 函 数 malloc()..... void * malloc(size_t); void f(int n) { int *p=malloc(n*sizeof(char)); /*非 C++用法,C++是用 new 分配内存的*/ char c; void* pv=&c; int *pi=pv; /*隐含有将 void 类型指针转换为 int 类型的指针,在 C++中不用*/ } 注意隐含地将 void 类型指针转换为 int 类型的指针会引起潜在的 alignment 错误. 从 C 转换到 C++时,需注意 C++的关键字要比 C 来的多 int class =2; /* 在 C 中是正确的, 在 C++中则有语法错误*/ int virtual=3; /* 在 C 中是正确的, 在 C++中则有语法错误*/ 除了一些象上面所举的例子外(《The C++ Programming Language》(第三版)的附录 B 中详细列出了标 准 C++与 C 的这类区别)C++是 C 的一个超集(附录 B 可以从网上下载) 6. C++与 C 有什么区别? C++是 C 的直接后裔,几乎将 C 当作一个子集而差不多保留了 C 的全部内容,C++提供了更强的类型检查 机制并直接支持范围更广的编程风格.在这种意义上说 C++是"更好的 C",它支持 C 语言的编程风格并有更好 的类型检查(又不失其原有的高效率).类似的,ANSI C 是比 K&R C 更好的 C,另外 C++支持数据抽象,面向对 象的编程和类编程(请见《The C++ Programming Language》(第 3 版),可以从网上下载的附录 B 中讨论了 兼容性问题.) 我还未曾见过哪一个程序用 C 表达比用 C++来得更好(我认为不存在这样一个 C 程序,其结构与 C++完全 等价) 然而,在某些情况下由于 C++得不到充分的支持,而使用 C 更有利. 要理解有关 C++的设计以及 C++与 C 的关系的一些讨论,请见《The Design and Evolution of C++》; 7.为什么用 C++产生的“Hello World”的程序代码要比用 C 产生的长十倍?