1、C+ Primer学习笔记前言:持之以恒地把这本书看完。 -2014.5.5-周一-第2章 变量 和基本类型2.1 基本的内置类型C+定义了一套包含算术类型(arithmetic type)和空类型(void)在内的基本类型。2.1.2 类型转换含有无符号类型的的表达式 unsigned u= 10; int i = -42; std:couti+istd:endl; /输出 -84 std:coutu+istd:endl; /输出4294967264 cout(unsigned)iendl; /输出4294967254说明:u+i表达式中,想加前首先把整数-42转换成无符号数。提示:如果表达
2、式里面既有无符号类型又有带符号类型,当带符号类型取值为负,出现异常结果。2.1.3字面值常量整数和浮点型字面值常量20-十进制024-八进制0x14-十六进制-2014年5月9号 -星期五字符和字符串字面值 a/字符字面值“Hellow World”/字符串字面值编译器在每个字符串的结尾都加上空字符“n”转义序列 两类字符不能直接使用:一类是不可打印的字符。(退格等)另一类是在C+中有特殊含义的字符(单引号,双引号,问号,反斜线) 指定字面值类型 P37 布尔值面值和指针字面值True 和false为布尔字面值 nullptr为指针字面值2.2 变量变量定义形式:类型说明+ 变量名对象:一块能
3、存储数据并具有某种类型的存储空间。注意:初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值是把当前对象的值清除,用一个新的值代替。列表初始 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 标示符(字母,数字,下划线)C+关键字(73)-P43
4、页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 = &ival;/pi 指向一个int型的数 int *ppi = π / ppi指向一个i
6、nt型的指针指向指针的引用引用本身不是一个对象,不能定义指向引用的指针;但是可以定义指向指针的引用。 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定义并初始化一个常量,改文件能被其他文件访问 extern const int bufsize = fun();/file
7、_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的引用 引用的类型必须和其所引用的类型一致。但是有两个例外。?int i = 42;const int &r1 = i; /允许将const int& 绑定到一个普通 int 对象上
8、 const int &r2 = 42; / r2 是一个常量的引用 const int &r3 = r1*2; / r3是一个常量的引用 int &r4 = r1*2; /错误,r4 是一个普通非常量的引用说明:允许为一个常量引用绑定非常量的对象,字面值,或者表达式。 double dval = 3.14; const int &ri = dval; coutriendl; /输出是 3 / ri = 5; coutdvals; /将string对象读入s,遇到空白停止 coutss1s2; /将string对象读入s,遇到空白停止 couts1s2endl; /输出s说明:输入“ Hell
9、o World ”,输出“Hello”,输出的是“Hello World”使用getline读取一整行 string line; while( getline(cin,line) coutlineendl; return 0; return 0;string 的 empty 和 size 操作string:size_type 类型在C+11新标准中,允许编译器通过auto 或者 decltype 来推断变量的类型 auto len = line.aize(); / len 的类型是 string:size_type比较 string 对象字面值和string 对象的相加 string s1=h
10、ello,s2=world; string s3 = s1 + , + s2; couts3endl;当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string: string s1=hello,s2=world; string s3 = s1 + , + s2; couts3endl; string s4 = s1 + ,; string s10 = , + s1; /这样也正确 / string s5 = Hello + ,; /两个运算对象不是string string s6 = s1 + , +world;
11、/ string s7 = hello + , + s2; /不能把字面值直接相加 string tmp = s1 + ,; / s6 = tmp + world ; / string s8 = (hello + ,)+s2; /不能把字面值直接相加注意:C+中字符串字面值并不是标准库中类型string的对象。字符串字面值和string是不同的类型。3.2.3 处理string对象的字符3.3 标准库类型vectorVector是模板而非类型,有vector生成的类型必须包含vector中元素的类型,3.3.1定义和初始化vector对象 vectorsvec; /默认初始化,svec不含任何
12、元素 vectorivec; vectorivec2(ivec); /把ivec的元素拷贝给ivec2 vectorivec3 = ivec;/把ivec的元素拷贝给ivec3列表初始化vector对象vectorarticles = a, an, the ;vectorv1 a, an, the ;/列表初始化创建指定数量的元素 vectorivec(10, -1); / 10个int类型的元素,每个元素赋值为-1 vectorsvec(10, Hi); /值初始化-可以只提供vector对象容纳的元素数量而 vectorivec(10); /10个元素,每个元素初始化为0 vectorsv
13、ec(10); /10个元素,每个都是空的字符串对象3.3.2 向vector对象中添加元素vectorv2; /空的vector对象 for (i = 0; i 100; +i) v2.push_back(i);/依次把整数值放入末尾 string word; vectortext; while (cin word) text.push_back(word);3.3.3 其他vector操作-91页表3.5 vectorv1, 2, 3, 4, 5, 6; for (auto &i : v) /对于v中的每个元素,元素i为引用 i *= i; /求元素的平方 for (auto i : v)
14、 /对于v中的每个元素 cout i ; cout endl;不能通过下标形式添加元素vectorivec; /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 使用迭代器 /由编译器决定,b和e的类型 /b表示v的第一元素,e表示v末元素的下一个位置
15、vectorv; 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; 将迭代器从一个元素移到另外一个元素 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:iterator it; /it能读写vector的
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1