很显然,这非常依赖于你已经掌握的知识和你学习C++的动机.如果你是个编程新手,我强烈建议你找一位有经验的程序员来帮助你.否则概念性的错误以及程序实际执行过程中所发生的问题将使你的学习大受挫折.
你需要一本C++学习教程.该教程起到在线帮助文档的作用. 其原因是带有足够多代码的编程语言和库文档对概念的解释不见得就很清楚。
当选择一本书时,要选将标准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++的讨论内容.
5.C是C++的子集吗?
从严格的数学意义上讲,C不是C++的一个子集.有些程序是有效的C程序却不是有效的C++程序,甚至在一些代码的编写方面,C与C++也有不同的意思.不过C++支持C所支持的每一种编程技术.每个C程序从本质上来讲也都可以相同的方式用C++来编写,并且有着相同的时间和空间效率.在几小时内将几万行符合ANSI标准的C程序转换成C++风格的C++程序是常见的.因此C++是ANSI C的超集就像ANSI C是K&R C的超集而ISO C++又是C++的超集一样.
一般的C程序都符合C++语法,比如Kernighan和Ritchie合著的《The C Programming Language》(第二版)中的任何一个例子也都是C++程序.
有关C/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++》;
43. 对于类C来说,缺省构造函数一定是C::C()的形式吗?
不是这样的。
缺省构造函数是这样一类构造函数:调用它时可以不给出任何参数。所以不带任何参数的构造函数当然是缺省构造函数,比如:
class C
{
C(); //缺省构造函数
};
但是,缺省构造函数也可以带有参数,只要这些参数都具有缺省值即可,比如:
class C
{
C(int a=0, int b=0); //缺省构造函数
};
44.为什么含有静态成员的类产生链接错误?
产生这种错误的原因通常是编程者没有满足这样一条原则:类的静态数据成员必须被显式的定义,并且只能在一个编译模块中定义一次。如果你违反这一原则,就会得?quot;undefined external" linker error。举例说明:
// Fred.h
class Fred {
public:
// ...
private:
static int j_; // 声明静态数据成员 Fred::j
// ...
};
你必须在某个文件中定义Fred::j,否则链接不能通过,比如在Fred.cpp文件中定义它:
// Fred.cpp
#include "Fred.h"
int Fred::j_ = 0;
45.局部对象的析构顺序是怎样的?
局部对象按照它们建立顺序的反顺序进行析构。最早创建的对象最晚被析构。
在下面的例子中,b的析构函数首先被调用,然后是a的析构函数。
void f()
{
C a;
C b;
//……
}
auto double int struct break else
long switch case enum register typedef
char extern return union const float
short unsigned continue for signed void
default goto sizeof volatile do if
static while asm _cs _ds _es
_ss cdecl far huge interrupt near
pascal class public private catch protected
delete new template friend this inline
throw try operator virtual overload(现不用)
68.函数声明
在C++中,函数声明就是函数原型,它是一条程序语句,即它必须以分号结束。它有函数返回类型,函数名和参数构成,形式为:
返回类型 function (参数表);
参数表包含所有参数的数据类型,参数之间用逗号分开。如下函数声明都是合法的。
int Area(int length , int width ) ;
或 int Area ( int , int ) ;
69.函数定义
函数定义与函数声明相对应,指函数的具体实现,即包括函数体。如:
int Area( int length , int width )
{
// other program statement
}