C++我的笔记参考模板_第1页
C++我的笔记参考模板_第2页
C++我的笔记参考模板_第3页
C++我的笔记参考模板_第4页
C++我的笔记参考模板_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1, 内联函数,关键字inline,内联函数的实现有两种方法,一种是把函数的申明和定义写在一起,另一种方法是在类里用关键字inline声明函数,然后在类外定义内联函数,内联函数和普通函数的区别是内联函数只是把函数体复制到调用该函数的地方,而普通函数则是在调用函数时跳转到该函数执行,内联函数的好处就是减少运行时间,但是会增加程序体积,所以要求函数体积尽量小且调用次数多才划算。2, 域属符号,“:”void A:print();/A为类,3, 函数声明和定义的区别,声明指示告诉编译器有这个符号,不会占用内存,定义则相当于函数的实现,在内存中是要占位置的。4, 头文件和源文件,可以把类的声明和定义放

2、在一个头文件中而把执行放在c+文件中,5, const函数,对于不想改变对象的成员变量的成员函数,在函数体前面可以用const修饰,这样做可以方便用于查错,就是对于这个函数本来不打算修改私有数据的值的时候就可以用const修饰。6, 构造函数,构造函数就是函数名和类名一样的函数,构造函数都是内联函数,在创建对象的时候,可以直接调用构造函数来创建对象,例子rectangle a(3, 4);就是在创建对象的时候对其进行初始化。构造函数是没有返回值的。一个类中可以有多个构造函数,区别就是参数的不同,参数个数不同或者参数的类型不同。7, 默认构造函数,该函数没有参数,而且不执行任何代码,没有任何功能

3、A(),只是用于创建一个对象。当我们创建一个构造函数时候就可以覆盖默认构造函数。每个对象在创建时候都要调用构造函数来自己初始化,假如你没有提供一个构造函数,那么编译器就会自动建立一个默认构造函数,假如你创建了一个构造函数,不管你创建的是默认构造函数还是带参的构造函数,编译器都不会再为你提供任何默认构造函数,假如你还需要一个不带参的构造函数,你就必须自己写,否则当你在调用没有参数的构造函数的时候就会出错。8, 析构函数,销毁一个对象,释放对象的内存,析构函数没有参数和返回值,而且只能有一个析构函数,9, 对象数组,A a2,10, this指针,this指针保存的是该对象的地址,默认情况下,th

4、is指针式省略不写的,就是说在成员函数中调用数据的时候都是省略了this指针的,11, 常量指针,int *const p = &a;常量指针必须初始化。常量指针是可以改变指针指向的内容,但是不能改变指针的值,这里需要注意的是指针的相关知识,就是指针的类型和指针指向的内容的类型以及指针的值和指针所指向的内容的值。12, 堆中的对象,堆中的指针式通过new来创建的,所以堆中的对象是通过指针来进行访问的,13, 引用,引用就是别名,相当于大名和小名,int num;int &mun = num;&,这是引用运算符,不是取值运算符,取值运算符可以用在任何时候,引用运算符则不能

5、,还有一个方法区别&是取值运算符还是引用运算符的方法就是看其是左值还是右值。引用一定要记得初始化。还有引用是常量,只能初始化不能赋值。int &mun; mun = num;是错的,这是赋值而没有初始化。引用的应用主要还可以用在函数传参,在函数定义的时候,若是参数是&,则表示的是这个参数是别名参数,就就可以想用指针指针一样进行相关的操作,而不用那么的麻烦。这才是引用最好的作用吧,1 / 21引用的地址,引用的地址和被引用的变量的地址是一样的,无论改变哪一个都是对变量进行修改。引用一旦使用就相当于是指针常量,只会指向引用的变量,后续的操作都相当于是赋值操作,也就是改变引用

6、的变量的值,就和常量指针的概念一致了。14, 引用对象,Human Mike;Human &rMike;引用不能使用于类,其实很简单,就是类是没有实际的内存地址的,就相当于int类型一样,15, 空引用,引用不用像指针那样对内存进行相应的操作。16, 按值传递,其实就是函数传参是传递的是数值而不是地址。实质是传参的过程中,编译器为为传递的参数创建副本,就是说创建了新的数据。17, 按址传递,就是函数传参的时候传递的指针。18, 按别名传递,就是函数在传参的时候的简便方式,简单的说就是,在函数定义的时候,参数是&a,在函数传参的时候,这个符号是别名符号而不是取地址符号。19, 利

7、用指针返回多值,当传递的实参改变的时候实质上就相当于返回了函数的值,所以想要返回多个值就可以对参数进行改变,这里就可以用传递指针和传递引用。这也是引用传参的用处。当然还有其他方法。但是这种方法可以就是进行多种运算,例如一个函数需要运算一个圆形的面积和周长等。就可以用一个函数来实现了。20, 利用引用来返回多值,这种方法和用指针来返回多值是一样的,而且这种方法更简单。还是有一点需要注意的就是当函数定义的时候,当参数是&形式的时候,这是别名的符号,这点切记,而且在函数定义的时候是不会出现取地址符号的,所以当函数定义的时候有&符号的时候就一定传递的别名参数。21, 按值传递对象,我们

