版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、前言:持之以恒地把这本书看完。 -2014.5.5-周一-第2章 变量 和基本类型2.1 基本的内置类型C+定义了一套包含算术类型(arithmetic type)和空类型(void)在内的基本类型。2.1.2 类型转换含有无符号类型的的表达式unsigned u= 10;int i = -42;std:cout<<i+i<<std:endl; /输出 -84std:cout<<u+i<<std:endl; /输出4294967264cout<<(unsigned)i<<endl; /输出4294967254说明:u+i表
2、达式中,想加前首先把整数-42转换成无符号数。提示:如果表达式里面既有无符号类型又有带符号类型,当带符号类型取值为负,出现异常结果。2.1.3字面值常量整数和浮点型字面值常量20-十进制024-八进制0x14-十六进制-2014年5月9号 -星期五字符和字符串字面值 a/字符字面值“Hellow World”/字符串字面值编译器在每个字符串的结尾都加上空字符“n”转义序列 两类字符不能直接使用:一类是不可打印的字符。(退格等)另一类是在C+中有特殊含义的字符(单引号,双引号,问号,反斜线) 指定字面值类型 P37 布尔值面值和指针字面值True 和false为布尔字面值 nullptr为指针字
3、面值2.2 变量变量定义形式:类型说明+ 变量名对象:一块能存储数据并具有某种类型的存储空间。注意:初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值是把当前对象的值清除,用一个新的值代替。列表初始int i3;int j(4);2.2.2. 变量的声明的定义如果声明一个变量而非定义一个变量,就在变量的前面添加一个由extern的关键字。extern int i; /声明i而没有定义i int j; /声明并定义j如果给i赋予初始值了,i也就抵消了extern 的作用。静态类型(statically typed):C+是一种静态类型的语言。其含义就是在编译阶段检查类型。2.2.3
4、 标示符(字母,数字,下划线)C+关键字(73)-P43页C+操作符替代名(11)-P43页2.2.4 名字的作用域(scope)嵌套的作用域-彼此包含,被包含的叫内层作用域,包含的叫外层作用域2.3 复合类型2.3.1 引用(reference)-为对象提个别名int val = 1024;int &ref = val; /ref为val的引用 int &ref; /错误引用必须被初始化说明:引用并非对象,相反的,它只是一个已经存在对象所起的另外一个别名。因为引用不是一个对象,不能定义引用的引用。引用的定义 -引用的类型要与绑定的对象严格匹配。2.3.2 指针说明:指针本身就
5、是一个对象,允许对指针赋值和拷贝。获取对象的地址-取地址运算符(&)引用不是对象,没有实际地址,所以不能定义指向引用的指针。利用指针访问对象-解引用(*)空指针-不指向任何一个对象说明: 可以把0直接赋值给一个指针变量,但是不能把一个变量值为0的值赋给指针变量。int zero = 0;int *p = zero; /错误赋值和指针Void* 指针 -是一种特殊的指针类型,可以用于存放任意对象的地址。2.3.3 理解复合类型的声明定义多个变量int i=1024,*p = &i,&r = i;指向指针的指针int ival = 1024;int *pi = &i
6、val;/pi 指向一个int型的数 int *ppi = π /ppi指向一个int型的指针指向指针的引用引用本身不是一个对象,不能定义指向引用的指针;但是可以定义指向指针的引用。int i = 42; int *p ; int *&r = p; /r为一个对指针p的引用 r = &i;/r赋值为i的地址,也就是另p指向i *r = 0; / 解引用r得到i的值2.4 const 限定符初始化和constint i = 42;const int ci = i;/ci的常量特征在执行改变ci的操作时才会发生作用。int j = ci ;/file.cc定义并初始化
7、一个常量,改文件能被其他文件访问 extern const int bufsize = fun();/file_1.h文件 extern const int bufsize ;如果想在多个文件之间共享const对象,必须在变量定义之前添加entern关键字。2.4.1 const 的引用-常量的引用const int ci = 1024;const int &r1 = ci;r1 = 42 ; /错误,r1 为常量 int &r2 = ci; /错误,ci为 常量,试图用一个非常量引用指向一个常量引用初始化和对const的引用 引用的类型必须和其所引用的类型一致。但是有两个例外
8、。?int i = 42;const int &r1 = i; /允许将const int& 绑定到一个普通 int 对象上 const int &r2 = 42; / r2 是一个常量的引用 const int &r3 = r1*2; / r3是一个常量的引用 int &r4 = r1*2; /错误,r4 是一个普通非常量的引用说明:允许为一个常量引用绑定非常量的对象,字面值,或者表达式。double dval = 3.14;const int &ri = dval;cout<<ri<<endl; /输出是 3 /ri
9、= 5;cout<<dval<<endl; /输出 3.14说明:ri引用了一个整形的数,对ri的操作应该是整形操作运算,单是dval却是双精度浮点数。中间生成临时变量3,就是对3的常量引用。当通过这个引用改变dval的值时就无法改变,这种引用非法。2.4.2 指针和const指向常量的指针-不能更改其所指的对象const double pi = 3.14; / pi 为一个常量 /double *ptr = π /错误,ptr 为 一个普通的指针 (所谓类型一致)const double *cptr = π /cptr 可以指向一个双精度的
10、常量 的指针/*cptr = 42; /错误,不能给 *cptr 赋值说明:指针的类型必须和所指的类型一致。有两个特列,一种特列情况是:允许另一个指向常量的指针指向一个非常量的对象。double dval = 3.14;cptr = &dval;另一种:指向常量的指针也没有也没有规定其所指的对象必须是一个常量。Const指针常量指针必须初始化,一但初始化,它里面存放指针的地址就不会改变,一直指向一个对象。int Num = 0;int *const p = &Num; / p 一直指向 Num (顶层const)cosnt double pi = 3.14;const doub
11、le *const pip = π / pip 是一个指向常量对象的常量指针说明:指针本身是不是常量并不意味着不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的值。2.4.3 顶层const(需要看P59页)顶层const(top-level const):指针本身是个常量。底层const(low-level const):指针所指的对象是一个常量int i = 0;int *const p1 = &i;/不能更改p1的值,p1一直指向i(顶层cosnt) cosnt int ci = 42;/不能更改ci,(顶层cosnt) const int *p2 =
12、&ci;/允许改变p2的指向,(底层const) const int *const p3 = p2;/ 靠右的为(顶层const),靠左的为(底层cosnt) const int &r = ci;/用于声明引用的都是底层const当指向拷贝操作,顶层不受影响 底层受到限制2.4.4 constexpr 和 常量表达式常量表达式:在编译过程中就能的计算结果的表达式(字面值,cosnt);Constexpr-C11规定,允许将变量声明为cosntexpr类型以便由编译器来验证变量的值是不是一个表达式。注意:声明为cosntexpr的变量一定是个常量,必须使用常量表达式初始化。con
13、stexpr int f = 20; /20 是常量表达式 constexpr int limit = mf + 1; /mf+1是常量表达式 constexpr int sz = size(); /只有当size是一个consexpr函数时才是一个正确的声明语句指针和constexpr-在constexpr声明中如果定义一个指针,限定符constexpr仅仅对指针有效,与指针所指的对象无关:const int *p = nullptr;constexpr int *q = nullptr;说明:p是一个指向常量的指针,而q是一个常量指针,其中关键在与constexpr把它定义的对象设置为顶层
14、cosnt.与其他常量指针类似,constxepr 指针既可以指向常量也可以指向一个非常量。2.5 处理类型别名两种方法;传统方法:typedeftypedef double wages;typedef wages base,*p;新标准:使用别名声明(alias declaration)using Si = Sqles_item; 指针.常量和类型别名(这里需要多看,才能理解)如果某个类型别名指代的是复合类型或者常量,那么把它用到声明语句就会产生意想不到的结果。typedef char *pstring ;const pstring cstr = 0;const pstring *ps;说明
15、:两条声明语句的基本类型都是const pstring,const 是对给定类型的修饰。Pstring实际上是指向char 的指针,因此,const pstring 就是指向char的常量指针,而非指向常量字符的指针。const char *cstr = 0; /是对 const pstring cstr 的错误理解强调:这种理解错误。声明语句中用到pstring时,其基本数据类型是指针。可是用char*重写了声明语句后,数据类型就成了char,*成了声明符的一部分。这样改写的结果是,const char成了基本数据类型。前后两种结果截然不同,前者生命了一个指向char的常量指针,改写后的形式
16、则声明了一个指向const char的指针。int i =0;int * const p1 = &i;/这是常量指针,常量指针必须本初始化,始终指向一个对象的地址,(有点像引用) 针 来修改变量的值 const int j = 0;const int *const p2 = &i;/指向常量对象的常量指针可以指向普通变量,但也必须初始化 const int *const p3 = &j; /p3是一个指向常量对象的常量指针,只要是常量指针必须被初始化 /可以通过常量指针修改变量的值,但是不可以令常量指针再指向其他对象 /p2 = &j; /这样就是错误的 con
17、st int *p4;/指针常量,可以不必初始化 ,可以指向多个对象 p4 = &i;p4 = &j;/*p4 = 5; /这就是错误的,不能通过指/const text p5 = 0; /错误 , 如果只是简单的认为 把 text 替换成 int *,那就打错特错了, const int *p5 ; /正确 ,如果只是简单的认为 const text *ps; / ps 是一个指针,它的对象是指向 int 的常量指针 /int * cosnt *ps;typedef char *pstring ;const pstring cstr = 0; / cstr 是指向char 的
18、常量指针 const pstring *ps; / ps 是一个指针 ,它的对象是指向 char 的常量指针2.5.2 auto 类型说明符C+11 新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式的所属的类型;auto让编译器通过初始值来推断变量类型。显然,auto定义的变量必须初始值。auto item = val1+val2; /item 定义的变量必须有初始值复合类型 常量 和autoAuto一般会忽略顶层const,同时底层const则会保留下来。例如:const int ci = i,&cr = ci;auto b = ci;/ b 是一个整数 ( ci的
19、顶层const特性被忽略掉了) auto c = cr;/ c 是个整数 (cr是ci的别名,ci本身是一个顶层const) auto d = &i;/ d 是一个整数的指针 (整数的地址就是指向整数的指针) auto e =&ci;/ e 是一个指向整数常量的指针(对常量对象取地址是一种底层const)如果希望推断出的auto类型是一个顶层const,需要指明: Const auto f = ci;还可以设置引用类型为auto,auto &g = ci;auto &h = 42;cosnt auto &j = 42;2.5.3 decltype类型指示
20、符C+11新标准引入了第二中类型说明符decltype,它的作用是选择并返回操作数的数据类型。在此过程中,编译器分析表达式并的它的类型,却不实际计算表达式的值。decltype (f() sunm = x; / sum 的类型就是函数 f 的返回类型decltype 处理顶层cosnt 和引用的方式与auto有些方式不同。const int ci = 0,&ci = ci;decltype(ci) x =0; / x 的类型是cosnt int decltype(cj) y =x; / y 的类型cosnt int&,y 绑定到变量x decltype(cj) z; / 错误:
21、z是一个引用,必须初始化decltype 和 引用-(这里看不懂)-P63页2.6 自定义的数据结构 第3章 字符串,向量,和数组3.1 命名空间的using声明3.2 标准库类型string3.2.1 定义和初始化string 对象string s1; /默认初始化,s1 是一个空的字符串 string s2 = s1; / s2 是 s1 的一个副本 string s3 = "hiya" / s3 是该字符串字面值的副本 string s4(10,'c') /s4 的内容是10个c直接初始化-不使用=拷贝初始化-使用=string s5 ="h
22、iya" /拷贝初始化 string s6("hiya"); /直接初始化 string s7(10,'c'); /直接初始化,string s8 = string(10,'b'); /创建一个临时对象进行拷贝3.2.2 string对象的操作string s; /空字符串, cin>>s; /将string对象读入s,遇到空白停止 cout<<s<<endl; /输出s说明:输入“ Hello World ”,输出是“Hello”,输出没有空格。即就是输入开始的空格不计,再遇到空格结束。stri
23、ng s1,s2; /空字符串, cin>>s1>>s2; /将string对象读入s,遇到空白停止 cout<<s1<<s2<<endl; /输出s说明:输入“ Hello World ”,输出“Hello”,输出的是“Hello World”使用getline读取一整行string line;while( getline(cin,line)cout<<line<<endl;return 0;return 0;string 的 empty 和 size 操作string:size_type 类型在C+11新标
24、准中,允许编译器通过auto 或者 decltype 来推断变量的类型auto len = line.aize(); / len 的类型是 string:size_type比较 string 对象字面值和string 对象的相加string s1="hello",s2="world"string s3 = s1 + "," + s2;cout<<s3<<endl;当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string:string
25、 s1="hello",s2="world"string s3 = s1 + "," + s2;cout<<s3<<endl;string s4 = s1 + ','string s10 = "," + s1; /这样也正确 /string s5 = "Hello" + "," /两个运算对象不是string string s6 = s1 + "," +"world" /string s7 = &
26、quot;hello" + "," + s2; /不能把字面值直接相加 string tmp = s1 + "," / s6 = tmp + "world" ; /string s8 = ("hello" + ",")+s2; /不能把字面值直接相加注意:C+中字符串字面值并不是标准库中类型string的对象。字符串字面值和string是不同的类型。3.2.3 处理string对象的字符3.3 标准库类型vectorVector是模板而非类型,有vector生成的类型必须包含vecto
27、r中元素的类型,3.3.1定义和初始化vector对象vector<string>svec; /默认初始化,svec不含任何元素vector<int>ivec;vector<int>ivec2(ivec); /把ivec的元素拷贝给ivec2vector<int>ivec3 = ivec;/把ivec的元素拷贝给ivec3列表初始化vector对象vector<string>articles = "a", "an", "the" ;vector<string>v1
28、 "a", "an", "the" ;/列表初始化创建指定数量的元素vector<int>ivec(10, -1); / 10个int类型的元素,每个元素赋值为-1vector<string>svec(10, "Hi"); /值初始化-可以只提供vector对象容纳的元素数量而vector<int>ivec(10); /10个元素,每个元素初始化为0vector<string>svec(10); /10个元素,每个都是空的字符串对象3.3.2 向vector对象中添加
29、元素vector<int>v2; /空的vector对象for (i = 0; i < 100; +i)v2.push_back(i);/依次把整数值放入末尾string word;vector<string>text;while (cin >> word)text.push_back(word);3.3.3 其他vector操作-91页表3.5vector<int>v1, 2, 3, 4, 5, 6;for (auto &i : v) /对于v中的每个元素,元素i为引用i *= i; /求元素的平方for (auto i : v)
30、 /对于v中的每个元素cout << i << " "cout << endl;不能通过下标形式添加元素vector<int>ivec;/for(decltype(ivec.size() ix = 0; ix != 10; +ix)/ivecix = ix; /可以通过编译,但是不能运行for (decltype(ivec.size() ix = 0; ix != 10; +ix)ivec.push_back(ix);注意:vector对象的下标运算符可用于访问已存在的元素,而不能用于添加元素3.4 迭代器介绍3.4.1 使用
31、迭代器/由编译器决定,b和e的类型/b表示v的第一元素,e表示v末元素的下一个位置vector<string >v;auto b = v.begin(), e = v.end();注意:如果容器为空,则begin和end返回的是同一容器,都是尾后迭代器迭代器运算符string s("some string");if (s.begin() != s.end() /确保s非空auto it = s.begin();/it表示s的第一个字符*it = toupper(*it);/将当前字符改成大写形式cout << *it;将迭代器从一个元素移到另外一个元
32、素string s("some string");for (auto i = s.begin(); i != s.end(); +i)*i = toupper(*i);/当前字符改成大写形式cout << s << endl;再加上条件!isspace(*i)就会只是第一个单词变成大写形式迭代器的类型-实际上使用iterator和const_iterator来表示迭代器的类型:vector<int>:iterator it; /it能读写vector<int>的元素string:iterator it2; / it2能读写string对象中的元素vector<int>:const_iterator it13; / it3只能读元素,不能写元素string:const_iterator it4; / it4 只能读字符,不能写字符说明:const_iterator和常量指针差不多,能读取但是不能修改它的指向的元素值。Begin 和 end 运算符Begin和end的返回的具体类型有对象是否是常量决定,如果对象是常量,begin和end返回的是const_iterator: vector<int>v;const vector<int>cv;auto it1 = v.begin(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢结构施工现场防火措施方案
- 2026及未来5年中国生丝行业市场全景调查及竞争战略分析报告
- 2026年航空行业市场扩张报告
- 致敬她力量:共庆三八妇女节主题活动
- 信用|城投风险再探讨
- 未来五年新形势下散打拳套行业顺势崛起战略制定与实施分析研究报告
- 未来五年国内道路货物运输市场需求变化趋势与商业创新机遇分析研究报告
- 未来五年新形势下内燃机等原动机批发行业顺势崛起战略制定与实施分析研究报告
- 未来五年电视剧摄制服务市场需求变化趋势与商业创新机遇分析研究报告
- 未来五年新形势下水杨醇行业顺势崛起战略制定与实施分析研究报告
- 林业有害生物知识培训
- 2025-2026学年大象版(新教材)小学科学二年级下册教学计划及进度表
- 《肛肠外科常见病诊疗临床实践指南(2025版)》
- 信息系统替换方案
- 《学做“快乐鸟”》-2025-2026学年统编版(新教材)小学道德与法治二年级下册
- 2026年及未来5年市场数据中国在线餐饮外卖行业发展监测及发展趋势预测报告
- 奶茶店垃圾制度规范
- 智能船舶科普讲解
- GB 4053.2-2025固定式金属梯及平台安全要求第2部分:斜梯
- 2026年春冀人版(新教材)小学科学三年级下册(全册)教学设计(附教材目录P142)
- 苏科版(2024)七年级上册数学期末考试全真模拟测试卷1(含答案)
评论
0/150
提交评论