C++语言程序设计杨国兴 张东玲 彭涛中国水利水电出版社第2章 C++基础 2.1 常量与变量2.2 指针与引用2.3 动态内存分配2.4 位运算符2.5 名字空间2.1 常量与变量2.1.1 常量 常量常量常量常量:在程序运行中,其值不能被改变的量称为常量常量又:在程序运行中,其值不能被改变的量称为常量常量又分为直接常量和符号常量两种分为直接常量和符号常量两种 1.1. 直接常量直接常量直接常量直接常量:直接使用数值或文字表示的值:直接使用数值或文字表示的值 ((1 1))整型常量整型常量整型常量整型常量ØØ 如:如:1010、、-20-20、、0 0ØØ 还可以八进制或十六进制表示:如还可以八进制或十六进制表示:如034034、、0x230x23ØØ 不带后缀的整型常量为不带后缀的整型常量为 intint 型,带后缀型,带后缀 L L 或或 l l 可表示长整可表示长整型常量,带后缀型常量,带后缀 U U 或或 u u 表示无符号整型常量表示无符号整型常量 ((2 2)实)实型常量型常量型常量型常量ØØ 如:如:2.182.18、、-5.6-5.6、、2.3E+22.3E+2、、-3.12E-2-3.12E-2ØØ不带后缀的实型常量为不带后缀的实型常量为 double double 型,带后缀型,带后缀 F F 或或 f f 可表示可表示单精度实型常量单精度实型常量第2章 C++基础2.1 常量与变量2.1.1 常量(续一) ((3 3))字符型常量字符型常量字符型常量字符型常量ØØ 以单引号括起来的单个字符:如以单引号括起来的单个字符:如‘ ‘a’a’、、‘3’‘3’、、‘*’‘*’ØØ 转义字符转义字符:键盘不便于直接输入的字符,如回车符、制:键盘不便于直接输入的字符,如回车符、制表符等,通常以表符等,通常以 “ \ ” “ \ ” 开头开头表表2.3 2.3 转义字符转义字符 \"双引号 \'单引号 \\字符‘\’ \a响铃 \b 退格 \n换行 \r回车 \t水平制表 \v垂直制表\0003位八进制数所代表的字符,如 ‘\101’ 代表‘A’\xhh 2位16进制所代表的字符,如 ‘\x41’ 代表‘A’第2章 C++基础2.1 常量与变量2.1.1 常量(续二) ((4 4))boolbool型常量型常量型常量型常量ØØ boolbool常量只有两个:常量只有两个:true(true(真真) )、、false(false(假假) )ØØ 在内存中占有一个字节的存储空间在内存中占有一个字节的存储空间 ((5 5))字符串常量字符串常量字符串常量字符串常量ØØ 由一对双引号括起来的若干字符,如由一对双引号括起来的若干字符,如“ “abcabc” ”ØØ 字符串常量的末尾自动加入结束标志字符串常量的末尾自动加入结束标志 ‘\0’‘\0’,因此字符串在,因此字符串在内存中占有的字节数为内存中占有的字节数为 字符个数字符个数+1+1ØØ 若字符串中包含特殊字符,如若字符串中包含特殊字符,如 ‘\’ ‘\’、回车、制表符等,也、回车、制表符等,也应以他们对应的转义字符形式表示应以他们对应的转义字符形式表示第2章 C++基础例例2.1 检测基本数据类型所占的字节数#include <#include >void main()void main(){ {coutcout << " << "intint: " << : " << sizeof(intsizeof(int) << ) << endlendl; ;coutcout << "short: " << << "short: " << sizeof(shortsizeof(short) << ) << endlendl; ;coutcout << "long: " << << "long: " << sizeof(longsizeof(long) << ) << endlendl; ;coutcout << "float: " << << "float: " << sizeof(floatsizeof(float) << ) << endlendl; ;coutcout << "double: " << << "double: " << sizeof(doublesizeof(double) << ) << endlendl; ;coutcout << "long double: " << << "long double: " << sizeof(longsizeof(long double) << double) << endlendl; ;coutcout << "char: " << << "char: " << sizeof(charsizeof(char) << ) << endlendl; ;coutcout << " << "boolbool: " << : " << sizeof(boolsizeof(bool) << ) << endlendl; ;} } 返 回第2章 C++基础2.1 常量与变量2.1.1 常量(续三) 2.2. 符号常量符号常量符号常量符号常量:直接使用符号表示的常量值,包括宏定义和:直接使用符号表示的常量值,包括宏定义和constconst定义的符号常量。
定义的符号常量 ((1 1))宏定义宏定义宏定义宏定义ØØ 语法形式:语法形式:#define #define 宏名宏名 字符串字符串ØØ 如:如: #define PI 3.14#define PI 3.14ØØ 程序编译前会自动用字符串取代程序中出现的宏名程序编译前会自动用字符串取代程序中出现的宏名 ((2 2))constconst定义定义ØØ 语法形式:语法形式:const const 类型说明符类型说明符 常量名常量名= =常量值;常量值;ØØ 如:如: const float pi = 3.14 ;const float pi = 3.14 ;ØØ 宏定义在预编译时,只进行简单的替换,不做语法检查宏定义在预编译时,只进行简单的替换,不做语法检查ØØ 宏定义没有数据类型,而宏定义没有数据类型,而constconst定义的符号常量是有数据定义的符号常量是有数据类型的 第2章 C++基础例例2.2 使用符号常量#include void main(){ #define PI 3.14 const int A=10; cout << PI*10*10 << '\n'; cout << A + 20 << '\n';} 返 回第2章 C++基础2.1 常量与变量2.1.2 变量 1.1. 变量的定义变量的定义变量的定义变量的定义:程序运行中值可以被改变的量。
变量必须先:程序运行中值可以被改变的量变量必须先定义再使用定义再使用 变量定义的一般形式变量定义的一般形式变量定义的一般形式变量定义的一般形式ØØ 语法形式:数据类型语法形式:数据类型 变量名变量名1, 1, 变量名变量名2, … , 2, … , 变量名变量名n;n;ØØ 如:如: intint a, b, c; a, b, c; 2. 2. 变量的初始化变量的初始化ØØ 含义:定义变量的同时为其赋初值含义:定义变量的同时为其赋初值ØØ 两种形式:用赋值号两种形式:用赋值号(“=”) (“=”) 或用括号或用括号 如:如: float a = 3.14 ; float a = 3.14 ; 或或 float a(3.14);float a(3.14);第2章 C++基础例例例例2.3 2.3 从键盘输入从键盘输入n n的值,计算从的值,计算从1 1到到n n的累加和的累加和include <#include >void main()void main(){ {intint n, sum=0; n, sum=0;cincin >> n; >> n;intint i; i;for(ifor(i=1;i<=n; i++)=1;i<=n; i++)sum+=i;sum+=i;coutcout << sum << '\n'; << sum << '\n';} } 返 回第2章 C++基础2.2 指针与引用2.2.1 指针 1. 1. 地址与指针的概念地址与指针的概念地址与指针的概念地址与指针的概念 ((1 1))内存地址内存地址内存地址内存地址 计算机的内存储器被划分成一个个的计算机的内存储器被划分成一个个的存储单元存储单元,这些存储单元,这些存储单元按一定的规则按一定的规则编号编号,这个,这个编号编号就是存储单元的就是存储单元的地址地址。
每个存储单元的大小为一个字节,每个单元有一个唯一的地址每个存储单元的大小为一个字节,每个单元有一个唯一的地址 ((2 2))变量的地址变量的地址变量的地址变量的地址 在程序中定义的所有变量,都要分配相应的在程序中定义的所有变量,都要分配相应的存储单元存储单元,不同类,不同类型的数据所需要的存储空间的大小不同型的数据所需要的存储空间的大小不同 系统分配给变量的内存空间的起始单元地址系统分配给变量的内存空间的起始单元地址称为该变量的称为该变量的地址 如:如: intint a a;; 则则0x30000x3000为变量为变量a a的地址的地址0x3000 0x3001 0x3002 0x3003第2章 C++基础2.2 指针与引用2.2.1 指针 2. 2. 指针与指针变量指针与指针变量指针与指针变量指针与指针变量 ((1 1))指针:指针:指针:指针:一个变量的一个变量的地址地址也称为该变量的也称为该变量的指针指针。
((2 2))指针变量:指针变量:指针变量:指针变量:用于存储其它变量的指针用于存储其它变量的指针( (即地址即地址) )的变量 指针变量的定义:指针变量的定义: 数据类型数据类型 * *指针变量名;指针变量名; 如:如: intint *p1 *p1;; float *p2;float *p2; char *p3; char *p3; 注意:指针变量所指向的变量类型不能改变注意:指针变量所指向的变量类型不能改变 指针变量必须指向具体内存地址才能引用,如:指针变量必须指向具体内存地址才能引用,如: intint *p; *p=10; *p; *p=10; ((3 3))指针运算符指针运算符指针运算符指针运算符(*)(*)与取地址运算符与取地址运算符与取地址运算符与取地址运算符(&)(&)×第2章 C++基础例2.4 通过指针变量存取变量的值 #include void main(){int a, *p1;double b, *p2;char c, *p3;p1 = &a;p2 = &b;p3 = &c;*p1 = 10;*p2 = 11.2;*p3 = 'A';cout << a << endl;cout << b<< endl;cout << c << endl;} 程序运行结果为:程序运行结果为:1011.2A100x2000ap111.20x2004bp2A0x200Ccp3第2章 C++基础例2.5 输入a和b两个数,按从小到大的顺序输出 #include void main(){int a, b;int *p1, *p2, *p; cout << "请输入两个整数:请输入两个整数:";cin >> a >> b;p1 = &a;p2 = &b;if( *p1 > *p2 ){p = p1;p1 = p2;p2 = p;}cout << "min=" << *p1 << " max=" << *p2 << endl;} 程序运行结果为:程序运行结果为:请输入两个整数:30 10min = 10 max = 30&ap1&bp2p30a10b&bp1&ap2&ap30a10b第2章 C++基础2.2 指针与引用2.2.1 2.2.1 指针指针3. 3. 指针作为函数的参数指针作为函数的参数 指针作为函数的参数,实际上传递的是变量的地址,进行的是指针作为函数的参数,实际上传递的是变量的地址,进行的是地址传递地址传递。
例例2.6 2.6 指针作为函数参数,被调函数中交换参数值指针作为函数参数,被调函数中交换参数值#include void swap(int *x, int *y);void main(){int a, b;a = 10;b = 20;swap(&a, &b);cout << a << ", " << b << endl;}void swap(int *x, int *y){int temp;temp = *x;*x = *y;*y = temp;}第2章 C++基础2.2 指针与引用 例例2.6 2.6 程序运行过程中变量值的变化分析程序运行过程中变量值的变化分析yyb10ax20by&ax&b10temp20ax20by10temp&aax&bb10temp&a&btemp10a20&a&b2010(a)(b)(c)(d)程序运行结果为:程序运行结果为:2020,,1010第2章 C++基础2.2 指针与引用2.2.2 2.2.2 引用引用1.1. 引用的概念引用的概念引用的概念引用的概念 引用是一种特殊的变量,可以认为是一个变量的别名。
引用是一种特殊的变量,可以认为是一个变量的别名 定义引用的一般格式定义引用的一般格式:::: 类型说明符类型说明符 & &引用名引用名 == 变量名;变量名; 如:如: intint a = 1; a = 1; intint &b = a; &b = a; 首首先先定定义义变变量量a a,,并并初初始始化化为为1 1,,然然后后定定义义引引用用b b,,并并初初始始化化为为a a,即,即b b是是a a的别名,因此的别名,因此a a和和b b是同一个单元是同一个单元 注意注意:定义引用时一定要初始化,指明该引用变量是谁的别名定义引用时一定要初始化,指明该引用变量是谁的别名第2章 C++基础例2.7 引用的使用#include void main(){int a=1;int c=10;int &b = a;cout << a << ", " << b <<", " << c << endl;b = c;cout << a << ", " << b <<", " << c << endl;b = 20;cout << a << ", " << b <<", " << c << endl;}程序运行结果:程序运行结果:1 1,,1 1,,10101010,,1010,,10102020,,2020,,1010定义引用定义引用b,并将其作为,并将其作为a的别名的别名将将c的值赋给的值赋给b,不是将,不是将b作为作为c的别名的别名第2章 C++基础2.2 指针与引用2.2.2 引用(续一) 2. 2. 引用作为函数的参数引用作为函数的参数引用作为函数的参数引用作为函数的参数 例例2.8 2.8 写一个函数,用引用作为参数,交换函数中两个变量写一个函数,用引用作为参数,交换函数中两个变量的值。
的值 #include void swap(int x, int y);void main(){int a, b;a = 10;b = 20;swap(a, b);cout << a << ", " << b << endl;}void swap(int &x, int &y){int temp;temp = x;x = y;y = temp;}程序运行结果为:程序运行结果为:2020,,1010第2章 C++基础2.2 指针与引用2.2.2 引用(续二) 例例2.82.8程序运行过程中参数值的变化图示程序运行过程中参数值的变化图示10axby20axby10temp20axby10temp10axby10temp20202010注意:引用作参数时,函数的实参与形参在内存中共用存储单元,因此形参的注意:引用作参数时,函数的实参与形参在内存中共用存储单元,因此形参的变化会使实参同时变化变化会使实参同时变化 返 回第2章 C++基础2.3 动态内存分配 在程序运行过程中根据需要动态分配存储空间,不需要时还可在程序运行过程中根据需要动态分配存储空间,不需要时还可以将空间释放,通过以将空间释放,通过newnew和和deletedelete运算符实现。
运算符实现 1. 1. 动态分配一个数据的存储空间动态分配一个数据的存储空间动态分配一个数据的存储空间动态分配一个数据的存储空间 通过通过newnew运算符实现动态分配内存,格式如下:运算符实现动态分配内存,格式如下: new new 类型名(初值)类型名(初值) 如:如: intint *p1, *p2; *p1, *p2; p1 = new int(10); p1 = new int(10); p2 = new p2 = new intint; ; 运算符运算符deletedelete用来释放由运算符用来释放由运算符newnew动态分配的存储空间使动态分配的存储空间使用格式如下:用格式如下: delete delete 指针名指针名; ; 如:如:delete p1; delete p1; 第2章 C++基础2.3 动态内存分配 2. 2. 动态分配多个连续的数据存储空间动态分配多个连续的数据存储空间动态分配多个连续的数据存储空间动态分配多个连续的数据存储空间 通过通过newnew运算符动态分配数组,格式如下:运算符动态分配数组,格式如下: new new 类型名类型名[ [整型表达式整型表达式] ] 如:如: intint *p1; *p1; p1 = new int[10]; p1 = new int[10]; 用用deletedelete删除动态数组时,要在指针前加删除动态数组时,要在指针前加 “ “[]”[]”。
格式如下:格式如下: delete [] delete [] 指针名指针名; ; 如:如:delete [ ] p1; delete [ ] p1; 第2章 C++基础例2.9 动态内存分配的使用#include void main(){int *p1, *p2;p1 = new int(10);p2 = new int[10];int i;for(i=0; i<10; i++)*(p2+i) = i;cout << *p1 <
使用位运算符可以对数据按二进制位进行操作 1.1. 按位与(按位与(按位与(按位与(& &)))):将两个操作数对应的每一位分别进行逻辑与:将两个操作数对应的每一位分别进行逻辑与ØØ 如:如:9&79&7 9 9:: 0000100100001001 7 7:: 0000011100000111 9&7 9&7:: 00000001 00000001 9&79&7结果为结果为1 1 2. 2. 按位或(按位或(按位或(按位或(| |)))) :将两个操作数对应的每一位分别进行逻辑或:将两个操作数对应的每一位分别进行逻辑或 3. 3. 按位异或(按位异或(按位异或(按位异或(^ ^)))) :将两个操作数对应的每一位分别进行异或:将两个操作数对应的每一位分别进行异或第2章 C++基础2.4 位运算符2.4.1 位运算符(续) 4.4. 按位取反(按位取反(按位取反(按位取反(~ ~)))):单目运算符,对二进制的每一位取反:单目运算符,对二进制的每一位取反 5. 5. 左移位(左移位(左移位(左移位(<<<<)))) :使运算符左侧的操作数的各位左移指定位:使运算符左侧的操作数的各位左移指定位数,低位补数,低位补0 0,高位溢出部分舍弃。
如,高位溢出部分舍弃如 7<<27<<2结果为结果为2828 6. 6. 右移位(右移位(右移位(右移位(>>>>)))) :使运算符左侧操作数的各位右移指定位数,:使运算符左侧操作数的各位右移指定位数,溢出的低位舍弃,对无符号数和有符号中的正数,高位补溢出的低位舍弃,对无符号数和有符号中的正数,高位补0 0,对于,对于有符号数中的负数,有些系统补有符号数中的负数,有些系统补0 0(称为逻辑右移),有些系统补(称为逻辑右移),有些系统补1 1(称为算术右移)如(称为算术右移)如 7>>27>>2的结果是的结果是1 1000001117000111007<<2第2章 C++基础2.4 位运算符2.4.2 2.4.2 位运算符应用举例位运算符应用举例 例例2.10 2.10 输入变量输入变量a a,,b b的值,并将变量的值,并将变量a a的低的低4 4位置为位置为0 0,将变,将变量量b b的低的低4 4位置为位置为1 1include <#include >void main()void main(){ {intint a,ba,b; ;cincin >> a; >> a;cincin >> b; >> b;a = a & (~0xf); a = a & (~0xf); b = b | 0xf;b = b | 0xf;coutcout << a << << a << endlendl; ;coutcout << b << << b << endlendl; ;} }0xf为十六进制数,它的后四位为十六进制数,它的后四位为为1,其他位均为,其他位均为0。
取反后后取反后后四位为四位为0,其他位均为,其他位均为1若输入若输入2525和和2323,程序,程序执行结果为:执行结果为:16163131 返 回第2章 C++基础2.5 名字空间2.5.1 2.5.1 名字空间的定义与使用名字空间的定义与使用 1.1.名字空间的定义名字空间的定义名字空间的定义名字空间的定义 namespace namespace 名字空间名名字空间名{ { …… …… …… ……} } 例例例例 :: namespace NameSpace1namespace NameSpace1{ { intint a; a; intint f1() f1() {……} {……} float f2() float f2() {……} {……}} } (1)名字空间只能在全局范围那定义,但名字空间是可以嵌套的。
(2)一个名字空间可以用另一个名字作为它的别名例如使用ns1作为上述名字空间NameSpace1的别名,可以用下面的语法:namespace ns1 = NameSpace1;第2章 C++基础2.5 名字空间2.5.1 名字空间的定义与使用2.名字空间的使用名字空间的使用 (1)使用域运算符格式如下: 名字空间名名字空间名::标识符标识符 例如下面一行程序,可以访问名字空间NameSpace1中的变量a和函数f1()NameSpace1::a = NameSpace1::f1(); 第2章 C++基础例2.11 名字空间的定义与使用#include <#include >namespace ns1namespace ns1{ { intint fun(intfun(int x, x, intint y); y);} }namespace ns2namespace ns2{ { intint fun(intfun(int x, x, intint y); y); namespace ns3 namespace ns3 { {intint fun(intfun(int x, x, intint y); y); } }} }intint ns1::fun(int x, ns1::fun(int x, intint y) y){ { return return x+yx+y; ;} }int ns2::fun(int x, int y){ return x*y;}int ns2::ns3::fun(int x, int y){ return x-y;}void main(){ cout << ns1::fun(3,4) << endl; cout << ns2::fun(3,4) << endl; cout << ns2::ns3::fun(3,4) << endl;}程序运行结果: 7 12 -1第2章 C++基础2.5 名字空间2.5.1 名字空间的定义与使用2.2.名字空间的使用名字空间的使用名字空间的使用名字空间的使用 ((2 2)使用)使用usingusing指令指令格式如下:格式如下: using using 名字空间名名字空间名名字空间名名字空间名; ; using using 名字空间名名字空间名名字空间名名字空间名:: ::标识符标识符标识符标识符; ; 第一种格式表示在当前范围内,可以直接使用指定第一种格式表示在当前范围内,可以直接使用指定名字空间中定义的变量和函数等,而不需要加名字空间名字空间中定义的变量和函数等,而不需要加名字空间的限定。
的限定 第二种格式表示在当前范围内,可以直接使用指定第二种格式表示在当前范围内,可以直接使用指定名字空间中指定的变量或函数,而不需要加名字空间的名字空间中指定的变量或函数,而不需要加名字空间的限定第2章 C++基础例例2.12 使用using指令 #include <#include >namespace ns1namespace ns1{ {intint fun1(int x, fun1(int x, intint y); y);intint fun2(int x, fun2(int x, intint y); y);intint fun3(int x, fun3(int x, intint y); y);intint fun1(int x, fun1(int x, intint y) y){ {return return x+yx+y; ;} }intint fun2(int x, fun2(int x, intint y) y){ {return return x-yx-y; ;} }intint fun3(int x, fun3(int x, intint y) y){ {return x*y;return x*y;} }} }using namespace ns1;using namespace ns1;void main()void main(){ {coutcout << fun1(3,4) << << fun1(3,4) << endlendl; ;coutcout << fun2(3,4) << << fun2(3,4) << endlendl; ;coutcout << fun3(3,4) << << fun3(3,4) << endlendl; ;} }程序运行结果: 7 -1 12第2章 C++基础2.5 名字空间2.5.2 C++标准库 C++ C++标准库就被所有的标准库就被所有的C++C++编译器支持,所有标准编译器支持,所有标准C++C++的库都的库都包含在一个单一的名字空间包含在一个单一的名字空间stdstd中。
为了使用中为了使用C++C++的标准库,可以的标准库,可以使用以下指令:使用以下指令: using namespace std;using namespace std;例:使用标准库的程序例:使用标准库的程序#include <#include >using namespace std;using namespace std;void main()void main(){ { coutcout << “ << “本例使用标准库本例使用标准库” ” << << endlendl; ;} } 注意:由于注意:由于iostreamiostream和和iostream.hiostream.h都定义了都定义了coutcout,因此不能同,因此不能同时包含这两个文件,否则将产生二义性时包含这两个文件,否则将产生二义性第2章 C++基础谢 谢!。