8、知道传递值的时候,是要对该值进行拷贝的(副本),这样的话当值很大(比如对象很大),这种开销就很大,对象就是一个变量,这点是可以理解的,还有就是对象在拷贝的时候,该对象的构造函数和析构函数都会被执行,这样系统的开销就很大。返回对象的时候,相应的开销也是一样的。这里还有一个复制构造函数的概念,22, 按地址传递对象,A a;func(&a);只有在返回一个对象的地址的时候才不会进行复制,但是这种方法可以对该对象进行修改了,这就破坏了数据的安全性了。23, 使用const指针来传递对象,const A* const func(const *const one),这个函数的定义可以很好的看出函

9、数返回值的常量的定义。对于这个函数,用于接收这个函数的返回值的指针也是需要一个常量指针。常量指针指示说明了不能通过这个指针来改变指向对象的值,但是原始对象是可以通过原始对象对其进行修改。24, 按别名来传递对象,A& func(A &one); A &b = func(a);,25, 指针的别名,26, 引用的常用错误,当引用的对象不存在的时候,27, 析构函数和delete运算符,记得当在函数中调用了new函数的时候一定要调用delete,delete运算符会自动调用析构函数来销毁相应的内存空间。28, 默认析构函数,A(),29, 调用构造函数进行类型转换,我们可以

10、把数字当做对象赋给另一个对象(z=1000,隐式转换),等价于a=A(1000),明示转换,强制类型转换,把1000转换为int型,这样在对该复制表达是进行计算式,首先要对数字进行类型转换,同时判断该类的构造函数的参数是否与数字的类型匹配,假如匹配则调用构造函数创建一个临时对象 ,最后调用析构函数删除临时对象。取消类型转换的函数,在前面加上explicit关键字就可以让其不能强制转换30, 函数重载,函数名相同参数不同。参数不用是指函数个数不同和参数的类型不同,31, 成员函数重载,32, 函数的缺省参数(默认参数函数),void func(int n =0, int m =0),也可以写为v

11、oid funx(int = 0, int = 0);当在调用函数的时候若没有传递值(func();),则用默认的值,若传递了参数则用传递的值。主要就是用在类中的设置函数,这种方式和函数的重载有一定相似的地方。33, 重载函数和缺省参数函数的区别,重载函数使用方便,易于理解,默认参数的函数如果不加标注的话很容易被忽略,而且容易被有参数的同名函数覆盖;具有默认参数的函数重载的是参数的数值,而重载函数重载的是参数的类型。34, 构造函数的重载,35, 成员变量的初始化,在构造函数中初始化,还有一种就是在构造函数的函数头进行初始化:例子,rectangle():length(3),width(4).

12、, 36, rectangle(int i, int j):length(i),width(j).,这两种方法的区别就是如果成员变量被const修饰的话,则第一种会出错,实质上是第一种方式是对变量的赋值,二第二种方式则是对变量的初始化,所以如果有成员变量是常量(const)或者引用的话,必须用第二种方式。当成员变量有父类对象时,可以直接调用父类的构造函数,实现方法就和对本类的成员变量初始化一样,rectangle():father(23),length(3),width(4)., 34,成员变量的初始化和构造函数的调用,当成员变量是对象的时候,这调用构造的顺序是按成员变量的顺序来的,而不是按照

13、如上图所示,析构函数则相反,35,复制构造函数,A(),A( const A &one)this->n=one.n,this指针可以省略,每一个类都有一个默认的复制构造函数。上面的程序不是浅拷贝,代码应该是上面程序的delete会出现问题,delete会调用析构函数,则会删除x的内存,则在main函数返回的时候,又会再次调用析构函数,但是这时候X指针所指的内存已经删除了,则程序就会崩溃。这种方式就是浅拷贝,这种拷贝的话,若是成员变量中有指针的话,则很容易出现问题,下面则是另一种方式。1, 继承和派生,继承是指子类和父类相同的成员变量,派生是指子类从父类那继承过程中具有新的特性的过

14、程就叫做派生。继承的方式有单一继承和多重继承。 Class 儿子:public 父亲2,3, 单一继承,例子(实际上变量是不能是汉字的,下面只是一种范例)class 父亲private:int 父亲身高,父亲体重:public:void 设置父亲身高(int 父亲的身高)父亲身高=父亲的身高;void 设置父亲体重(int 父亲的体重)父亲体重=父亲的体重;void 输出父亲身高体重().;class 儿子 :public 父亲private:int 儿子肩宽,儿子臂长:public:void 设置儿子肩宽(int 儿子的肩宽)儿子肩宽=儿子的肩宽;void 设置儿子臂长(int 儿子的臂长)

