C++ 复习
2015-10-25 10:08
246 查看
一、引用类型
只读引用变量用于引用常量或只读变量
引用变量必须初始化(使用左值表达式)
若引用变量引用了一个值表达式,则编译程序将临时生成类型相符的匿名变量,且用值表达式初始化该匿名变量,然后以匿名变量初始化引用变量
强制类型装换,i++均为值表达式,++i为左值表达式
例程:
二、函数内联
在内联函数内部,不能使用分支,循环,开关和函数调用语句
内联函数无论内联是否成功,其作用域都是局限于当前程序文件。
内联函数的存储类型缺省为static
三、访问权限
protected 派生的后代可访问
四、内联及位段
不管是否出现inline保留字,在类的体内定义的任何函数都会自动欧冠成为内联函数
匿名类没有类名,故没有构造和析构函数,也不能在类的体外定义函数成员
五、名字空间
指定名字空间(using namespace)后,不会将任何标识符加入当前作用域,因此,可在当前作用域定义和名字空间中的标识符同名的标识符
声明成员引用(using ,,,::x)后,将改标识符加入当前作用域
六、成员指针
当成员指针P指向某个数据成员时,不能通过指针移动(如p++将p指向其他数据成员,因为数据成员的大小及类型不一定相同,不能将p强制转换为其他任何类型或反之,否则便可以通过类型转换间接实现指针移动。
成员指针不能移动的原因在于:
1、指针移动后指向的内存单元可能属于某个成员的一部分,或者跨越两个或两个以上成员的内存空间。
2、即使移动前后指针指向的成员的类型正好相同,这两个成员的访问权限也有可能不同,此时通过指针访问成员便可能有权限访问问题。
函数成员的参数表后出现const表示this指向的对象不能修改,即不能修改this指向对象的非静态数据成员,但可以修改非只读类型的静态数据成员。
七、引用对象
浅拷贝赋值(直接将对象名传递,使得实参和形参的指针指向共同的存储单元,一旦被调用的函数返回,形参析构会出事)
深拷贝赋值(将构造函数的参数类型定义为类或类的引用)
八、静态数据成员
静态数据成员可以脱离对象存在(在没有产生任何对象时便可使用)
静态数据成员相当于一个有访问权限的普通全局变量
九、静态函数成员
静态函数成员没有隐含this参数
十、成员友元
友元不是定义该友元的类的函数成员,故不受该类的访问权限的限制,因此,可以随意在该类的private,public下声明友元
十一、普通友元
在重载函数中,未声明为友元的函数只能访问类的共有成员。
十二、派生控制
恢复权限
十三、构造与析构
构造顺序:虚基类-基类-数据成员-派生类
如果被引用的对象是用new生成的,则引用变量r必须用delete &r析构
十四、父类与子类
如果派生类的派生控制为public, 则这样的派生类称为基类的子类,而相应的基类称为派生类的父类
父类指针可以直接指向子类对象,而到底是父类对象还是子类对象只能在运行时决定(动态多态,引用类似)
如果没有构成父子关系(非公有继承),不能直接指向派生类对象而必须通过类型转换(引用类似),如果当前函数为父类的友元函数,则不必进行类型转换。
如果在派生类的成员函数中,也可以如此指向而不必强制转换,也就是说,对派生类函数成员来说,基类被等同地当做父类。
十五、虚函数
在C++中,不能定义参数个数及类型完全相同仅返回类型不同的函数或函数成员。
虚函数主要通过基类和派生类对象表现出多态特性,由于union既不能定义基类又不能定义派生类,故不能在union中定义虚函数。
十六、抽象类
由于纯虚函数可以不定义函数体,故抽象类不能定义或产生任何对象
抽象类仍可作父类定义相应的父类引用和指针,此时调用的是非抽象子类的虚函数,调用抽象类的普通函数成员不会出现不可意料的运行错误。
十七、友元,绑定
友元特性不能从基类传递到派生类
十八、虚基类
在同一颗派生树中,同名虚基类的存储空间将被合并,合并后构造函数和析构函数仅执行一次,虚基类的构造函数尽可能最早执行。
十九、派生类成员
如果虚基类和基类的成员同名,根据面向对象的作用域规则优先访问的是基类成员。(与构造顺序相反)
二十、构造与析构
构造顺序:按照定义顺序自左向右,自下而上地构造所有虚基类(在类图中)
二十一、类的存储空间
如果派生类的第一个基类建立了虚函数地址表,则派生类就共用该表首址所占用的存储单元。
如果存在虚基类,依次处理,但碰到虚基类则建立一个到虚基类的偏移。
二十二、运算符重载
运算符sizeof, . , .* , :: 和?:不能重载
=, ->,(),[]只能重载为普通成员函数,不能重载为静态函数成员或普通函数。
new delete不能重载为普通成员函数,但可以重载为静态函数成员或普通函数
其他运算符都不能重载为静态函数成员,但可以重载为普通函数成员或普通函数。
如果运算符是左值运算符,则重载后运算符函数最好返回引用类型
重载不能改变运算符的优先级和结合性
二十三、运算符函数参数
为了区分前置运算和后置运算,必须使它们的函数原型有所不同,必须将前置运算重载为单目运算符,将后置运算符重载为双目运算符。
只读引用变量用于引用常量或只读变量
引用变量必须初始化(使用左值表达式)
若引用变量引用了一个值表达式,则编译程序将临时生成类型相符的匿名变量,且用值表达式初始化该匿名变量,然后以匿名变量初始化引用变量
强制类型装换,i++均为值表达式,++i为左值表达式
例程:
int inc(int &x){return x++;} //返回x后x++,在此等价于i++ int i=1,j; void main(void) { j=inc(i); //i=2,j=1,i带回结果 j=inc(++i); //i=4,j=3,i带回结果 j=inc(i++); //i=5,j=4,先产生一个匿名变量等于4,然后&x引用该匿名变量 j=inc(i+5); //i=5,j=10,匿名变量带回结果 }
二、函数内联
在内联函数内部,不能使用分支,循环,开关和函数调用语句
内联函数无论内联是否成功,其作用域都是局限于当前程序文件。
内联函数的存储类型缺省为static
三、访问权限
protected 派生的后代可访问
四、内联及位段
不管是否出现inline保留字,在类的体内定义的任何函数都会自动欧冠成为内联函数
匿名类没有类名,故没有构造和析构函数,也不能在类的体外定义函数成员
五、名字空间
指定名字空间(using namespace)后,不会将任何标识符加入当前作用域,因此,可在当前作用域定义和名字空间中的标识符同名的标识符
声明成员引用(using ,,,::x)后,将改标识符加入当前作用域
六、成员指针
当成员指针P指向某个数据成员时,不能通过指针移动(如p++将p指向其他数据成员,因为数据成员的大小及类型不一定相同,不能将p强制转换为其他任何类型或反之,否则便可以通过类型转换间接实现指针移动。
成员指针不能移动的原因在于:
1、指针移动后指向的内存单元可能属于某个成员的一部分,或者跨越两个或两个以上成员的内存空间。
2、即使移动前后指针指向的成员的类型正好相同,这两个成员的访问权限也有可能不同,此时通过指针访问成员便可能有权限访问问题。
函数成员的参数表后出现const表示this指向的对象不能修改,即不能修改this指向对象的非静态数据成员,但可以修改非只读类型的静态数据成员。
七、引用对象
浅拷贝赋值(直接将对象名传递,使得实参和形参的指针指向共同的存储单元,一旦被调用的函数返回,形参析构会出事)
深拷贝赋值(将构造函数的参数类型定义为类或类的引用)
八、静态数据成员
静态数据成员可以脱离对象存在(在没有产生任何对象时便可使用)
静态数据成员相当于一个有访问权限的普通全局变量
九、静态函数成员
静态函数成员没有隐含this参数
十、成员友元
友元不是定义该友元的类的函数成员,故不受该类的访问权限的限制,因此,可以随意在该类的private,public下声明友元
十一、普通友元
在重载函数中,未声明为友元的函数只能访问类的共有成员。
十二、派生控制
恢复权限
class POINT:private LOCATION { int visible; public: LOCATION::getx; //恢复权限 LOCATION::gety; //恢复权限 }
十三、构造与析构
构造顺序:虚基类-基类-数据成员-派生类
如果被引用的对象是用new生成的,则引用变量r必须用delete &r析构
十四、父类与子类
如果派生类的派生控制为public, 则这样的派生类称为基类的子类,而相应的基类称为派生类的父类
父类指针可以直接指向子类对象,而到底是父类对象还是子类对象只能在运行时决定(动态多态,引用类似)
如果没有构成父子关系(非公有继承),不能直接指向派生类对象而必须通过类型转换(引用类似),如果当前函数为父类的友元函数,则不必进行类型转换。
如果在派生类的成员函数中,也可以如此指向而不必强制转换,也就是说,对派生类函数成员来说,基类被等同地当做父类。
十五、虚函数
在C++中,不能定义参数个数及类型完全相同仅返回类型不同的函数或函数成员。
虚函数主要通过基类和派生类对象表现出多态特性,由于union既不能定义基类又不能定义派生类,故不能在union中定义虚函数。
十六、抽象类
由于纯虚函数可以不定义函数体,故抽象类不能定义或产生任何对象
抽象类仍可作父类定义相应的父类引用和指针,此时调用的是非抽象子类的虚函数,调用抽象类的普通函数成员不会出现不可意料的运行错误。
十七、友元,绑定
友元特性不能从基类传递到派生类
十八、虚基类
在同一颗派生树中,同名虚基类的存储空间将被合并,合并后构造函数和析构函数仅执行一次,虚基类的构造函数尽可能最早执行。
十九、派生类成员
如果虚基类和基类的成员同名,根据面向对象的作用域规则优先访问的是基类成员。(与构造顺序相反)
二十、构造与析构
构造顺序:按照定义顺序自左向右,自下而上地构造所有虚基类(在类图中)
二十一、类的存储空间
如果派生类的第一个基类建立了虚函数地址表,则派生类就共用该表首址所占用的存储单元。
如果存在虚基类,依次处理,但碰到虚基类则建立一个到虚基类的偏移。
二十二、运算符重载
运算符sizeof, . , .* , :: 和?:不能重载
=, ->,(),[]只能重载为普通成员函数,不能重载为静态函数成员或普通函数。
new delete不能重载为普通成员函数,但可以重载为静态函数成员或普通函数
其他运算符都不能重载为静态函数成员,但可以重载为普通函数成员或普通函数。
如果运算符是左值运算符,则重载后运算符函数最好返回引用类型
重载不能改变运算符的优先级和结合性
二十三、运算符函数参数
为了区分前置运算和后置运算,必须使它们的函数原型有所不同,必须将前置运算重载为单目运算符,将后置运算符重载为双目运算符。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息