C++要点精简总结

1、  当函数定义放在函数调用之后时,C程序的函数原型即声明(function prototype)有时可以省略,而C++程序的函数原型则不能省略。

2、  内联函数,函数调用中系统要进行现场处理,如果函数本身很短则现场处理占用比重很大,此时定义内联函数使得函数体直接嵌入函数调用处,消除附加现场处理。编译时,编译程序将内联函数调用语句替换为函数体代码,并将形参替换为实参,坏处是增加内存占用空间,因此内联函数一般适用于代码较短的函数。在函数头前加上inline即可,内联函数体内不能有循环语句,switch语句和数据声明,内联函数必须定义在前,调用在后。

3、  引用作为一般变量使用几乎没有实际意义,其最大的用处是用作函数形参。

4、  作用域有局部作用域,全局作用域和文件作用域三种。

作用域类型

相应变量

实现方式

作用范围

局部

局部/内部

函数内部

函数内部

全局

全局/外部

函数外部+extern

整个程序

文件

全局/外部

函数外部+static

整个源文件

变量的作用域是从代码空间的考虑,生存期是从时间考虑。作用域是指变量在源程序中的一段静态区域,而生存期是指变量在程序执行过程中存在的一段动态时间。有些变量(如函数形参)没有生存期,但有作用域,而有些变量虽然在生存期,但不在作用域内。

5、  C++中的变量有数据类型和存储类型两种属性,C++内存分配方式有:自动,静态和动态分配三种,分别对应活动存储区(栈),静态存储区和自由存储区(堆)。动态分配是一种完全由程序自身控制内存分配的方式。对于非动态内存分配的变量,变量采用哪种内存分配方式,是由声明变量时指定的存储类型和变量声明语句所在的位置决定的。变量的存储类型有autoregisterexternstatic四种。

存储类型

变量类型

存储类型

生存期

Auto/未指定内部变量

内部

函数内部

Register

内部

