c_primer笔记.pdf
《c_primer笔记.pdf》由会员分享,可在线阅读,更多相关《c_primer笔记.pdf(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、望有志与此的同学能有收获。序:为再复习一下以前的学习内容,也为了不断地提高自己,我决定把以前的学习笔记整理出来汇成一个系列,使自己形成一个知识体系。整个系列大概有7 到 8 个部分,每个部分一般有3 章的内容。笔记中有的是书中重点内容的重新再现(我用了精简而又易于理解的语言来描述),有的是我自己的理解(不一定完全正确,希望大家多多指教),有的是我作的总结。学习时只有不断地总结才会把书读薄,才会有质的提高,这是我学习过程中最深刻的体会。第 1 章快速入门写程序的一般步骤:定义数据结构保存数据、定义函数、定义变量、实现处理逻辑、实现输入输出1.1m ain函数由操作系统调用,m ain函数执行完时
2、返回一个值给操作系统,返 回 0 表示成功执行。记住:m ain函数是唯一被操作系统显示调用的函数;m ain函数返回类型必须是int型函数的4 个元素:返回类型、函数名、圆括号内的形参表、函数体return返回值的类型必须和函数返回类型相同或者可以转换成函数的返回类型1.2iostream 库:类 istream,ostream标准输入:istream类 对 象 cin标准输出:ostream类 对 象 cout。读 cin会 刷 新 c o u t,当程序正常结束时也会刷新cout标准错误:ostream类 对 象 cerr。默认情况下cerr不缓冲。标准日志:ostream类 对 象 c
3、log。默认请问下写到clog时带缓冲。命名空间:C+标准库定义的名字在命名空间std中#include指示必须单独写成一行:头文件名和#include必须在同一行输出操作符:将右操作数写到左操作数ostream对象中,返回左操作数。注 意 cout”Entertwo nubmers:是一个表达式,其返回结果是左操作数的值(即输出流cout本身),因此输出请求可以链接在一起;由操作符重载知 :从左操作数istream对象中读取数据保存到右操作数对象中,并返回左操作数iostream库定义了接受全部内置类型的输入输出操作符1.3注释:任何允许有制表符、空格或换行符的地方都允许放注释对/*与*/;
4、单行注释为/记住注释对不可以嵌套1.4C+中的块:用花括号括起来的语句序列。在任何可以用一条语句的地方都可以用块标 准 C+中,for语句头中定义的计数变量是局部的,for循环结束后这个变量不可访问,而以前版本的C+中是可访问的使 用 istream对象作为测试条件:测试的是流的状态,若流是有效的(即读入下一个输入是可能的),则测试成功;遇到文件结束符或无效输入时.,测试失败。文件结束符的键入:Windows中键入Ctrl+z,Unix/Linux/Mac 0 s 中键入Ctrl+d1.5内置类型:C+内建的数据类型,如 int,char等类类型:用 class c_name定义的类c_nam
5、e可理解为-种新的数据类型(c_name类型),可以像使用int,long,char等内置类型一样使用c_name类型来定义变量头文件的引入:标准库的头文件用 括起来,非标准库的头文件用双引号”“括起来对象相加:执行的是两个对象的成分相加,要用到操作符重载,比如operator+成员函数:也称为类方法,是由类定义的函数,只定义一次,但被视为每个对象的成员。C+中还有继承自C 的普通函数,不属于任何类点操作符”.:用于调用成员,左操作数是类类型的对象,右操作数是该类型的成员名。通过左操作数取得右操作数调用操作符():在调用函数时放在函数名后面,括住要传入的实参列表(可能为空)总结:main函数、
6、标 准 I/O对 象、命名空间、输出操作符 、注释、头文件的导入、成员函数、点操作符.、调用操作符()第 2 章变量和基本类型2.1动态类型语言:在运行时才执行类型检查,结果可以直接使用一个变量,无需事先定义,如Smalltalk,Python静态类型语言:在编译时执行类型检查,结果是程序使用某个名字前,必须告知编译器该名字的类型,如 C+基本内置类型:包括算术类型(整数、浮点数、字符、布尔值)和 void特殊类型,C+标准定义了每个算术类型的最小存储空间,但并不阻止编译器使用更大的空间void类型:没有对应值,常用于无返回值函数的返回类型整型:bool,char,wchar_t,short,
7、int,long。通 常 short为半个机器字长,int为一个机器字长,long为一个或两个机器字长(在 32位机中通常为一个机器字长)。除 bool类型外,整型可以 是 signed的(默认情况),也可以是unsigned的,unsigned int可简写成unsigned,char有三种不同的类型:普 通 char,unsigned char和 signed c h a r,但只有两种表示方式,普通 char是 signed的 还 是 unsigned的由编译器而定整型的赋值:将超过范围的值赋给unsigned类型时,编译器会将该值对unsigned的可能取值数目求模,然后取所得值(实际
8、上就是截断处理,截取低位)。因 此 把-1 赋 给 8 位的unsigned c h a r,结 果 是-1%256=255。若 赋 给 signed类型,由编译器决定实际赋的值。但大多数编译器的处理方式与unsigned类型相似。浮点型:float,double Jong double 0 通常 float32 位,double64 位,long double96 或 128位。2.2字面值常量:long型 后 加 L,单精度型后加F,扩展精度后加L,wchar_t型 前 加 L,无符号常量后加U。浮点型常可用十进制或科学记数法表示转义字符:n,v,r,a,?,w,t,b,f,也可用八进制形
9、式o o o 3 表示空字符n u ll,同样也可用十六进制形式xddd字符串字面值:为了兼容C,C+中所有的字符串常量都由编译器自动在末尾添加一个空字符宽字符串常量:在字符串前面加L字符串常量的连接:C+标准没有定义连接不同类型字符串(如字符串和宽字符串)的行为2.3C+中的两种表达式:左值是变量的地址,可以出现在赋值语句的左边或右边;右值是变量的值,只能出现在赋值的右边赋值操作符=:读取布操作数并写到左操作数中,左操作数之前的值被覆盖变量初始化的两种形式:复制初始化(用等号)、直接初始化(用圆括号)。注意初始化与赋值是两种不同的操作,初始化指创建变量并给它赋初始值,而赋值则是擦除时象的当前
10、值并用新值代替当初始化类类型对象时,复制初始化和直接初始化有差别。而对内置类型来说,它们几乎没有差别。记住直接初始化语法更灵活且效率更高内置类型变量的初始化:全局变量都初始 化 成 0,函数里的局部变量不进行自动初始化类类型变量的初始化:由构造函数来控制类对象的初始化。用户定义对象时若没有进行初始化,类会用默认构造函数来初始化。类中一般要定义默认构造函数,若类没定义默认构造函数,则定义对象时必须显示地初始化声明和定义:变量的定义要分配存储空间,而声明只是表明变量的类型和名字,并不分配存储空间。用 extern声明变量时不是定义,也不分配存储空间,它只是说明变量定义在程序的其他地方。程序中变量可
11、以声明多次,但只能定义一次。extern声明变量若进行了初始化,则可当作是定义,只 有 当 extern声明位于函数外部时;才可以含有初始化式(即 extern定义的只能是全局变量)C+中的作用域:全局作用域、局部作用域、语句作用域、类作用域、命名空间作用域。作用域可嵌套,即大作用域在其里面的小作用域内可见。记住变量从声明开始才可见。2.4const限定符:指定变量为常量,定义后就不能被修改,因此定义时必须初始化。如:const int i=l全局作用域中的非const变量默认为extern,可以在其他文件中访问;而 const变量默认是局部于文件的,要想在其他文件中访问,必须显示地指定它为e
12、xtern2.5引用:变量或对象的另一个名字,通过在变量前添加&来定义,主要用于函数的形参。引用是一种复合类型(即用其他类型定义的类型),必须关联到某一其他类型,不占内存空间。引用在定义时就必须用同类型的变量来初始化,普通引用不能用常量来初始化。如 intival=20;int&refVal=ival;不能 int&ref=40;引用初始化后,就一直指向这个对象,不可再指向其他对象const引用:是 指 向 const对象的引用。const引用是只读的,必须指向const变量,不能通过 const引用来修改其指向的变量值。注 意 非 const引用不能指向const变量。const引用可以用常
13、量来初始化。可见#const引用是指向非const对象的引用非 const引用只能绑定到与该引用同类型的对象;const引用可以绑定到不同但相关的类型的对象或绑定到右值(如常量)。原因:double dval=3.14;const int&ri=dval;编译器会把代码转换成如下形式:int temp=dval;const int&ri=temp;倘 若 ri不 是 const,那么不能达到通过ri来 修 改 dval的 目 的(修改的是temp),因 此 非 const引用不能指向不同类型的对象;而 ri是 const时,ri是只读的,不可写,因 此 const引用指向不同类型的对象时是允许
14、的,不会违背设计初衷总结:非 const引用只能绑定到该引用同类型的对象,且不能绑定到常量中,const引用可以绑定到常量中,也可以绑定到非常量中,但是不能根据引用去修改对应的值,因为const本身就是常量属性。2.6typedef名字:定义类型的同义词,并没有引入新的类型。通常用手隐藏特定类型的实现,强调使用类型的目的;简化复杂的类型定义,使其更易理解;以及允许一种类型用于多个目的。2.7 枚举类型:用 enum定义枚举类型,里面的每个枚举成员都会初始化,或者显示初始化,或者隐式初始化。如 enum Forms shape=l,sphere,cylinder,polygon;注意枚举成员是一
15、个常量,值不能改变。枚举类型对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。2.8 记住:自定义类型时末尾有一个分号类类型:用 class定义,有一个接口(类定义)和一个实现(类实现)。类定义中有数据成员和成员函数。定义变量和定义数据成员的区别:数据成员的初始化一般不放在类定义中,类定义中只指明成员的名字和类型,成员的初始化一般放在构造函数中结构类型:用 struct定义。定义的类与class相同,唯一的区别在于struct的成员默认为public,class 的成员默认为 private。2.9 分别编译:一个程序可以有多个头文件,多个源文件,C+支持分别编译。头文件:
16、头文件包含在多个源文件中,所以不应该含有变量或函数的定义。头文件中一般放类定义、值在编译时就已知的const对象、inline函数。当然,这些实体也可以在多个源文件中定义,只要每个源文件中的定义是相同的。普通变量、成员函数、普通函数等放在单独的源文件中常量表达式:编译器在编译时就能够计算出结果的表达式(如 3.14,1+2)。有 些 const对象定义在头文件中的原因:用常量表达式进行初始化的const变量,初始化式就必须为编译器可见。为了能让多个文件使用相同的常量值,const变量和它初始化式必须是每个文件都可见的,因此要定义在头文件中,如 const double pi=3.1416。有人
17、问任何变量都只能定义一次,那头文件中的const变量不是会被各源文件多次定义吗?实 际 上 const对象默认为文件局部对象,这表明每个包含头文件的源文件都有了自己的const变量,互不影响,因此在头文件中定义const变量是合法的。若 const变量不是用常量表达初始化的,则不应该放在头文件中,如 const doublesq2=squt(2,0)预处理器:如#include,#define,#ifdef.#endif,在编译之前运行头文件保护符:防止在源文件中多次包含同一头文件的内容(多重包含)最佳实践:头文件应该含有保护符,即使这些头文件不会被其他头文件包含。这样可以避免难以理解的编译错
18、误#ifndefSALESITEM_H#define SALESITEM_HII.#endif总结:内置类型(整型6 种,浮 点 型 3 种,void类型)、复合类型(引用,typedef名字,指针、数组)、臼定义类型(class,struct,enum)、常量、变量(变量定义,extern声明,变量初始化)、作用域、const引 用 和 const变量、预处理器、头文件保护符第 3 章标准库类型3.1using声明:声明命名空间中的名字定义,注意末尾要加分号using指示:指定要使用的名字空间,如 using namespace std;有一种情况必须完全使用限定的标准库名字:在头文件中。在
19、头文件中一般不包含using声明,因为这样的话包含该头文件的每个源文件都有using声明,而不论源文件是否需要这个using声明3.2标 准 库 string类型:#inciude using std:stringstring对象的初始化:si,s2(sl),s3(value),s4(n/c,)读取整行文本:用 getline(cin,string)函数,在 stringA头文件中定义string 对象的操作:empty(),size(),sn,sl+s2,sl=s2,及等size。返回值的类型:为string:size_type类 型,它 是 unsigned的,注意不要赋给int变量当进行
20、string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个 是 string类型的注意:为 了 与 C 语言兼容,字符串常量与string不是同一种类型string对象的下标操作符:sn,n是 string:sizejype类型。下标操作可用作左值字符处理函数:在 cctype(对 应 C 标准库中的ctype.h头文件)头文件中定义,可 以 对 string对 象 中 的 字 符 进 行 处 理。isalnum(c),isalpha(c),iscntrl(c),isdigit(c),isgraph(c),islower(c),isprint(c),ispunct(c),
21、isspace(c),isupper(c),isxdigit(c),tolower(c),toupper(c)3.4标 准 库 vector类型:#include using std:vector;vector不是一种数据类型,而是一个类模板,可用来定义任意多种数据类型。vector才是数据类型vector 对象定义和初始化:vector vl,v2(v I),v3(n,i),v4(n)vector 对 象 的 操 作:empty。,size。,push_back(t),vn,=,=,!=,v,=等size。返回值的类型:为 vectorvT:size_type 类型,而不是 vector:s
22、ize_type容 器 的 iterator类 型:标 准 库 为 每 一 种 标 准 容 器 定 义 了 一 种 迭 代 器 类 型。如vector:iteratoro iterator类型变量相当于一个指针,指向容器中的元素,可以对指针进行自增操作容 器 的 begin。和 end()操作:返回容器的迭代器vector迭代器的自增和解引用操作:如 vector:iterator iter;*iter=0;解引用操作用来访问容器中的元素。解引用操作返回左值注意:end()操作返回的迭代器不指向任何元素,因此不能进行自增或解引用操作iterator的比较操作:=,!=,判 断 iterator
23、是否指向同一个元素容 器 的 const_iterator类型:只能读取容器内的元素值,不能改变元素值。对 const_iterator类型解引用时得到一个指向const对象的引用。注 意 const_iterator变量相当于一个指针,它自身的值可以改变(移动指针),但不能用来改变其所指向的元素的值。如:fbr(vector:con st_iterator iter=text.begin();iter!=text.end();+iter)cout*iterendl;/*iter 是 const 弓 I用,即指向 const 对象的引用const 的 iterator 对象:如 const v
24、ector:iterator cit=nines.begin();一个 const 变量,定义时必须初始化,之后变量自身的值不可改变,但其指向的元素值可以改变,如*cit=10o因此当我们不想改变容器内元素的值时,不 能 用 const的迭代器来访问元素,而要用const_iterator迭代器来访问元素,这也是引入const_iterator类型的原因。const容器:是指容器内的元素值不可改变。因此不能从const容器返回const的迭代器,但可以返回const_ iterator迭代器vector vec(10,9);const vectorvint nines(10,9);不能改变 n
25、ines 中的元素值,因为 nines 是 const 对象,表明这块内存区域值不能改变,故区域中的元素值不能改变const vector:iterator cit=nines.begin();/error:因为*cit 是非 const 的,指向了 const的内存区域中的某个值vector:const_iterator it=nines.begin();/ok*it=10;/error:因 为*it是 const的,不能重新赋值+it;/okvector:const_iterator it2=vec.begin();/ok:vec 对象本身不是常量,但通过*让 2 访问到的对象是常量记住:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c_primer 笔记
限制150内