15、父亲臂长=父亲的臂长;void 输出儿子肩宽臂长()cout<<"肩宽="<<儿子肩宽<<.int main()儿子 李明;李明.设置父亲身高(180);李明.设置父亲体重(80);李明.设置儿子臂长(134);李明.设置儿子肩宽(100);李明.输出父亲身高体重();李明.输出儿子臂长肩宽();return 0;1,保护型成员,对于一般类来说是不能访问的,但是对于子类是可以访问的,这是protect关键会有的原因,就是为了给子类用的。2,公有派生,class 儿子 :public 父亲/公有派生的公有成员例程如下:/*#include

16、<iostream>using namespace std;class fatherpublic:void room()cout<<"父亲的大房子我可以享受n"class son:public father;int main()son a;a.room();return 0;*/公有派生的保护权限例程如下:/*#include <iostream>using namespace std;class fatherprotected: void room()cout<<"父亲的大房子我可以享受n"class s

17、on:public fatherpublic: void enjoy()room();int main() son a; a.enjoy(); return 0;*/公有派生的私有成员例程如下:/*#include <iostream>using namespace std;class fatherprivate:void secret()cout<<"父亲的秘密n"class son:public fatherpublic:void enjoy()secret ();int main()son a;a.enjoy();return 0;*/2私有派

18、生,基类的所有东西都是private类型,所以需要间接的方式访问#include <iostream>using namespace std;class fatherpublic: void room()cout<<"父亲的大房子我可以享受n"class son:private fatherpublic:void enjoy()room();int main() son a; a.enjoy(); return 0;1, 多重继承,class son:public father,public mother,class son:public fathe

19、r,private mother2, 继承的构造和析构函数,构造函数的调用顺序是按照继承时给定的顺序,从左到右,西沟函数则是相反。3, 想基类构造函数传递参数,一种是直接在构造函数体重实现变量(继承致父类的变量和子类本身的变量,成员变量可以是基本的数据类型,也是可以是类创建的对象)的赋值,但这种方法有缺陷,会调用父类的构造函数,却没有进行有效的工作,增加系统开销;另一种就是调用父类的构造函数,在父类的构造函数中对父类的成员变量进行赋值,也许这就是构造函数有多个的用处吧,后一种方法也使代码的可读性大大增强。4, 多继承容易产生两义性,是指可能调用的函数不清楚是从哪个父类继承来的,解决的方法是用c

20、.A:hello(),加上域属关键字就可以了,作用域操所符。5, 继承中的重载,当我们在子类中定义一个与基类同名函数时,那么等于是告诉编译器,用子类的函数覆盖掉基类的同名函数,同时将他的重载函数隐藏起来。6, 指向对象的指针,const修饰的对象只能调用const函数。father *p = new son;,一个子类的对象可以赋值给父类指针(多态性),这样就建立了子类和父类的联系,还有需要注意的是这个指针在调用函数的时候的问题,这个指针只能调用父类所占内存所在大小内存中的成员函数,这是由于指针的性质决定的,可以用内存的思想来考虑下。7, 虚函数,virtual void run()const

21、cout<<”父亲可以跑万米n”;,就是说在函数的前面加上virtual 关键字。father *p = new son;对于这种形式,因为在函数run()前面加virtual,表示该函数是有多种形态的,即该函数可能被多个对象所拥有,而且功能不一,换句换说多个对象在调用同一名字的函数时产生效果也不一样。那么系统在执行有关键字virtue的函数时候就会自动判断是哪个对象调用了它,然后调用该对象的同名函数。8, 虚函数的用处,对于不同的拳击选手都会有beat功能,但是每个拳击选手的beat功能确是不同的,一个函数被声明为虚函数,则在派生类中覆盖了该函数,那么该函数也是个虚函数,当然你也

22、可以加上virtue关键字,换句话说就是只要一个函数定义为虚函数,那么它派生后就只能是虚函数了。下面是例子。#include <iostream> using namespace std; class poser public: virtual void beat()constcout<<"一般选手一拳的力量为260磅n" protected: int age;class Ali:public poser public: void beat()constcout<<"阿里一拳的力量为420磅n"class Lewis:

23、public poser public: void beat()constcout<<"刘易斯一拳的力量为480磅n"class Tyson:public poser public: void beat()constcout<<"泰森一拳的力量为500磅n" ;class holy:public poser public: void beat()constcout<<"霍利菲尔德一拳的力量为350磅n"void main() poser *a5; poser *p; int choice,i; for(i=0;i<5;i+) cout<<"(1)阿里(2)刘易斯(3)泰森(4)霍利菲尔德:" cin>>choice; switch(choice) case 1:p=new Ali; /选择1时,新建Ali对象,并用指针p来指向它 break; /跳出switch语句 case 2:p=new Le

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论