c++知识点总结

上传人:第*** 文档编号:34066828 上传时间:2018-02-20 格式:DOCX 页数:20 大小:105.61KB
返回 下载 相关 举报
c++知识点总结_第1页
第1页 / 共20页
c++知识点总结_第2页
第2页 / 共20页
c++知识点总结_第3页
第3页 / 共20页
c++知识点总结_第4页
第4页 / 共20页
c++知识点总结_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《c++知识点总结》由会员分享,可在线阅读,更多相关《c++知识点总结(20页珍藏版)》请在金锄头文库上搜索。

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

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

3、类的对象作为唯一的参数。 默认复制构造函数。6. 复制构造函数被调用的三种情形:1 用一个对象去初始化另一个对象时 Complex C1(C2) Complex C2=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 声明为自己的友元,

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

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

8、strcpy(s.c_str(),tianggong 1);7. a=b=hello;等价于 a.operator=(b.operator=(hello);8. (a=b)=c;等价于 (a.operator=(b).operator=(c);9. 深复制和浅复制:两个对象的指针成员变量指向同一个地方,指向两个不同的地方。10. 将运算符重载为友元函数11. 重载插入运算符和流提取运算符:cout 是 ostream 类的对象。ostream 类和 cout 都是在 iostream 头文件中声明的。ostream 类将CStudent:PrintInfo();4. 复合关系和继承关系:复合关

9、系,有,表现为封闭类,但不一定只是封闭类。即一个类以另一个类的对象作为成员变量。 继承关系 ,是,类 B 继承类 A,满足 B 所代表的事物也是 A 所代表的事物5. 类 A 知道类 B:类 A 的成员变量是类 B 的指针6. /导出类构造函数和析构函数的构建基类的构造函数和析构函数不能被派生类继承。如果基类没有定义构造函数,派生类也可以不定义构造函数,全都采用缺省的构造函数,此时,派生类新增成员的初始化工作可用其他公有函数来完成。如果基类定义了带有形参表的构造函数,派生类就必须定义构造函数,提供一个将参数传递给基类构造函数的途径,以便保证在基类进行初始化时能获得必需的数据。如果派生类的基类也

10、是派生类,则每个派生类只需负责其直接基类的构造,不负责自己的间接基类的构造。派生类是否要定义析构函数与所属的基类无关,如果派生类对象在撤销时需要做清理善后工作,就需要定义新的析构函数。多态与虚函数1. 多态:派生类对象的地址可以赋值给基类指针。对于通过基类指针调用基类和派生类中都有的同名的,同参数的虚函数的语句,编译时不需要确定执行的是基类的还是派生类的虚函数。当程序运行到该语句时,如果基类指针指向的是一个基类对象,则调用基类的虚函数;如果基类指向的是一个派生类对象,则调用派生类的虚函数。这种机制成为多态;2. 面向对象程序设计语言有封装,继承,多态三种机制,这三种机制能够有效提高程序的可读性

11、,可扩充性和可重用性。3. 多态指同一事物可以完成不同的功能。分为编译时的多态和运行时的多态。前者主要指函数的重载(包括运算符重载),对重载函数的调用。后者主要与继承,虚函数等概念有关。4. 虚函数:声明前面加了 virtual 关键字的成员函数。virtual 关键字只能在类定义中的成员函数声明处使用,不能在类外编写成员函数体时使用。静态成员函数不能是虚函数。包含虚函数的类成为多态类。5. 多态可以简单地理解成同一条函数调用语句能调用不同的函数。或者对不同的对象发同一消息,使得不同对象有各自不同的行为。6. 注意:多态的语句调用的是哪个类的成员函数,是在运行时才能确定的,编译时不能确定。因此

12、多态的函数调用语句是动态联编的,普通的函数调用语句时静态联编的。7. 通过基类引用实现多态。通过基类的引用调用虚函数的语句是多态的,即通过基类的引用调用基类和派生类中的同名同参表的虚函数时引用的是哪个类的对象,调用该对象的虚函数。8. 多态的实现原理:每一个有虚函数的类,都有一个虚函数表,列出了该类所有虚函数的地址。该类的任何对象都存放着该虚函数表的指针。位于对象存储空间的最前端,在数据成员之前,里面存放着虚函数表的地址。9. 多态的实现过程:根据基类指针所指向的或基类引用所引用的对象中存放的虚函数表的地址,查找要调用的虚函数的地址,调用虚函数。10. 类的成员函数可以相互调用,在成员函数(静

13、态,构造,析构除外)中调用同类的虚函数的语句是多态的。11. 在构造函数和析构函数中调用虚函数不是多态的,即编译时即可确定。如果本类有该函数,则调用本类的,本类没有调用直接基类的,基类没有,调用间接基类的。12. 注意:只要在基类中某个函数被声明为虚函数,则在直接和间接派生类中,同名同参数的成员函数即使不写 virtual 也自动成为虚函数。13. 虚析构函数:如果一个基类指针指向 new 出来派生类的对象,释放该对象时是通过该基类指针来完成的。14. 如果基类的析构函数是虚函数,派生类的析构函数即使不用 virtual 关键字也自动成为虚函数。15. 注意:!析构函数可以是虚函数,但构造函数

14、不可以!16. 纯虚函数:没有函数体的虚函数;在函数声明后加=0;17. 抽象类:包含纯虚函数的类;不能生成独立的对象,但抽象类可以作为基类,派生出新类。因此,独立的抽象类的对象不存在,但是被包含在派生类对象中的抽象类的对象,是可以存在的(但要实例化,有函数体)。18. 可以定义抽象类的指针或引用,让他们指向或引用抽象类的派生类的对象,实现多态。19. 如果一个类从抽象类派生而来,那么当且仅当它对基类中所有纯虚函数都进行覆盖并都写出函数体(也是),它才能成为非抽象类。函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返

15、回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。 因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。特别是对于一些函数体代码不是很大,但又频繁地被调用的函数来讲,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题。 优点:可以加快代码的执行速度,当程序中调用内联函数时,该函数直接嵌入到每个调用语句处,每次函数调用时都用相对应的一段代码代替。可见它是以目标代码的增加为代价来换取时间的节省 主要解决功能相对简单、规模不大但使用相当频繁的程序运行效率问题。 使用内联函数时,遵守以下规则: 1. 内

16、联函数体内不能包含任何静态变量,不能使用循环语句、switch;不能递归。 2.内联函数的定义必须出现在第一次被调用之前。 3.如果函数返回类型为 void,则不能有 return 语句。二:指针 通过指针引用数组元素 int a10; int *p; p+是合法的,而 a+是错误的。a 是数组名,它是数组的首地址,是常量;指向函数的指针变量:存放函数入口地址,指向的是程序代码存储区。 1、函数调用可以通过函数名调用,也可以通过指向函数的指针变量调用。 2、(*p) ( ) 表示定义一个指向函数的指针变量,在程序中把哪个函数的地址赋给它,它就指向哪一个函数。3、给函数指针变量赋值时,只需给出函数名而不必给出参数。 p = max 4、用函数指针变量调用函数时,只需将(*p)代替函数名,在(*p)之后的括弧中根据需要写实参。 c=(*p)(a,b) 5、对指向函数的指针变量不能运算const pointer一个指针涉及到两个变量,一个是指针本身,另一个是指向的变量1.指向常

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号