C++知识点总结_第1页
C++知识点总结_第2页
C++知识点总结_第3页
C++知识点总结_第4页
C++知识点总结_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、类和对象初步1. 类的定义在定义外成员函数的实现2. 类的成员函数之间可以相互调用,类的成员函数也可以重载,也可设默认参数值3. 一般来讲,一个对象占用的内存空间的大小等于其成员变量的体积之和。每个对象都有自己的存储空间(成员变量),但成员函数只有一份对象名.成员名 指针-成员名 引用名.成员名4. private : 一个类的私有成员,只能在该类的成员函数中才能访问public: proteced:5. Class默认 private struct 默认 public6. 内联成员函数:成员函数名前加inline或函数体写在类定义内部的成员函数。执行更快,但会带来额外的内存开销构造函数1.

2、构造函数全局变量在堆上,系统自动初始化为零。局部变量在栈上,初始值是随机的,需要初始 化。2. 构造函数:对对象进行初始化。构造函数执行时对象的内存空间已经分配,构造函数的作用是初 始化这片空间。可重载,不写的话有默认构造函数,但是如果编写了构造函数,那默认构造函数不 会再执行。是一类特殊的成员函数。不写返回值类型,函数名为类名。3. 对象在生成时一定会调用某个构造函数,一旦生成,不再执行构造函数。4. P183 Ctest *pArray3=new Ctest(4),new Ctest(1,2)5. 复制构造函数:其是构造函数的一种,只有一个参数,为本类的引用,防止混淆,构造函数不能以本类的

3、对象作为唯一的参数。默认复制构造函数。6. 复制构造函数被调用的三种情形:1用一个对象去初始化另一个对象时Complex C1(C2) ComplexC2=C1; 2函数的参数是类A的对象。形参未必等于实参函数中用对象的引用不会调用复制构造函数void Function(const Complex & c)3函数的返回值是类 A的对象7. 类型转换构造函数:除复制构造函数外,只有一个参数的构造函数C=68. 析构函数:在对象消亡时调用,可以定义其做善后工作。是一类特殊的成员函数,一个类有且只 有一个构造函数。默认析构函数9. 注意:函数的参数对象以及作为函数返回值的对象,在消亡时也会调用析构函

4、数10. 构造函数析构函数变量的生存期:全局变量在main函数开始执行前初始化。函数调用结束后静态局部对象不消亡。main函数结束时,静态局部对象先消亡,全局对象再消亡11. 静态成员变量和静态成员函数:实质是全局变量和全局函数,被所有的同类共享。生成在对象生成之前。计算体积时不会将静态成员变量算入其中老师的coeblocks C0 13 静态成员变量必须在类定义外进行声明,声明的同时也可初始化。因为静态成员函数内部不作用于某个对象,所以 不能访问非静态成员12. 常量对象和常量成员函数:常量对象一旦初始化后,值再也不能改变。常量对象和普通对象都可 调用常量成员函数。通过常量对象调用常量成员函

5、数。常量成员函数内不能调用同类的非常量成 员函数,静态成员函数除外。13. 封闭类:包含成员对象的类。在定义封闭类的构造函数时,用初始化列表的方式初始化。封闭类 对象生成时,先执行所有成员对象友元和this1. 友元函数:把全局函数和其它类的成员函数声明为友元函数后,可直接在友元函数内部访问该类的私 有成员;但不能把其它类的私有成员函数声明为友元。2. 全局函数声明为友元: friend 返回值类型 函数名(参数表);3. 其它类的成员函数声明为友元: friend 返回值类型 其它类的类名:成员函数名(参数表);4. 友元类:类A将类B声明为自己的友元,则类 B中所有的成员函数都可访问类A对

