第1部分C简述.docx
《第1部分C简述.docx》由会员分享,可在线阅读,更多相关《第1部分C简述.docx(25页珍藏版)》请在冰豆网上搜索。
第1部分C简述
第一章C++程序设计概述
1.C++是具有面向对象扩充内容的过程型程序设计语言。
2.每个C++程序都由主函数main()函数,并在主函数返回时结束。
3.函数从函数体中最前面的第一个语句开始执行,结束于函数体内部的最后一条语句,或者遇到return语句返回。
每个函数在执行完毕后返回到调用该函数的位置,接着执行下一条语句。
4.函数和变量的声明语句,必须出现在调用或者使用它们的语句之前。
5.语句可以分为:
声明:
声明变量和函数
定义:
定义变量和函数的实例
过程语句:
在函数内定义的可执行语句
变量声明语句声明了变量的存储类型、数据类型、名称等。
函数声明语句(常称为函数原型)声明函数的返回值、名称、参数的个数和类型。
通常,变量的声明和定义放在同一语句内。
函数的原型和定义一般在不同的位置。
如果函数的定义出现在所调用它的源代码之前,那么定义本省已经起到了函数原型的作用。
过程语句可以是赋值语句、表达式语句或者程序流控制语句。
表达式语句是具有返回值的程序语句。
它可以独立存在,或者放在赋值语句的右侧。
表达式由变量、常量、运算符和函数调用组成。
赋值语句本身也是表达式。
每一条C++语句都以分号(;)结束。
6.C++使用结构化的程序控制结构,它包括顺序结构(一句接一句执行)、循环结构(for和while)和选择结构(if……else和switch-case控制结构)。
C++还允许使用goto语句实现非结构化流程。
7.类是由数据成员成员函数构成的集合的定义。
类把用户定义数据类型的接口和数据封装起来,构成一个抽象的数据类型。
类的使用需要对类进行实例化,即对象。
然后对该对象引用类的方法,即调用类的成员函数。
对象通过调用成员函数,就好像对象有行为一样。
8.C++程序是由多个源代码模块构成,它们被编译成目标代码模块,然后链接成为一个可执行的程序模块。
一个典型的C++程序中,大多数的目标代码来自于已编译好的、可重复利用的类或者函数。
9.C++没有系统内提供的输入输出语句,输入输出功能是由标准类库中的C++类来提供。
事实上,许多其他语言固有的功能,在C++中都是通过类来实现。
10.主函数main():
每一个C++程序都有一个主函数main()。
它是程序的入口也是出口。
一个函数由:
返回类型、函数名(标识符)、参数列表和函数体组成。
参数列表在函数后的圆括弧中,函数体以左大括弧({)开始,以右大括弧(})结束。
用大括弧包起来的语句组称为语句块,每一个语句块可以相当于一条语句。
语句块可以嵌套,函数体至少要有一个语句块。
return语句结束函数,return语句可以放在函数内部的任意位置。
第二章写一个简单的C++程序
2.2标识符
一个C++程序有许多组成部分:
变量、函数、类等,它们都有名称,就是标识符。
定义标识符需要遵循以下几条规则:
(1)标识符只能由字母、下划线、数字三类字符组成
(2)第一个字符必须是字母或下划线(下划线被视为系统自定义的标识符)
(3)大写字母和小写字母是不同的字符
(4)标识符可以任意长,但只有前32位是有效的。
(5)标识符不能为C++的关键字。
2,3C++关键字
表格1标准C++关键字
asm
do
inline
short
tyeid
auto
double
int
signed
tyename
bool
dynamic_cast
long
sizeof
union
break
else
mutable
static
unsigned
case
enum
namespace
static_cast
using
catch
explicit
new
struct
virtual
char
extern
operator
switch
void
class
false
private
template
volatile
const
float
protected
this
wchar_t
const_cast
for
public
throw
while
continue
friend
register
true
default
goto
reinterpret_cast
try
delete
if
return
typedef
表格2C++国际性关键字
and
bitor
or
xor_eq
and_eq
compl
or_eq
not_eq
bitand
not
xor
2.5变量
1.布尔型变量:
关键字(bool)它是有两种逻辑状态的变量,有两个值,真和假(1和0)。
2.字符型变量:
关键字(char)存放的字符是计算机字符集中的字符。
在C++系统中字符数据用8位单字节的ASCII码表示,用std:
:
cout输出。
3.宽字符型变量:
关键字(wchar_t)数据类型为16位双字节。
用std:
:
wout输出。
、
4.整型变量:
按长度分有:
短整型(short),整形(int),长整形(long);按符号分有符号型(signed,默认),无符号型(unsigned,须声明)。
在定义长整型、短整型、符号整型和无符号整型时,可以省略关键字int。
短整型为16位,整型和长整型均为32位。
用std:
:
cout输出。
5.浮点类型:
单精度浮点型(float),双精度浮点型(double),长双精度浮点型(longdouble)。
2.6常量
常量是表达式中明确表示出的值,在两个方面区别于变量:
第一,除非在语句中出现,否则它不在内存中占有编译空间;第二,不能为它赋值或改变它的值。
有别于const变量类型。
1.字符型常量:
2.转义字符:
’\XX’
3.整型常量:
符号型(signed)
无符号型(unsigned)
短整型
-32768到+32727
0到65535
整型、长整型
-231到231-1
0到232-1
可以指定一个整型常量为:
二进制、八进制(数字之前加0,不是字母o)、十六进制(数字之前加0x)。
4.浮点型常量:
浮点型常量由整数和小数两部分构成,中间用十进制的小数点隔开。
有些用科学计数法表示。
如果不在后面加后缀,在默认状态下,浮点型常量为double类型如:
1.23E10F,3.34L,后缀大小写均可。
5.地址常量:
6.字符串常量:
2.7表达式
函数体中的语句由表达式构成,表达式的结束标志也是分号(;),C++中所有的语句和声明都是用分号结束,否则语句便不完整。
表达式由常量、变量、函数调用和运算符组合而成,计算之后返回一个值。
表达式本身什么也不做,只返回一个结果值。
若程序不对返回的结果值进行操作,则返回的结果值不起任何作用。
表达式产生作用有两种作用:
一,放在赋值语句的右侧;二,作为函数调用的参数。
表达式返回的值是有类型的,该类型取决于组成表达式的变量和常量的类型。
表达式返回的值都具有逻辑性。
如果返回值非零,则表达式为真,返回真值;否则返回假值。
这种特性用在控制程流程的语句中,用来构造条件表达式。
2.8赋值语句
赋值语句是把一个表达式的结果值赋给一个变量。
得以赋值的变量称为左值(lvalue),因为它们出现在赋值语句的左侧;产生值的表达式称为右值(rvalue)。
左值必须是可以被赋值的变量。
常量只能作为右值。
2.9用逗号分开的声明语句
若列表中标识符是同一类型,C++中允许用逗号分隔开声明语句中的标识符,如:
inthour_rate,hour_worked,gross_pay;
用逗号分隔标识符时,把标识符写在不同的行上,如:
inthour_rate,
hour_worked,
gross_pay;
这种方法每个变量都是分开的,便于注释。
还可以对变量进行分组,修改很方便。
2.10表达式中的运算符
表达式是由变量、常量、函数调用和运算符组成。
运算符分为:
算术运算符、逻辑运算符、位移运算符、关系运算符、自增运算符、自减运算符和赋值运算符。
大多数运算符是二目运算符,即运算符位于两个表达式之间,比如加法运算符。
还有一些单目运算符,即运算符作用于单个表达式,如自加和自减运算符。
1.算术运算符
C++有两个单目和五个双目算术运算符。
+
单目正
没有作用
-
单目负
返回一个数值表达式的相反数
*
乘法
/
除法
%
取模
a%b,计算得到a/b的余数
+
加法
-
减法
2.逻辑运算符
逻辑运算符根据表达式的真假属性返回真值或者假值。
在C++中,表达式的值非零,为真,在逻辑运算中等价于1,假值总是0。
&&逻辑与
||逻辑或
!
单目逻辑非
3.位逻辑运算符?
?
?
?
?
?
?
位逻辑运算符实现位的设置、清零、取反、取补操作。
&位逻辑与
|位逻辑或
!
位逻辑异或
~单目取补
4.位移运算符?
?
?
?
?
?
?
位移运算符把整型量的位向左或者向右移动数位,这些运算符只可用于整型表达式。
<<左移运算符
>>右移运算符
向左移位就是在低位上插入零。
向右移位就是在高位上插入零。
右移可以保留结果的符号位。
向左移动1位其值变为原来的2倍;向右移动1位其值变为原来的一半。
位移动运算符可以用来进行整数的乘除法运算,不过乘法/除法因子必须是2的n次幂。
5.关系运算符
>大于
<小于
>=大于等于
<=小于等于
==等于//不要和赋值运算符(=)混淆,可以将常量写在右侧,使错误容易检查
!
=不等于
6.自增和自减运算符
C++还提供特殊的运算符,自增和自减就是其中的两个。
主要要注意的是自增和自减运算符是作为前缀还是作为后缀。
前缀:
自增或自减运算符先完成,然后再参与其他运算;后缀:
变量在运算完成后,再进行自增后者自减。
7.赋值运算符
赋值语句本身也是表达式,具有返回值,其返回值就是赋值表达式左侧变量赋值后的值。
赋值语句的执行顺序是从右向左,也就是说,表达式的计算是从最右端开始。
=赋值
+=加法赋值
-=减法赋值
*=乘法赋值
/=除法赋值
%=模运算赋值
<<=左移赋值
>>=右移赋值
&=位逻辑与赋值
|=位逻辑或赋值
^位逻辑异或赋值
8.复合赋值运算符
复合赋值运算符是C和C++语言中独有的,它们实际上是一种缩写形式,使得对变量的改变更为简洁。
可以减少一次计算。
9.条件运算符
(a>b?
a:
b)对一个表达式的真假进行检验,然后根据检验结果返回另外两个表达式中的一个,运算符形式如下:
?
:
在运算符中,首先对表达式1的值进行检验,如果值为真,返回的就是表达式a的结果值,如果值为假,返回的是第三个表达式的结果值。
条件运算符实际上是if……else语句的缩写:
if(expression1)
{expressiona;}
else
{expressionb;}
以及其他各种表示方法,C++是一种多选择的语言。
条件运算符的执行方向是从右到左:
a>b?
a:
a>b?
a:
b等价于a>b?
a:
(a>b?
a:
b)
10.逗号运算符
在C和C++的表达式列表中,多个表达式可以用逗号分开,其中用逗号分隔开的表达式被分别计算,并且整个表达式列表的值是最后一个表达式的值。
11.运算符的优先级和结合性
表中第二行的+,-运算符是单目正和单目负运算符,第四行是双目加和减运算符。
第二行的*是指针运算符,&是取地址运算符。
12.表达式不参加运算的情况
逻辑或运算中,条件运算中等
13.初始化
一般初始化为:
inta=b;形式。
如果变量是全局变量和静态变量,初始化表达式必须是常量。
局部变量可以在初始化中包含任意表达式。
在C++中还可以使用以下初始化语法:
inta(b);这种初始化方法适用于对类的对象的声明,它调用了类的构造函数,并把初始化值传递到构造函数中。
14.类型转化
15.控制台输入与输出
标准输入输出流、格式输出、标准错误流等
16.小结
第三章函数
函数是C++程序的基本单元。
函数中包含了程序的可执行代码。
每个C++程序的入口和出口都位于main()函数之中,main()可以调用其它函数,其它函数不可调用main()函数。
通常把这些被调用的函数称为下层函数。
程序员应该学会用“黑箱”的观点来看待下层函数,能够使用他完成预定的操作,不必关心其内部的实现细节。
3.1函数
一个函数包括函数头和语句体两个部分。
函数头由以下三部分组成:
返回值类型、函数名、参数表。
返回值可以是C++数据类型、指向某个数据类型的指针、指向结构的指针、指向数组的指针等。
函数名在程序中必须是唯一的。
参数表可以没有或者有多个变量(形参),在函数调用时,实际参数将被传递到这些变量中。
语句体包含局部变量的声明和函数的可执行代码。
3.2实际参数和形式参数
函数定义中的参数是形参(parameter),在函数调用时传递给函数的值就被传递到这些形式函数。
函数调用者提供给函数的参数叫实参(argument),它是表达式的计算结果,在函数调用时被传递给形参。
3.3函数原型声明
为了调用一个函数必须先声明该函数的返回值了类型和参数类型。
在K&R的C中没有这一条要求,它允许第一次调用函数是进行隐世声明。
但是标准C++中,必须把函数的参数类型和返回值类型告诉编译器。
函数声明称为函数原型。
在函数原型中可以省略形参的标识符,使声明更简洁;但形参用标识符表示出来可以是代码容易阅读。
如果函数定义在调用之前就不需要进行声明。
但是为了和程序从上到下的执行顺序保持一致,有些程序员把所有函数原型声明集中放在程序的头部,并总是第一个定义main()函数。
一个函数可以既无返回值,又无参数。
3.4函数的定义和调用
定义一个函数就是编写其函数头和语句体的代码。
若函数已经声明过原型,那么函数定义的参数和返回值类型必须和原型完全一致。
3.5函数的返回
函数的返回:
一种是调用exit()函数,它不但终止了被调用的函数,也结束了整个程序的运行;第二种是程序执行到最后也会自动返回;还有一种方法是执行return语句,它退出被调用的函数不会结束整个程序。
3.6函数的返回值
有返回值的函数都是通过return语句来返回。
返回值的类型必须和函数原型的返回类型一致。
3.7参数的传递和使用
良好的程序设计风格提倡每一个函数都完成一个特定的功能
在C++语言中,允许在表达式中需要某类数值的地方调用能返回该类数值的函数。
如:
cout<参数的传递有按值传递、按地址传递。
3.8无名的函数形参
声明函数时可以包含一个或多个用不到的形参,这种情况多出现在用一个通用的函数指针调用多个函数的场合,其中有些函数不需要函数指针声明中的所有参数。
C++允许声明一个无名的参数。
3.9函数的默认参数
C++函数的原型中可以声明一个或者多个带有默认值的参数。
在调用函数时,省略了相应的实际参数,编译器就会把默认值作为实际参数。
如果省略了第一个参数,那么后面的参数也必须省略,不能省略前面的参数而对后面的参数赋值。
3.10内联函数
在C++里,可以把函数指定为内联(inline)函数,这样编译器就会在每个调用该函数的地方就会展开一个函数的拷贝。
使用内联函数可以减少函数调用带来的开销。
不过应该在函数很简短或者调用次数相对较少的情况下,才将其指定为内联函数。
使用内联函数可以替代一下两种情况:
第一,它提供了改进的宏功能;第二,也可以把一个很大的函数拆分成多个嵌套的语句块,分解到一些很简短的内联函数中,这样可以改进程序的可读性,并减少函数调用带来的开销。
3.11递归
C++的函数都是支持递归的,也就是说每个函数都可以直接或者间接调用它自己。
间接调用就是指在递归函数调用的下层函数在调用自己。
函数之所以可以递归,是因为每当函数被调用时,都会把参数和其他局部数据对象拷贝到一块专有的内存区域,而且同一个函数的每个执行进程都有一个单独的拷贝。
3.12函数重载
C++中允许多个函数有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。
函数重载不仅是为了在相同的数据上完成不同的算法操作,另一个原因是要从不同格式的数据得到相同的结果。
3.13安全连接
名字重组技术
3.14连接说明
第四章程序流程控制
4.1语句块
嵌套深度:
过多的语句块嵌套,源代码就会越来越偏向右侧,偏得太远,代码就会变得难以阅读和理解,这是应该重新组织函数的结构,把过深的嵌套层次分解为独立的函数。
缩进风格:
尽量在同一程序中保持风格的一致。
4,2条件语句
if语句:
C++使用if……else流程来检验条件。
可以在if语句的条件表达式里声明变量,该变量必须能够被转换为布尔型变量。
程序只能在if(条件为真时)后面或else(条件为假时)使用该变量。
另外,声明必须在表达式的最前面,而且不能放在圆括号里面,如下:
if(intselection=GetSelection())正确
if((intselection=GetSelection())==1)错误
switch……case语句
4.3循环语句
循环就是反复执行一段指令,直到某个条件满足为止。
C++有三条循环语句:
while、do……while和for语句。
while语句首先检验一个条件,当条件为真时,就执行紧随其后的语句或者语句块。
每执行一次循环,程序都会回到while语句,重新检验条件是否满足。
如果一开始条件就不满足,则直接跳过循环体中的语句,执行后面的程序。
如果一开始条件满足,那么在循环有限次后,必须有使条件为假的操作,否则该循环就会成为死循环。
while语句和switch语句搭配可以设计一个用户选择菜单。
do……while语句:
不论条件是否满足,循环过程至少会被执行一次。
循环体放在do语句之后,检验条件的while语句放在循环体后面。
for语句:
for(;;)
4.4循环控制
在循环过程中,我们经常需要强行终止,跳出循环,而有时候又需要终止当前循环,跳到循环体头部进行下一次循环。
为此,C++分别提供了break语句和continue语句。
break终止并跳出循环,继续执行后面的代码。
这里break语句的作用和switch……case语句分支结构力的作用是不一样的。
continue语句并不跳出循环,只是终止此次循环,返回到循环头部继续执行。
4.5跳转
goto语句可以使程序立即跳转到函数内部的任意一条可执行语句。
goto关键字后面带有一个标识符,该标识符是同一个函数内某条语句的标号。
标号可以出现在任何可执行的语句的前面,并且以一个冒号(:
)作为后缀。
跳转可以向前,也可以向后;可以跳出一个循环,也可以跳入一个循环。
“goto语句不能跳过包含隐式或显式初始化的变量声明语句”?
有两种解决办法,一个是用赋值来代替初始化,这样跳转语句就不会绕过任何初始化过程,另一个是把变量的声明放在用大括号括起来的语块里,巧妙地修正了原来程序的错误。
第五章C++的数据类型
5.1作用域
C++程序的作用域(Scope)有三种:
全局、局部和文件。
标识符的作用域决定了程序中哪些语句可以使用它。
通常标识符的作用域都是通过它在程序中的位置隐式说明的。
只有文件作用域例外,必须显式说明。
不同的作用域可以有相同的标识符。
全局作用域(GlobalScope)的变量和函数,在程序的任意位置都可以访问它们。
当一个变量是在所有的函数外部声明的,就称为外部(external)变量,并默认有全局作用域。
但是全局变量必须声明在同一源代码文件中任何需要使用该变量的位置之前,在声明之后的函数都可以使用该变量。
也就是必须在同一源代码中先声明后使用。
局部作用域(LocalScope)它们声明在函数内部,无法被其他函数的代码所访问。
函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部的所有语句块。
位于不同的作用域的变量可以有相同的标识符。
作用域的屏蔽作用:
若内层作用域的变量和已经声明的某个外层作用域的变量有相同的名字,那么内层作用域的变量将屏蔽外层作用域的同名变量,直到离开内层作用域为止。
局部变量的作用域终止于声明该变量的语句块的末尾。
全局作用域的解析符:
当一个局部变量和一个全局变量具有相同的名字时,所有对该变量名的引用(当程序处于局部变量的作用域时)都会指向局部变量。
这时如果要使用全局变量,就要使用全局变量解析符(:
:
)来通知编译器。
全局变量解析符,作为前缀放在变量名之前(如,:
:
varname)。
文件作用域(FileScope):
指的是外部标识符仅在声明它的同一个转换单元内的函数中可见。
所谓的转换单元是指定义这些变量和函数的源代码文件(包括任何通过#include指令包含的源代码文件)。
static储存类型修饰符指定了变量具有文件作用域。
实际上,C++有了类和命名空间机制,就没有必要对函数外声明的变量和函数使用static储存类型修饰符。
作用域和生存周期:
在函数的语块内声明的变量,只存在于从声明位置到语句块结束的这段区间内。
只要程序还停留在语句块内,或者在内层语句块内,变量就是存在的,这一段时间就称为变量的生存周期。
当程序在语句块内调用其他函数时,尽管变量依然存在,但是它是不可见的,直到被调用的函数返回为止。
5.2存储类型
存储类型有以下四种:
自动(auto)、静态(static)、外部(extern)和寄存器(register)。
auto:
指每次执行到定义该变量的语句块时,都将为改变量在内存中产生一个新的拷贝,并对其进行初始化,实际上如不是特别指定,局部变量的存储类型默认为自动。
但auto不能再和其他类型说明符组合(如autoint就会报错)。
static:
对于局部变量,static是和auto相对而言的,尽管静态局部变量的作用域仍然仅限于声明它的语句块内,但在语句块执行期间,变量将始终保持它的值,而且,初始化语句只在语句块第一次执行时起作用,在随后的运行过程中,变量将保持语句块上一次执行后的值。
extern:
外部存储类型声明了程序将要用到的、但尚未定义的外部变量。
通常,外部存储类型都是用于声明在另一个转换单元中定义的变量。
外部变量的声明既可以在引用它的函数内部,也可以在函数的外部。
如果在内部,就只有这一个函数可以使用该变量。
反之同一转换单元内的所有函数都可以使用这个外部变量。
在以程序里,同一个外部变量可以有多个外部声明,但是只能有一个定义。
所谓定义就是指不带外部存储类型修饰符(extern)的声明,它必须在所有函数的外部。
声明和定义可以分散在多个转换单元内,也可以在同一个单元内。
只能有一个声明或者定义带有初始化值,并且这个初始化值可以放在定义或者任何一个函数外部声明中,但是不能出现在函数内部的声明中。
如果某个外部声明中包含了初始化值,那么程序中就不需要再对该变量进行定义,否则就必须定义。
在一个程序