




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+笔记三:输出输入函数 1:std:coutx; 2:n制表符,相当于按了tab键,在vc中使后输出的数据对齐 std:cout内容t iostream cin/cout五:名字空间中变量重名问题 1:建立一个名字空间 namespace a b = 5; namespace c b = 8; int main int b = 5 std:coutba:bc:bendl; 2:名字空间中的变量重名时,如果其中有main()中的变量,那么不会出错,直接输出main()中的变量,否则就有错误。六:函数 1:通常把函数声明叫做函数原型,而把函数定义叫函数实现七:C+数据类型 1:广义上划分C+数据类型, 常量 - 变量 2:布尔型,它可表示两个逻辑值,1和0。 bool check(变量名); true = 1 false = 03:字符型它存放字符,是计算机字符集中的字符(ASCII码)0255之间,每一个数一个码 4:奇偶校验:a:奇校验规定:正确代码一个字节中1的个数必须是奇数,若非奇数,则在在最高位添1;b:偶校验规定:正确代码一个字节中1的个数必须是偶数,若非偶数,则在最高位添1; 5: 特殊字符 a铃声 (警报声) b回退f焕页 r回车tTAB键v垂直制表 单引号双引号?问号 反斜杠000八进制xhhh十六进制 6:双字节型 1:wchar_t,又叫宽字符类型,用来存储汉字,韩文,日文等占两个字节的字符 2:wchar_t wt = L汉 L告诉编译器为“汉”分配两个字节的空间 3:由于“汉”是个汉字,所以我们需要调用一个函数将语言设置为中文简体 4:setlocale(LC_ALL表示设置所有的选项,chs); #include 5:wcoutwt; 7:整型的范围 1:int (-231)(231 - 1) 2:short (-215)(215-1) 3:long (231)(231-1) 4:u int (0)(232-1) 5:u short(0)(216-1) 6:u long (0)(232-1) 7:float(1.2e-38)(3.4e38) 8:(2.2e-308)(1.8e308) 8:浮点型变量 1:float (2 * 2-126) (2 * 21238) a: 0 0 0000000 00000000 00000000 000000 符号 指数位 尾数位(23) 结论:取值范围由指数来定,所以剩余尾数23位,最多可表示2*23个有 效数字 b: 2 * 223 = 8388608个有效数字,求有效的位数,以10为底数,求次方,有效数字为67位 c:8388608,也就是23位数值的容量,它占用6到7位 2:double (2 * 2-1022)(2 * 21024) 64位 a: 0 00000000000 00000000 00000000 000000 符号 指数位(11) 尾数位(52) b:11位指数位 0 2*211-1 -1022 1024 c:有效数字个数为2 * 252个, 10进制中有效数字为1516位 9:const 之后定义的变量为常量,之后不能对它进行修改10:enum numzero, one, two, stree, four; 关键字enum将其后num声明为枚举型,zero代表1八:逻辑运算符 1:凡是用来计算值的操作都可以看作是表达式,表达式总能返回一个值 例 1;它返回了1,只是没有载体。九:面向对象程序语言的主要特征 1:抽象: a:面向对象的思想要求程序员将程序的每一个部分都看作一个抽象的对象,即程序是由一组抽象的对象组成的,更复杂点,这些对象根据他们相同的特征而又进一步组成了一个类。 b:打个比方张明是一个人,我们把它看做一个对象,李四也是一个人,我们也把他看做一个对象,还有王五、赵钱、孙李等等。他们都是一个个具体的对象,但我们可以发现他们都具备几个共有的特征,那就是能够直立行走和会使用工具。所以我们就可以把他们归纳在一起,并抽象地看做一个类人类 2:封装: a:早期的软件由于数据和程序混在一起,导致程序可读性很差,而且修改起来也很困难。许多数据都混在一块,而这些数据又被多个模块相互调用,因此某个模块再改动摸个数据的时候常常会对整个程序产生无法预料的错误 b:面向对象针对这个问题提出了数据的封装,他将每一个数据都封装在各自的类中,又设置了多种访问权限,别的类可以在允许的情况下访问该类中的数据,不允许的情况下则无法访问该数据,从而避免了非法操作和出错的可能性 3:继承: a:正如前面所说,我们在发明一个新式发动机的时候不想重新制作一辆汽车,因此继承这个概念就应运而生了,我们可以将该车定义为一个类,然后在声明一个类,将该车的所有成员都继承过来,其中自然包括发动机,然后在改造这个发动机,这样一辆新车就生产出来了。 4:多态 a:作为一名足球运动员,他们在射门以后可能会产生多种结果 b:我们把这种不同的对象(不同的足球运动员),调用相同名称的函数(射门)却可导致不同的行为或者结果的现象称为多态性 c:在这编程中经常使用,比如说你设计个拳击游戏,那么你定义的多个角色在打出去一拳的时候通常会有多种行为反馈,一拳打空,一拳打倒对方,一拳打在裁判的牙上,把牙齿打飞。十:类、对象、成员、函数1:我们上节所说的人类就是一个类,它包含很多对象,比如张三。;李四。赵钱孙李等人都可算作人类的对象。这些对象都拥有人类共同的功能和数据,比如身高、体重、年龄。性别。另外还会说话、吃饭。睡觉等 *这些功能我们可看做是人类共有的方法或者函数,而具体化人类的身高、臂长的这些数据我们可看作是人类的成员变量2:这样我们就可以进一步地了解,类是由若干个变量和相关的函数组成的。而对象则可拥有这些变量和函数。 3:形象例子:一个硬盘可执行读写操作,这是它的主要功能,又叫方法和函数,他还有型号、容量和转速等数据,我们把它叫做变量。二硬盘又有好多种品牌,如迈拓硬盘、希捷硬盘、西部数据硬盘等,我们把这些品牌看作电脑这个大类的对象。这些对象都拥有硬盘类共有的功能和数据,比如希捷硬盘有型、容量和转速等数据, 这是硬盘类的共同数据,又叫成员变量,而且希捷硬盘有读取数据和写入数据的功能,这是硬盘类的共同方法,又叫成员函数 4:每个对象都可将自己的数据进行封装,以避免别的对象修改。比如说希捷硬盘某个型号的容量是80G,这个数据只是为希捷硬盘某个型号所拥有的,迈拓硬盘厂商不可能去修改希捷硬盘的容量,因为迈拓硬盘也有自己的容量,它可能是80G,也可能是180G,这是由迈拓硬盘的生产商自己来定义。 总结: 硬盘是个类,希捷硬盘是该硬盘类的一个对象,型号、容量和转速是该类的数据成员,读取数据、写入数据是该类的方法成员,又叫成员函数;数据成员和成员函数统称为该类的成员,对象拥有并且可以封装这些成员 5:声明一个类 class Human public: void GetStature(); /声明一个函数 / 英文身高 void GetWeight(); private: int stature; int weigth; ; a:public :表示他后面的成员都是公有的,该类的对象可以直接访问这些成员 b:private:表示它后面的成员都是私有的,不能被对象直接访问,必须通过公有的成员函数才能访问 总结:声明这个类并没有为人类分配内存,他只是告诉编译器:人类是什么,它包含了那些类型的数据,功能是什么 ,并告诉编译器该类有多大, 大小 = 成员变量。 该类的方法不占用内存,因为我们没有为方法(声明的函数)声明类型,他们的返回值是void。 6:定义一个对象 a:huma Mike; 就定义了“huma”类下的一个叫“Mike”的对象 b:类只是个抽象的名词,而对象则是实际的个体,比如说人类是泛指所有的人,而迈克却是一个具体的人,是一个活生生的人而你绝对不会把迈克和丹妮混淆,因为他们数据有着本质的不同 c:Human Mike; Mike.set_weight(50); Mike.get_weight(); d:类是个抽象的名词,他不是具体的某个个体,因此我们无法对他进行赋值操作,正如无法对int类型赋值一样,因为int也代表一个类型,而不是某个具体的变量 Human.weight = 100错误 Human Tom; Tom.weight = 100;对的; f:总结函数是用来执行一定功能的代码块,成员函数则是只能被类的对象所使用的函数 7:定义函数 a:一般来说当我们定义了一个函数后,编译器就会在内存中为其创建一个指令集,当我们调用这和函数时,程序就会跳转到该指令集处,当该函数运行完毕后,程序又会返回到原来执行调用该函数的下一行继续执行。假如对该函数执行了上百次调用,那么就要来回跳转上百次,和明显这是相当影响程序执行效率的。 b:关键字“inline”,内联函数, inline int 函数名(); int 函数名() 程序语句 ; 好处:这样编译器将不会创建真正的函数,而是将这个内联函数的所有代码拷贝到调用函数中,这样程序在执行调用该函数时就不需要来回跳转,自然就提高了程序运行时的效率。 坏处:无形中增大了程序的体积 建议用于一些小的被调函数 c:const在函数上的应用,不让某个成员函数修改变量的值 例:void print() const couta = a; 8:构造函数 *使用原因:在创建某个类的对象时,由于对该对象的状态(数据)不是很明确,因此需要对其进行初始化。比如说我们要在长方形这个类中创建一个对象,或者说新建一个长方形,那么我们首先要确定它的长和宽,假如我们无法确定它的长和宽,那么我们是无法造出一个长方形来的。 我们要创建这个长方形,就必须使用这个长方形类中一个用来构造该类所有的对象的函数-构造函数,由于该函数要在创建一个新对象时使用,因此他不可能存在于对象之后,那么我们就必须在类中对它进行声明和定义。 a:定义的函数名和类名一样 class Human public: Human(char x, int y) cout正在构造一个人.endl; xb = x; age = y; void show() constcout是xb的endl; cout年龄为ageendl;private: char xb; int age; ; b:假如没有构造函数,那么系统会为我们自动创建一个构造函数,该函数什么参数也没有,而且也不执行任何功能,它的作用只是构造一个对象 就好像rectangel() c:可以有多个构造函数,同时有不带参数的和带参数的 9:析构函数 a:析构函数用于在对象被销毁后清除他所占用的内存空间,比如说他可以清除由构造函数创建的内存 b:public: A() 注意:1.析构函数跟构造函数一样不能有返回值 2.析构函数不能有参数 3.只能有一个析构函数 c:每个对象在创建时都会自动调用该类的构造函数,这里调用了我们自定义的构造函数,程序结束时,对象a的生命也自然终止,编译器会自动调用该类的默认析构函数来释放掉 该对象所占的内存,如果用户自定义了,那就执行自定义的析构函数 d:示例: Human() cout这个人已经死了. p-.get()该符号可以实现读取对象的内存地址并且访问该对象的成员的作用. 16:在构造函数中开辟内存空间 a.我们可以将类的数据成员定义为一个指针,然后在析构函数中开辟新空间,将该空间的地址赋给指针.而在析构函数中释放该内存. b.private: int * p; Human() p = new int(999) c.一个在堆中创建的对象通过成员指针在创建新的空间用来保存数据并没有什么意义.因为在堆中创建对象时已经为它的所有数据成员提供了保存空间. 17:this指针 a.对象要在属于自己的每个成员身上写下自己的名字,以证明该成员是自己的成员,而不是别的对象的成员. this变量帮助对象做到这一点,this变量记录每个对象的内存地址,然后通过间接访问运算符-访问该对象的成员. b.这说明this变量记录每个单独的对象的内存地址,而this指针则指向每个单独的对象.因此不同的对象输出的this变量的内存地址也不同. c.由于this指针保存了对象的地址,因此你可通过该指针直接读取某个对象的数据,它的作用将会在后面的重载运算符中得到演示,现在我们只需要知道 this变量保存的是对象的地址,那么this指针就是指向对象的指针.另外this指针的创建与删除由编译器来完成. d.需要注意的地方:因此在删除一个指针后,我们一定要将其赋为空.虽然使用空指针是非法的,容易使程序崩溃,但是我们宁愿程序崩溃,也不愿意调试起来困难. 由于这程序运行以后立即崩溃了,而空指针使用不当又会导致程序崩溃,因此我们立即明白是哪里出了错,从而迅速纠正它. 18:指针的各种常量 * const p; 常量指针,他自身的值是不可改变的,但是它指向的目标却是可以改变的. b.const Human * p 指向常量的指针,只是限制我们修改它指向的目标,他自身是可以被修改的. c.const Human * const p; 指向常量的常指针,都不可修改.十二:引用 1:什么是引用 a.引用拥有指针所有的功能,但是语法更加简单,本章我们就来学习引用,并且分清它与指针的区别. b. int a; int &bm_a = a; 引用运算符&. c.bm_a的地址 等于 num的地址; d.一个别名只定义一次(必须在定义引用的同时进行初始化) e.别名的地址 = 变量的地址 2.空引用 我们知道指针进行删除后,需要将它们赋为空,引用却不需要这么做,这是因为引用是原来对象的别名,假如该对象存放在栈中, 那么对象超出作用域时别名会和对象一起消失.假如该对象存放在堆中,由于堆中内存空间必须使用指针来访问,因此用不着别名, 即使在定义一个指针的别名,那么将指针删除并赋空之后,该指针的别名中的地址也相应的赋空了. 3.按别名传递 a.别名简单,易操作. b.max(int &a, int &b) 别名及自身 main max(a,b) 4.利用指针返回多值 a. int func(int a, int * b, int *c) return a 我们可以把a作为返回的判断值,把*b和*c作为运算的返回值,用该种方法我们可以实现汇报执行程序时的非法操作信息. 示例: if(a20000) main() a = 1; int a, b ,c; int check; else if( func() ) *b = a * a; a = 0; return a; 5.按值传递对象 a.按值传递在向函数传递一个对象时,会像传递变量那样建立一个该对象的拷贝,而从函数返回一个对象时,也要建立这个被返回的对象的一个拷贝。 b.只要在栈中创建临时拷贝都会自动等调用复制构造函数 c.func(A one) 会先创建一个副本, 再把副本的值赋给one d.返回对象同上. e.class Humanpublic:Human() cout执行析构函数删除该对象n;Human()cout执行构造函数创建一个对象n; Human(Human&) cout执行复制构造函数创建该对象的副本n;Human func(Human one)return one; /调用复制构造函数int main()Human a; /调用构造函数func(a); /调用复制构造函数 6.按址传递对象(解决按值传递的开销大问题) a.Human* func(Human *one)return one; /返回的地址,少了一次复制构造函数int main()Human a; func(&a); /传递地址,少了一次复制构造函数 b.由于复制构造函数没有执行,所以也不用析构函数删除复制构造函数创建的对象, 一句避免了两个函数的调用。 c.坏处:得到了该对象的内存地址,可以随时修改对象的数据,破坏了按值传递的保护机制。 7.使用cons指针来传递对象(解决指针破坏保护机制的问题) a.按址传递对象虽然可以避免调用复制构造函数和析构函数,但由于它得到了该对象的内存地址,可以随时修改对象的数据. 所以实际上是破坏了按值传递的保护机制. b.Human* func(Human *const one) /指针one不可修改 Human* func(const Human *one) /指针one指向的对象不可修改 Human* const func(Human *one) /返回的one指针不可修改 const Human *func(Human *one) /返回的指针one指向的对象也是不可修改的 c.用const指针来接收对象,这样就可以防止任何试图对该对象所进行的操作行为,并且保证返回一个不被修改的对象 d.将函数的返回值和接收参数都定义为const,就可保证函数内不可修改原始值,同时避免利用返回值对原始值进行修改. 所以加上这个const实际上是为了实现按值传递的保护机制,同时又避免按值传递的开销. e.缺点:频繁使用const,很麻烦! 8.按别名来传递对象(解决const指针代码麻烦问题) a.由于引用不能重新分配去引用另一个对象,他始终是常量,所以我们不能将它设置为常量。 b. const Human &func(const Human &one)/one.set(22);return one;int main()Human a;a.set(11);const Human &b = func(a);/b.set(33); c.引用实现了指针的功能,但操作起来方便。 9.指针与引用的选择 a.指针可以为空,但是引用不能为空,指针可以被赋值,但是引用只可以被初始化,不可以被赋为另一个对象的别名。如果你想使一个变量记录不同的对象的地址,那么就必须使用指针 b.注意在堆中创建一块内存区域,必须要用指针来指向它,否则该区域就会变成无法访问的内存空间,当然我们也可以使用引用来引用指向内存空间的指针。 int &r = *p; c.不可以直接用引用来指向堆中新建的空间,因为引用只是个别名,他不可以作为指针来使用. d. int *&r = new int; 等价于 int * r = new int; (不这样弄) e. 在机器虚拟内存太小,无法创建新空间的情况下,那么new int 就会自动返回一个空指针. 我们知道引用不能为空,因此这种情况下使用该语句: int *&r = new int; 就会导致一个无用的别名.而使用*读取一个无用的别名则会引起系统崩溃. f. e问题解决方法 int *p = new int; if(p != NULL) int &r = *p r的寿命就在这大括号内 g.总结:指针可以为空,引用不能为空. 指针可以被赋值,引用不能被赋值. 指针可以指向堆中空间,引用不可以指向堆中空间. 10.引用和指针可以一块用 a. int *func(int &x, int *y, int z) int型变量的别名one,int型变量的指针y,int型参数z。该函数返回一个指向int型变量的指针 11.使用引用应注意的问题 a.Human &func()Human a(23); 由于对象a是局部对象,因此当函数func结束后,局部对象a也就被删除了。由于对象a消失了, return a; 所以func()函数返回的其实是一个并不存在的对象的别名。 mian Human &r = func(); b.编译器会为我们提供一个默认复制构造函数。这个默认的复制构造函数实现了同样的功能,即根据一个对象创建一个新对象,然后将旧对象的成员复制给新对象。 c.对于引用而言,如果引用的是一个临时变量那么这个临时变量的生存期会不少于这个引用的生存期。 d.对于指针来说没有这个特性,假如将对象a的副本的地址赋给一个指针,那么在func函数返回对象a的副本的时候,就可以析构这个对象的副本。 e.这是因为析构函数调用并析构某个对象后,只是告诉编译器这一块内存不再为某个对象独占了,你可以访问它,别的对象或者变量也可以访问它并使用该内存区域存储他们的数据, 但是在它们使用之前。存放在该内存区域的数据并没有删除,因此使用指针来访问该区域仍然能够得到没修改的x的值。 12.引用一个按值返回的堆中对象 a.Human func() Human *p = new Human(99); 1.由于p所指向的堆中空间必须使用delete运算符才能被删除,因此该空间成了不可访问的区域,结果导致了内存泄漏。return *p; 2.p指针被删除了,它所指向的空间还存在。该空间的地址只有p保存着,而p找不到了,所以我们无法找到该空间。 由于无法找到该空间,所以无法对其进行释放,结果造成了内存泄漏。 b.副本是调用复制构造函数创建的,所以这个副本保存在栈中,而不是堆中。delete运算符删除的是堆中空间,而不是栈中空间,所以导致错误。 13.引用一个按别名返回的堆中对象 a.要避免上节出现的内存泄漏,我们就不能用按值的方式来返回一个堆中对象,而必须按地址或者别名的方式返回一个别名或者内存地址,这样就不会调用复制构造函数创建一个该对象的副本, 而是直接将该对象的别名或者地址返回。由于返回的对象的别名或者地址初始化给了main函数中的一个引用或者指针,因此即使被调用函数中的局部指针超出作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 子网掩码课件
- 年度安全教育培训
- 北京市朝阳区事业单位招聘笔试真题2024
- 培训机构加盟协议书范例模板6篇
- 年会安全培训讲话课件
- 威尼斯商人的课件
- FK-3311-Standard-生命科学试剂-MCE
- exo-α-Arabinofuranosidase-Bacillus-subtilis-168-生命科学试剂-MCE
- 妆扮课件教学课件
- eSpCas9-mRNA-生命科学试剂-MCE
- 食材配送服务方案投标方案【修订版】(技术标)
- JT-T-795-2011事故汽车修复技术规范
- (高清版)DZT 0437-2023 环境地质调查规范(1:50000)
- 汽车内饰的清洁护理
- 2024信息安全意识培训ppt课件完整版含内容
- JGT366-2012 外墙保温用锚栓
- 社区普及反假货币知识讲座
- 医院健康体检表
- 肌肉工作原理
- 冶金工业矿山建设工程预算定额
- HGT-2521-2008工业硅溶胶的内容
评论
0/150
提交评论