C_C++知识点总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、dynamic_cast<>详解
作用:
将一个基类对象引用/指针cast到继承类指针
dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理,即会作一定的判断。
对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用;
对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针。
将一个子类对象的指针/引用转换为基类的指针/引用,称之为“upcast”,因为转换方向是在class hierarchy中从下自上。
将基类的指针/引用转换为一个子类的指针/引用,称之为“downcast”,因为在hierarchy中是自上而下。
2、多态性
多态性:是指不同类型的对象接收相同的消息时产生不同的行为。
编译时的多态性是通过函数的重载或运算符的重载来实现。
运行时的多态性是通过虚函数来实现的。
3、★虚函数
(1)虚函数是动态绑定的基础。
(2)虚函数是类的成员函数。
(3)虚函数的声明方法:
virtual 类型说明符号函数名(参数列表)
某类中的一个成员函数被说明为虚函数,这意味着该成员函数在派生类中可能有不同的实现。
动态绑定只能通过指针或引用标识对象来操作虚函数。
★说明:派生类中对基类的虚函数重新定义时:
(1)与基类的虚函数有相同的参数个数。
(2)其参数的类型与基类的虚函数的对应参数类型相同。
(3)其返回值或者与基类虚函数的相同,或者都返回指针或引用。
4、拷贝操作
拷贝操作的实质就是类的对象空间的引用,所以在C++的规定中就说拷贝构造函数的参数个数可以是1个或者多个,但是第一个参数必须是类的引用对象,这个参数的形式可以是“类名&对象名”或者“const 类名&对象名”的形式,这里的类名就是该拷贝构造函数所在的类的类名。
5、变量,指针,引用,为什么推荐引用?
使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。
因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。
而引用更容易使用,更清晰。
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。
6、引用
(1)声明引用时,必须同时对其进行初始化。
(2)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
ra=1; 等价于 a=1;
(3)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。
故:对引用求地址,就是对目标变量求地址。
&ra与&a相等。
(4)不能建立数组的引用。
因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名.
(5)不能建立引用的引用,不能建立指向引用的指针。
因为引用不是一种数据类型,所以没有引用的引用,没有引用的指针。
7、delete关键字
用delete命令处理某个指针,说是把那个指针删除了是不正确的。
delete命令只是释放了那个指针原本所指的那部分内存而已。
被delete后的指针p的值(地址值)并非就是NULL,而是随机值。
因此创建的对象被delete后,就必须再加上一句p=NULL。
也就是被delete后,如果不再加上一句p=NULL,p就成了“野指针”,在内存里乱指一通。
如果在定义p的那个函数在delete了p后,没再调用p,就没什么问题,在这个函数结束后,p就会跟其它变量一样被消除。
但若在那个函数里delete了p后,又没再给p赋值(地址值),再次调用p就危险了,因为这时p在内存里乱指,有可能指到一些重要地址,随时可能系统崩溃。
因此在分配空间给指针之后,一定要用NULL来判断一下是否成功了。
然后在删除这个指针的时候,也要用NULL来赋给指针,杜绝成为野指针!
8、运算符重载
★重载运算符的规则
1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载
2)不能重载的运算符只有5个
. * :: sizeof ?:
3)重载不能改变运算符运算对象(操作数)的个数
4)重载不能改变运算符的优先级别
5)重载不能改变运算符的结合性。
6)重载运算符的函数不能有默认的参数。
7)重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是对象或类对象的引用。
8)应当是重载运算符的功能类似该运算符作用与标准类型数据时所实现的功能。
9)可以是类的成员函数,也可是友元函数,还可是普通函数。
9、二维相量
一维:
vector<int> a(n); // 指定容器大小为n
vector<int> a(n, x); // 指定容器大小为n,并初始化所有元素为x
二维:
vector<vector<int> > a(m, vector<int>(n)); // m行n列的二维数组,可以直接用a[i][j]访问,但是建议使用at()函数进行访问。