ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:25.63KB ,
资源ID:10864232      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10864232.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c++ primer plus学习小结.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

c++ primer plus学习小结.docx

1、c+ primer plus学习小结1. 包含所有基本数据类型的大小和占用空间的头文件/usr/include/limits.h#include / 符号常量CHAR_BIT char的位数 8CHAR_MAX char的最大值 127CHAR_MIN char的最小值 -128SHRT_MIN short的最小值 -32768UINT_MAX unsigned int的最大值 4294967295/* / 例如 /usr/include/limits.h 内容# define UINT_MAX 4294967295U*/如果所有的系统中每种类型的宽度都是相同的,那么使用起来将非常方便,但是这

2、是理想的状态,但实际并不是这样的,现在还没有一种选择能够满足所有的计算机设计的要求,所以C+提供一种灵活的标准,它确保了最小长度:1).short至少是16位2).int至少与short一样长3).long至少32位,且至少与int一样长 2. 变量的初始化int i = 10;int j(20);cout i , j endl; / 10,203. 无符号类型short表示的范围是-32768 32767, 则无符号版本的范围是0 65535实例1: unsigned short sue = 0; sue = SHRT_MAX; cout sue = sue endl; / sue = 32

3、767 sue = USHRT_MAX; cout sue = sue endl; / sue = 65535 sue = 0 - 1; / 越界! 这些整形变量的行为就行里程表,如果超越了限制,其值将为范围另一端的取值 cout sue = sue endl; / sue = 65535实例2:( int i = INT_MAX; cout i = i endl; / 越界! 同上面unsigned short实例 i+; cout i = i endl; i = INT_MIN; cout i = i endl; / 越界! 同上面unsigned short实例 i-; cout i =

4、 i 第一位是1-9, 十进制2) 第一位是0, 八进制3) 前两位是0x, 十六进制6. char类型:char类型是专为存储字符而设计的.编程语言通过使用字母的数值编码解决这个问题,因此,char类型是另一种整型,它足够长,能够表示目标系统中所有基本符号 - 所有的字母,数字,标点符号int main() char ch = 0; cout ch; / 输入时,cin将键盘上输入的M转换为77存储在内存上 cout Your input is : ch endl; / 输出时,cout将值77转换为所显示的字符M return 0;7. wchar_t类型:1). wchar_t表示扩展字

5、符集,用于保存8位char无法表示的字符(例如:日文). wchar_t类型其实也是一种整数类型,它有足够的空间,可以表示系统使用的最大扩展字符集2). 使用wcout和wcin进行输入输出int main() wchar_t bb = LA; / 加L表示宽字符常量 wcout bb endl; / 输出bb,注意在VC中直接输出其ASCII码,在G+中正确输出 wcout Labcd endl; / VC6.0中输出为地址值,在G+中正确输出 return 0;8. 浮点数1). 表示和存储系统存储浮点数的方式:一部分表示值,一部分用于对值进行放大或缩小。例如:34.123和3412.3,

6、它们除了小数点位置不同外,其他都是一样的,可以用下面的形式表示 基准值 缩放因子34.123:0.34123 1003412.3:0.34123 10000缩放因子作用是移动小数点的位置,一般为2的幂,不是10的幂2). 浮点数的类型float: 至少32位, double: 至少64位,且不少于float, long double: 至少喝double一样多, 80、96或128位头文件:cfloat(C+)和float.h(C)中有系统设置9. 类型转换:1). 整型提升(integral promotion)C+:a).C+将bool、char、unsigned char、signed

7、char、short值转换为int。通常int类型选择为计算机最自然的类型,计算机使用这种类型时,运算速度可能最快b).unsigned short与int的转换:如果short比int短,unsigned short将被转换为int如果相同,unsigned short将被转换为unsigned int此规则确保在对unsigned short进行提升时不会损失数据c). (1) 如果有一个操作数的类型是 long double,则将另一个操作数转换为 long double。(2) 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。(3) 否则,如果有一个操作

8、数的类型是float,则将另一个操作数转换为float。(4) 否则,说明操作数都是整数,因此执行整型提升(5) 如果有一个操作数的类型是unsigned long,则将另一个操作数转换为 unsigned long。(6) 否则,如果有一个操作数的类型是long int,则另一个操作数为 unsigned int,则转换取决于两个类型的相对长度。如果long能够表示unsigned int的所有可能,则将unsigned int 转换为 long。(7) 否则,将两个操作数转换为unsigned long(8) 否则,如果有一个操作数的类型是long,则将另一个操作数转换为long(9) 否