寄存器(CPU

函数内部

Extern/未指定外部变量

外部

静态存储区

程序全局

Static

内部或外部

静态存储区

程序全局

外部变量有定义性声明和引用性声明两种声明方式,定义性声明表示定义变量,要为变量分配内存空间,引用性声明说明该变量已经在程序源文件中其他地方进行过定义性声明。外部变量的定义性声明只能放在函数的外部,引用性声明可放在函数的外部,也可放在函数的内部。Extern主要用于外部变量的引用性声明,而外部变量的定义性声明可以不加extern。进行外部变量的extern引用性说明时一般不可以进行初始化,除非对该外部变量进行定义性声明时没有进行初始化。

Static修饰全局和局部变量作用不同,对于前者缩小了作用域,对于后者扩大了生存期。

6、  作用域限定符::解决局部变量和全局变量同名的问题,但是只能用来访问全局变量,不能用于访问一个在语句块外声明的同名局部变量。

7、  条件编译指令的用处:在调试程序时,经常需要利用输出语句输出一些调试信息,这时,可以在源程序开头位置定义一个调试宏,在所有调试信息输出语句前加上#ifdef条件编译指令。在程序调试完之后,为了不限是这些信息,只需删除源程序开头位置的宏定义指令,然后重新编译程序即可。

8、  结构化程序设计是一种自顶向下,逐步求精的模块化程序设计方法,是一种传统的面向过程的程序设计方法。结构化程序设计将数据和过程分离,而面向对象的程序设计把数据和处理数据的过程当成一个整体即对象,前者是以功能为中心划分系统,后者是以数据为中心来划分系统具有更强的稳定性。

9、  在定义类时不能对成员变量进行初始化,因为不能确定类中定义的成员变量时属于哪一个对象。

10、如果在定义类时没有定义构造函数和析构函数,编译系统会自动添加一个默认的构造函数和析构函数,执行为空。构造函数的定义通常放在类体内,自动成为内联函数。

11、类的不同对象的数据成员一般不同,此为实例属性;有的数据成员对所有对象都是一样的,此为类属性。类属性通过static关键字实现。静态数据成员只占一份内存,且即使没有对象也会存在。静态数据成员不能在构造函数或其他成员函数中对他们进行初始化,必须在类体外进行。在建立对象之前访问静态成员,则必须定义一个静态成员函数,一般都是公有的,注意,静态成员函数只能访问类的静态成员(变量和函数),而不能访问非静态成员,解决方法是将对象作为静态成员函数的的参数,然后在静态成员函数中通过对象访问非静态成员。

12、在一个成员函数中经常需要调用其他非本类的成员函数,而有时需要把当前对象作为参数传递给被调用函数,此时必须用到this指针,每个非静态成员函数都有一个this指针。

13、一个类的友元函数需要在类定义中用friend声明,为了能够在友元函数中访问或修改类的私有成员,一个类的友元函数一般将该类的对象或对象引用作为函数参数。还可以如此声明一个类的友元类。友元是单向的,不交换不传递。

14、const常对象的数据成员的值在对象的整个生存期内不能被改变,必须利用构造函数进行初始化,且此后不能再被更新。常成员函数中只能调用常成员函数,通过常对象只能调用常成员函数。常数据成员只能通过构造函数初始化列表中设置初始值。

15、继承方式

          原属性

继承方式

Private

Protected

Public

Private

Private

Private

Private

Protected

Private

Protected

Protected

Public

Private

Protected

Public

16、除非基类有默认的构造函数,否则派生类必须定义一个给基类的构造函数提供参数的构造函数。基类怎么会没有默认的构造函数呢?如果已经给基类自定义了构造函数,则基类不再有默认的构造函数。

17、处于同一层的各基类构造函数的执行顺序取决于定义派生类时各基类的排列顺序,而与定义派生类的构造函数时基类构造函数的排列顺序无关。

18、多继承容易导致二义性错误,通过d1.Base2::a这样的方式消除太麻烦且浪费内存,于是出现了虚基类。当虚基类的间接派生类的构造函数采用显式方式调用虚基类的构造函数时,该派生类的直接基类对虚基类的构造函数的调用将被C++编译器忽略,如此可以保证不重复调用虚基类的构造函数,从而对虚基类的数据成员只初始化一次。

19、多态有编译时多态和运行时多态两种,前者是重载,后者是虚函数。

20、C++允许一个基类的指针指向其派生类的对象,反过来则不行。注意,即使将一个基类的指针指向派生类的对象,通过该指针也只能访问派生类中从基类继承来的共有成员,不能访问派生类中新增加的成员,除非通过强制类型转换将基类指针转换为派生类指针。

21、如果想通过指向派生类对象的基类指针调用派生类中覆盖的成员函数,只有使用虚函数。当通过基类指针调用虚函数时,到底执行哪个类的成员函数完全由指针所指的对象决定。

22、构造函数不能被定义为虚函数,因为声明派生类对象时也自动调用基类的构造函数。但可以将析构函数定义为虚函数。当使用基类指针指向派生类对象,而派生类对象是使用new运算符创建的,当使用delete删除派生类对象时,只调用基类的析构函数而不会调用派生类的析构函数,如果使用虚析构函数,无论指针所指的对象是基类对象还是派生类对象,程序都会调用对应的析构函数。

23、函数模板将数据类型参数化,编译时函数模板本身并不产生可执行代码,只有在函数模板被实例化时,编译器才根据实参的数据类型进行类型参数的替换(与宏类似),生成一个真实的函数,然后再对这个函数进行编译。类模板不是通过调用函数时实参的数据类型来确定类型参数的数据类型,而是通过使用类模板声明对象时所给出的实际数据类型确定类型参数的数据类型。

24、运行库文件,程序运行时所需要的库文件,旧的是<iostream.h>,标准C++库是<iostream> using namespace std

25、运行时类型识别(run-time type information, RTTI)是这样一种机制:在程序运行时可以确定一个对象的类型。Dynamic_cast 运算符检查一个基类指针是否指向其派生类对象,使用方式为:dynamic_cast<指针类型>(指针)typeid运算符不仅可以确定一个对象是否属于类继承层次中某个类,还可以识别程序运行时一个对象的实际类型。

26、匈牙利命名法,a数组变量,c字符变量,x,y无符号整形变量,s字符串变量(不常用),sz0结束的字符串变量,fn函数,Afx应用程序框架。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值