C++学习方法导论


Coder Life

转载请注明出处:转载自 至尊明帅的博客 原文地址:http://zi-jin.com/?p=10

很多同学都在为学C++而烦恼,现在我希望能提供一些帮助大家学C++的东西。

第一部分:准备工作

1.我不想一开始就介绍很多概念性的东西(但有一些是必须的),想先让大家亲自体验,然后引出概念。希望大家喜欢这种方式。

2.大家看到这篇文章前应该已经看过有关C++语言的书籍,如学校课本,本文并不是代替课本,或许只是引导你如何去看课本及其他书籍。

3.本文说的C++均指标准C++。(这句话是写给看得懂这句话的人看的,现在大家可以不用在此纠结。)

4.C++是一门语言,是人与机器的沟通方式。遵循C++语言规范写出来的东西叫代码,它必须经过编译器编译成机器能执行的指令。

5.其实如果你能把C++ Primer这本书看完,不需要任何其他资料就能了解整个C++语言了,但真的一开始就抱着那么大一本砖头书看也不知道好不好,反正我没试过,我觉得学习过程中还是要以培养兴趣为主。

6.如有任何疑问,欢迎在下面留言:http://zi-jin.com/archives/10#comment

第二部分:从大家都看过的一个C++程序说起:

1.“int”是什么?
int a;
表示声明(Declare)一个整数型变量(interger),其名称为“a”,就像数学里面“设长方形的长为a,宽为b”,值得注意的是你不能“设长方形的长为a,宽为a”。因为标识符(Identifier)在其作用域(Scope)内必须是唯一的,从其英文名可以看出,我们必须凭这个名字而找到准确的事物。
声明多个整数型变量时,可以写成:int a, b, c, d, e;
在C++中,你必须先声明一个变量,才能使用它。
这句话是什么意思?就是上面那个程序中,如果没有“int a;”这个语句,那编译时就会报错,通常的提示是:[未声明的标识符 ‘a’](error: ‘a’ was not declared in this scope)
解决方法?你是把int a;删掉了引起的这个问题,把它重新加上去呗……
除了int外,C++还有其他基本内置类型。下面都提一下:
bool 布尔型
其值为true或false,用来表示一个条件是否成立。比如我可以声明以下一组变量来简单的表示一个人的基本特征:bool bMale, bTall, bStrong, bHealthy, bMarried;

char 字符型
通常用单引号里面一个字符给它赋值(建议这么做),一个字符占一个字节。另外建议了解一下“转义符”(Escape)。如果你不知道为什么’�’等于0的话那就是还不够了解。

wchar_t 宽字符型
通常用单引号里面一个字符或2个字符给它赋值(建议这么做),一个宽字符占2个字节。有很多人都不知道 wchar_t w = ‘ab’; 这样赋值。

short 短整形
一般占2个字节

int 整形
一般在多少位CPU上工作就占多少位。比如在32位机器上就占4个字节(8位为1字节)。建议不了解的同学搜索一下字、字节、位、双字等单位。

long 长整形
一般占4个字节

float 单精度浮点数
发现有很多同学学了很久C++还不知道如何用C++来表示整数之外的数……建议同学了解一下float在内存中是如何存储的(问搜索引擎)。

double 双精度浮点数
这个也用来表示浮点数,而且推荐使用这个,因为现在32位机器一般处理double比float更快。同样建议同学了解一下double在内存中是如何存储的。

long double 扩展进度浮点数
这个提供的精度一般没有必要,而且还需要承担额外的效率代价。

char型和各种整型前面可以加signed 或 unsigned 说明符
一般不加默认为signed
加unsigned就成了无符号型
有符号型可以表示的数据范围一般是 -2^(n-1) ~ 2^(n-1)-1
无符号型可以表示的数据范围一般是 0 ~ 2^n – 1
如 char 可以表示 -128~127
unsigned char 可以表示 0~255
特别说明:signed a; unsigned b; 一般分别等价于 signed int a; unsigned int b;

除了以上这些基本内置类型外,你还可以使用“typedef”来自定义类型,以及枚举类型(enum)、结构体(struct)、类(class)、联合(union)等

声明变量的格式一般为:
typename identifier [, identifier2, identifier3, ...];
声明时也可以给变量定义,如:
int a = 1, b = 2;

2.函数(function)是什么?
从其英文名可以看出函数其实是一个“功能”,它是用来被调用的,它能根据你提供给它的东西得到一个结果并告诉你、对你提供的东西进行诸多处理、或者只是你对一组常用的语句进行的“打包”。
函数包括参数(parameter)、函数体(function body)、返回类型(return type)。
其声明格式通常为:
return_type function_name(parameters);
声明不包括函数体,定义才包括函数体,定义格式通常为:

其中parameters的格式一般为parameter[, parameter2, parameter3, …] *值得注意的是函数并不一定要有确切数目的参数,感兴趣的可以先自行搜索“C++ 不定参数”来了解
函数体是一个块(Block),块就是用一对花括号括起来的语句序列,可以为空,块就是一个作用域,块中还能有块。
参数就是你提供给它的东西,函数体就是它的实现过程,返回类型是指定它将返回什么类型的结果。
返回类型除了你声明时能用的类型外,还包括一个void类型,即表示不返回东西。
下面来看这样一个例子:

如果窗口一闪而过,解决办法:
1.从Terminal或CMD中调用程序
2.在return 0; 的前面加一条 scanf(“%d”);
3.对于Windows系统,在return 0; 的前面加一条 system(“pause”);

上面这个例子如果不明白 “out” 是什么意思,请搜索“转义符”
如果不明白 char *str 是什么意思没关系,其实这是指针
你要明白的仅仅只是函数的格式以及调用

下面来介绍如何在一个函数func1中调用另一个函数func2的同时func2也调用func1

这个是编译不过的,不管你如何调换func1和func2的顺序都没用。
解决方法是:

函数名和变量名一样也是标识符,也必须要先声明后引用,以上解决办法就是在func1和func2的定义之前加上func2的声明(上面已经介绍了函数声明的格式)

另外还有一个有趣的,那就是一个函数可以调用它自己,看例子:

编译并运行后可以看到会输出10行”Called once”,学过循环控制语句的同学当然还知道其他方法实现这一点。但现在这里是介绍递归函数。通常利用循环控制语句执行效率要比递归函数高。

3.“main”是什么?

4.“#include”是什么?“#include <iostream>”和“#include “iostream””有什么区别?

5.命名空间(namespace)是什么?“#include <iostream>”和“#include <iostream.h>”有什么区别?

6.“using namespace std”是什么?

7.“cin”和“cout”是什么?

第二部分:
1.作用域(Scope)

To be continued…