6、象中的私有成员。私有成员函数也可访问。5. 注意:友元关系不能传递。6. this 指针: 非静态成员函数的实际形参比编写的多一个, 就是 this 指针,指向成员函数作用的对象。 通过 this 指针找到对象所在的地址,继而找到对象非静态成员变量的地址。7. 注意:因为静态成员函数不作用于某个对象,所以在其内部无 this 指针,不能使用。运算符重载1. 运算符重载:是对已有的运算符赋予多重含义,使不同的运算符作用于不同的类型的数据时导致 的不同的行为。 实质是编写运算符作为名称的函数。2. 返回值类型 operator 运算符(形参表) 3. 使用了被重载的运算的表达式,会被编译成对运算符

7、函数的调用,实参是运算符的操作数,运算的结果是函数的返回值。运算符可多次被重载,可重载为全局函数和成员函数。重载为全局函数 时,参数个数等于操作符的个数;重载为成员函数时,参数的个数等于操作数的个数减1. a b 被重载为 (b);4. 类名(构造函数参数表)这个写法表示生成一个临时对象。该临时对象没有名字,生存期到包含 它的语句执行完为止。5. C+规定=只能重载为成员函数.赋值运算符可以连用。6. const char *c_str() const returnstr);两种错误的情形:char*p=();strcpy(),tianggong1);7. a=b=hello; 等价于 =(h

8、ello);8. (a=b)=c; 等价于 =(b).operator=(c);9. 深复制和浅复制:两个对象的指针成员变量指向同一个地方,指向两个不同的地方。10. 将运算符重载为友元函数11. 重载插入运算符和流提取运算符: cout 是 ostream 类的对象。 ostream 类和 cout 都是在 iostream 头文件中声明的。 ostream 类将 多次重载为成员函数。比如: ostream & ostream:operator( const char*s) . return *this;) ostream & ostream:operator(intn) . return

9、*this;)12. 返回值 *this 是 cout 的引用 coutstar war5; 等价于 (star war).operatorCStudent:PrintInfo();4. 复合关系和继承关系:复合关系,有,表现为封闭类,但不一定只是封闭类。即一个类以另一个类的对象作为成员变量。继承关系,是,类B继承类A,满足B所代表的事物也是 A所代表的事物5. 类A知道类B:类A的成员变量是类B的指针内联函数体内不能包含任何静态变量,不能使用循环语句、 switch ;不能递归。2. 内联函数的定义必须出现在第一次被调用之前。3. 如果函数返回类型为 void ,则不能有 return 语句

10、。二:指针通过指针引用数组元素int a10;int *p;P+是合法的,而a+是错误的。a是数组名,它是数组的首地址,是常量;指向函数的指针变量:存放函数入口地址,指向的是程序代码存储区。1、函数调用可以通过函数名调用,也可以通过指向函数的指针变量调用。2、(*P) ( )表示定义一个指向函数的指针变量,在程序中把哪个函数的地址赋给它,它就指向哪一个函数。3、 给函数指针变量赋值时,只需给出函数名而不必给出参数。P = max4、 用函数指针变量调用函数时,只需将(*p)代替函数名,在(*p)之后的括弧中根据需要写实参。c=(*p)(a,b)5、对指向函数的指针变量不能运算const poi

11、nter一个指针涉及到两个变量,一个是指针本身,另一个是指向的变量1. 指向常量的指针const 放在指针类型前,在程序中不能通过指针来间接修改指针所指向的内存空间的值,但可以改变指向的空间int a = 10;const int b = 20;const int* pa = &a;const int* pb = &b;a = 100; 针常量const 放在”*”和指针名之间 , 不能改地址能改所指向的值。int b =28;int* const pb = &b;*pb = 100; 向常量的指针常量const 在上述两个地方都加。既不允许修改指针值,也不允许修改指针变量所指向的值const