9、则,如果有一个操作数的类型是unsigned int,则将另一个操作数转换为unsigned int(10) 如果编译器到达此处,则说明两个操作数都是int类型。C:将有符号和无符号的char和short类型都自动转换为int。在某些情况下,也会自动转换为unsigned int(例如:当short与int相同的大小,那么unsigned short比int大,在这种情况下,将把unsigned short转换为unsigned int)。参数传递时的转换:C+将对char和short类型进行整型提升。对float参数提升为double。2). 强制类型转换:a). 一般格式(typeName

10、) value:C语言中的格式,typeName (value):C+语言的格式,新格式的想法是,要让强制类型转换就像是函数调用。 这样对内置类型的强制类型转哈un就像是为用户定义的类涉及的类型转换。b). C+中的4个强制类型转换操作符.dynamic_cast 基类指针(或引用)转换成派生类指针(引用)时使用, 注意:基类对象无法赋值给派生类的对象(任何类型转换操作符都不可以).const_cast 去掉参数中的常量性(const性)和volatile性.static_cast 一般的显示类型转换时使用.reinterpret_cast可以根据目的选择一个合适的操作符,而不使用通用的类型转

11、换,指出进行类型转换的原因,并让编译器能够检查程序的行为是否与设计者想法吻合。显式转换符号的一股形式如下: cast-name( expression );.dynamic_cast:1. 与C+支持的其他强制转换不同的是dynamic_cast 是在运行时刻执行的.2. 如果指针或左值操作数不能被转换成目标类型dynamic_cast 将失败如果针对指针类型的dynamic_cast失败,则dynamic_cast 的结果是0, 如果针对引用类型的dynamic_cast 失败则dynamic_cast会抛出一个异常3. dynamic_cast 比其他C+转换操作要安全因为其他转换不会检验

12、转换是否真正能被执行.4. dynamic_cast 被用来执行从基类指针到派生类指针的安全转换它常常被称为安全的向下转换downcasting.(不使用dynamic_cast,将一个基类的指针赋值给派生类的指针将会引发编译出错,即不允许直接将基类的指针之间赋值给派生类的指针)5. 当我们必须使用派生类的特性而该特性又没有出现在基类中时,我们常常使用dynamic_cast6. 使用dynamic_cast后,必须进行判断是否转换成功,否则在测试dynamic_cast 的结果是否为0 之前就使用它是一种最常见的错误实例:void company:payroll( employee *pe

13、) programmer *pm = dynamic_cast( pe ); / 如果 pe 指向 programmer 类型的一个对象, 则 dynamic_cast 成功, 并且 pm 指向 programmer 对象的开始 if ( pm ) / 用 pm 调用 programmer:bonus() / 如果 pe 不是指向 programmmer 类型的一个对象, 则 dynamic_cast 失败, 并且 pm 的值为 0 else / 使用 employee 的成员函数 7. 因为不存在空引用,所以不可能通过比较dynamic_cast 的结果(dynamic_cast的结果引用)

14、是否为0 来检验dynamic_cast 是否成功. 如果一个引用的dynamic_cast 失败则会抛出一个bad_cast类类型的异常, 必须包含头文件.(注意:VC6.0和g+中没有这个头文件) if ( programmer *pm = dynamic_cast( pe ) )就不能被改写为 if ( programmer &pm = dynamic_cast( pe ) )实例:#include void company:payroll( employee &re ) try programmer &rm = dynamic_cast( re ); / 用 rm 调用 program

15、mer:bonus() catch ( std:bad_cast ) / 使用 employee 的成员函数 8. 对引用的dynamic_cast 不可能忽略失败的转换并在没有测试其结果前使用它而指针是有可能的,但是使用异常给程序增加了相应的运行开销,.const_cast:将转换掉表达式的常量性(以及volatile 对象的volatile性).例如:extern char *string_copy( char* );const char *pc_str;char *pc = string_copy( const_cast( pc_str );.static_cast与void*型指针a)

16、.任何非const 数据类型的指针都可以被赋值给void*型的指针.b).有时void*型的指针被称为泛型generic 指针因为它可以指向任意数据类型的指针.c).const数据类型类型的指针只能赋值给const void*型的指针.d).在C+中不存在从void*型指针到特殊类型的指针之间的自动转换把void*型的指针赋值给任意显式类型时C+要求显式强制转换. (原因一)实例: int ival = 10; void *pv; int *pi = &ival; const char *pc = a casting call; pv = pi; / ok: pv 指向 ival/ pc =

17、pv; / 错误: 没有标准的转换 / ok: 仍然是错误的, 但是现在可以通过编译! / 因为在赋值前用了显式强制转换 / 当程序失败时应该首先检查强制转换 pc = static_cast(pv); char *pstr = new char strlen( pc )+1 ; strcpy( pstr, pc ); cout pstr endl; delete pstr;执行显式强制转换的第二个原因是希望改变通常的标准转换 (原因二)double d;int i;i += d; /i提升成double型然后再把它加到d上,最后把结果截取成int型来执行赋值/通过显式地将d强制转换成int型

