C++难点的一些总结(1)
来源:互联网 发布:淘宝上的路吉星电子狗 编辑:程序博客网 时间:2024/05/29 06:41
一、 C++成员函数的重载
C++中的成员函数有四种,分别是普通成员函数,virtual虚函数,const成员函数。
(1) void func(int a);
(2) virtual void func(int a);
(3) void func(int a) const;
如果在一个类中,声明这四种函数,哪是重复定义?哪些是重载?
其中(1)(2)是重复定义,故编译不能通过,而(3)与(1)(2)是不同类型的函数,是重载。
【注意:众所周知,C++函数重载时返回值是不参与重载决议的, 也就是说,
int lex_cast(const char*);
double lex_cast(const char*);
这样两个函数在同一个编译单元同一个 namespace 中时, 会编译报错。
】
成员函数被重载的特征是:
(1)具有相同的作用域(即同一个类定义中);
(2)函数名字相同
(3)参数类型,顺序 或 数目不同(包括const参数和非const函数)
(4)virtual关键字可有可无。
从成员函数的重载特征中,可以知道(1)(2)是重复定义。那么(3)为什么和(1)(2)不同呢?
因为类中的函数,都会自动添加一个自身类指针this,所以
void func(int a) ==== void func(Base * this, int a)
virtual func(int a) ==== virtual func(Base *this, int a)
void func(int a)const === void func(const Base *this, int a) const 【重要】
所以(3)可以与(1)(2)发生重载,因为参数有一个const。
二、inline, static, constructor三种函数都不能带有virtual关键字
(1).为什么C++不支持构造函数为虚函数?
这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完全了解细节的情况下也能正确处理对象。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。(这不就是典型的悖论)
【最简单是因为,类中只有构造、析构和拷贝构造三个函数不能被继承,所以每个类都必须有明确的编译期就确定的上述三个函数,没有的会自动生成。】
(2).为什么C++不支持内联成员函数为虚函数?
其实很简单,那内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。(再说了,inline函数在编译时被展开,虚函数在运行时才能动态的邦定函数)
4.为什么C++不支持静态成员函数为虚函数?
这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定的必要性。【只是因为没有太大必要性所以这样,这条可以死记住。因为实际上是可以实现的,技术上没什么问题,就是为了逻辑性而强制这样规定了。】
5.(补充)为什么C++不支持友元函数为虚函数?
因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。
转载:http://www.cnblogs.com/hnfxs/archive/2013/06/30/3163673.html
- C++难点的一些总结(1)
- C语言一些难点
- C语言难点总结
- java的一些难点
- 学习javaSE基础中遇到的一些难点的总结
- iOS编程遇到的一些难点问题总结
- windows程序设计中的HEXCALC.c 程序的一些难点指导
- C语言一些重难点笔记(一)
- C语言难点总结篇
- C语言的难点
- 机房收费系统难点总结(1)
- C语言种指针难点(1)
- C/C++重难点总结系列(一)
- C/C++重难点总结系列(二)
- C/C++重难点总结系列(三)
- C/C++重难点总结系列(四)
- C/C++重难点总结系列(五)
- C的一些总结
- 软件工程线上课程(C语言实践篇)学习心得总结
- 一篇文章搞懂toString() 和 valueOf()
- 50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段
- CMD常用命令
- CSU 1957: Apache还想再活五百年
- C++难点的一些总结(1)
- 在windows下Qt5.7/C++怎么连接MySQL数据库
- node.js 学习笔记
- 207. Course Schedule Medium
- html中的其他的常用标签
- Android服务Service详解(作用,生命周期,AIDL)系列文章-为什么需要服务呢?
- 编码GBK的不可映射字符
- GAN入门教程 | 从0开始,手把手教你学会最火的神经网络
- Java程序员的几条建议