12、 int a = 10;const int * const pa = &a;a = 100; 的静态数据成员为该类的所有对象所共享。2. 必须在类外文件作用域中的某个地方对静态数据成员赋初值 (因为构造函数多次被调用, 而静态数据成 员只初始化 1 次): : = Const 成员函数中确保不会修改任何本类对象的数据成员。class constfunprivate:int a;public:void nonconstFunc( )a=18;为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝类模板C+中实现多态的另一种方法是类模板类模板可以使用户为类定义一种模式,使得类中的一些数据成员和成员

13、函数的参数,以及成员函数的返回 值能够娶任意类型。#include template class TestClass public:T buffer10;向常量的指针const 放在指针类型前,在程序中不能通过指针来间接修改指针所指向的内存空间的值,但可以改变指向 的空间int a = 10;const int b = 20;const int* pa = &a;const int* pb = &b;a = 100; 针常量const 放在”*”和指针名之间 , 不能改地址能改所指向的值。int b =28;int* const pb = &b;*pb = 100; 向常量的指针常量const

14、 在上述两个地方都加。既不允许修改指针值,也不允许修改指针变量所指向的值const int a = 10;const int * const pa = &a;内存模型 描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将 变量存储到内存和从内存取出变量这样的低层细节 . 不同平台间的处理器架构将直接影响内存模型的结构首先介绍一下C+中有继承关系的类对象内存的布局:在C+中,如果类中有虚函数,那么它就会有一个虚函数表的指针 _vfptr ,在类对象最开始的内存数据中 之后是类中的成员变量的内存数据。对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指

15、针和成员变量)。之后是子类 自己的成员变量数据。对于子类的子类,也是同样的原理。但是无论继承了多少个子类,对象中始终只有一个虚函数表指针。BaseChild为了探讨C+类对象的内存布局,先来写几个类和函数 首先写一个基类:1. class Base2. 3. public:4. virtual void f() cout Base:f endl;5. virtual void g() coutBase:g endl;6. virtual void h() coutBase:h Setting-Link ,在Category中选中Output,然后在 Reserve中设定堆栈的最大值和 comm

16、it。注意:reserve最小值为4Byte ; commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大 的值,可能增加内存的开销和启动时间。堆和栈相比,由于大量 new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很 低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。static 用来控制变量的存储方式和可见性函数内部定义的变量,在程序执行到它的定义处时,编译器为它

17、在栈上分配空间,函数在栈上分配的空间 在此函数执行结束时会释放掉, 这样就产生了一个问题 : 如果想将函数中此变量的值保存至下一次调用时, 如何实现? 最容易想到的方法是定义一个全局的变量, 但定义为一个全局变量有许多缺点, 最明显的缺点 是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。需要一个数据对象为整个类而非某个对象服务 ,同时又力求不破坏类的封装性 , 即要求此成员隐藏在类的内 部,对外不可见。static 的内部机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能 在任何函数内分配空间和初始化。这样,它的空间分配

18、有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的 main ()函数前的全局数据声明和定义处。静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类 的“尺寸和规格”, 并不进行实际的内存分配, 所以在类声 明中写成定义是错误的。它也不能在头文件中 类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。static 被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的 先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始

19、化了。消除时的顺序是初始化 的反顺序。static 的优势:可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有 对象共用。 静态数据成员的值对每个对象都是一样, 但它的 值是可以更新的。只要对静态数据成员的值更 新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。引用静态数据成员时,采用如下格式::如果静态数据成员的访问权限允许的话 (即public的成员),可在程序中,按上述格式来引用静态数据成员。PS:(1) 类的静态成员函数是属于整个类而非类的对象,所以它没有 this 指针,这就导致 了它仅能访问类的静态数据和静态成员函数。(2) 不能将静态成员函数定义为虚函数。(3) 由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊,变量地址是指向其数 据类型的指针 ,函数地址类型是一个“ nonmember 函数指针”。(4) 由于静态成员函数没有this指针,所以就差不多等同于 nonmember函数,结果就产生了一个意想不到 的好处:成为一个 callback函数,使得我们得以将 C+和C-

温馨提示

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

评论

0/150

提交评论