18、,消除了把i从int型到double型的不必要提升i += static_cast(d); 编译器隐式执行的任何类型转换都可以由static_cast 显式完成double d = 97.0;char ch = static_cast( d );为什么要这样做呢?因为从一个较大类型到一个较小类型的赋值会导致编译器产生一个警告,以提醒我们潜在的精度损失.当我们提供显式强制转换时,警告消息被关闭,强制转换告诉编译器和程序的读者我们不关心潜在的精度损失.static_cast实例:int main() int i = 0; / 为隐式类型转换 (implicit type conversion) i

19、 = 3.541 + 3; / 显式类型转换 (explicit type conversion) i = static_cast(3.541) + 3; cout i endl; return 0;.reinterpret_cast: a). reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。例如,假设你有一个函数指针数组:typedef void (*FuncPtr)(); / FuncPtr is 一个指向函数的指针,该函数没有参数返回值类型为void FuncPtr funcPtrArray10; / funcPtrArray 是一个能容纳10个FuncP

20、trs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组: int doSomething(); 你不能不经过类型转换而直接去做,因为doSomething函数对于funcPtrArray数组来说有一个错误的类型。在FuncPtrArray数组里的函数返回值是void类型,而doSomething函数返回值是int类型。 funcPtrArray0 = &doSomething; / 错误!类型不匹配 ( 强转格式: funcPtrArray0 = (void(*)()doSomething; / ) /reinterpret_cas

21、t可以让你迫使编译器以你的方法去看待它们: funcPtrArray0 = reinterpret_cast(&doSomething); / this compiles转换函数指针的代码是不可移植的(C+不保证所有的函数指针都被用一样的方法表示),在一些情况下这样的转换会产生不正确的结果,所以你应该避免转换函数指针类型,除非你处于着背水一战和尖刀架喉的危急时刻。一把锋利的刀。一把非常锋利的刀。b). 强转格式实例: (不使用reinterpret_cast) void func(void *v) / 1. 定义一个函数 int i = (int)v; void main() func(voi

22、d *)5); / 2. 调用函数 void (*pfunc)(); / 3. 定义一个函数指针 pfunc = (void (*)()func; /4. 由于func函数类型与pfunc指针格式不同,所以赋值前需要将该函数强转后,再赋值给函数指针 pfunc(); c). 其他实例:struct Data short a; short b;obj;int main() cout &obj endl; obj.a = 11; obj.b = 22; long add = 0x00476738; Data *p = reinterpret_cast(add); cout a endl; cout

23、 b endl; return 0;10. 字符串说明:1).C+对字符串长度没有限制.2).拼接字符串: C+允许拼接字符串常量,即将两个用引用括起的字符串合并为一个。注意:任何两个由空白(空格,tab键,换行符)分隔的字符串常量都将自动拼接成一个。 cout AB CD endl; / ABCD cout AB CD endl; / ABCD3).getline和get函数a). 都读取一行数据b). getline()丢弃换行符;get()将换行符保留在输入序列中c). get()函数的使用: char ch20 = ; char c20 = ; cin.get(ch,20); / 第一

24、次输入后,换行符将留在队列中 cin.get(c, 20); / 第二次调用时先看到n,所以认为结束,因此什么都没有读取改进: cin.get(ch,20).get(); / cin.get(); 读取一个字符,用来处理换行符,为下一行输入做准备 cin.get(c, 20).get(); 或 cin.get(ch,20); cin.get(); cin.get(c, 20).get(); d). getline():读取字符串,并将最后一位换行符替换为0保存。e). 建议使用get()读取一行字符串,可以进行错误检查,而getline更加简单一些。通过get()读取后,可以判断停止读取的原因

25、:(1).已经读取了整行. (2).由于数组已经填满实例:int main() char ch10 = ; char c10 = ; cin.get(ch,10); if(cin.get() = n) / 如果是正常结束,则读出的将是换行符;否则则表明是数组已满而停止输入 cout ok . endl; cin.get(c, 10); return 0;11. 头文件旧头文件 新头文件string.h cstringstdlib.h cstdlibstdio.h cstdio12. 动态内存分配/实例1:int *p = NULL;p = new (nothrow) int10;if (p =

26、 0) cout Error: memory could not be allocated;/实例2:int main() int *p = NULL; try p = new int; / 在分配失败时抛std:bad_alloc catch(bad_alloc &) cout new threw an exception endl; cout Error: memory could not be allocated; try p = new (nothrow) int; / 在分配失败时不抛异常,它返回NULL catch(bad_alloc &) cout this line shoul

27、d never appear.; return 0;中申明的关于抛异常的重载版本:namespace std class bad_alloc / . ; / new and delete void *operator new(std:size_t) throw(std:bad_alloc); void operator delete(void *) throw(); / array new and delete void *operator new(std:size_t) throw(std:bad_alloc); void operator delete(void *) throw(); / new and delete void *operator new(std:size_t, std:nothrow_t const&) throw(); void operator delete(void*, std:nothrow_t const &) throw(); / array new and delete void *operator new(std:size_t, std

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1