C++知识问答2

1、static关键字在c语言和C++语言中各自有哪些不同用法?

解析:C++兼容C语言中对于static的定义;C++中多了对于面向对象特性相关的引用。

c语言中的作用:1)修饰变量;2)修饰函数。

1)修饰变量:a.修饰全局变量,改变全局变量的作用域,使其仅在声明文件中可见,对其他文件不可见,限制其使用范围;b.修饰局部变量,延长变量的声明周期,作用域不变,普通局部变量随着作用域结束,释放其栈上内存,用static修饰后,其内存将在程序结束才进行释放。

2)修饰函数:和全局变量一样,改变了函数被调用的范围。

C++中的作用:被static修饰的变量/函数,表示其属于这个类,但是不属于任一个特定的对象。

1)静态数据成员,必须在类外进行初始化,因其不属于任何一个对象;

2)静态成员函数:本身只能访问静态变量,不可以访问其他非静态成员变量。

2、面向对象有哪些基本特性?

解析:面向对象基本概念:类,对象,继承;基本特征:封装、继承、多态。

1)封装:【定义】数据和代码捆绑在一起,避免外界干扰和不确定性访问;【引申】注意与组合的区分,封装指一个类内数据方法独立,对外开放限制;组合指不同对象之间包含关系。

2)继承:【定义】让某种类型对象获得另一个类型对象的属性和方法;

【功能】可以使用现有类,并在无需重新编写原有类的情况下对这些功能进行扩展;

【方式】实现继承(使用基类属性和方法,无需额外编码);接口继承(使用基类的属性和方法名称,但子类必须提供实现),可视继承(子窗体/类使用基窗体/类的外观和实现代码能力)。

3)多态:【定义】同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时候会产生不同的行为。

【引申】:重载是不是多态?重载是一个类内的不同方法,不属于继承。可以认为是广义多态,理解为编译时候的静态多态,也可以认为其不是对象间调用形成,可以认为不是多态,只有重写才算多态。没有明确定义。

【功能】多态性允许将父对象设置成为和一个更多的他的子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性调用不同的方式运作。也即接口重用。

【简单概括】允许将子类类型的指针赋值给父类类型的指针。

3、虚函数相关介绍

1)继承层次中,基类析构函数为虚函数:针对多态属性,当单基类指针实际所指对象为继承类对象,如果析构函数不为虚函数,当释放该对象内存时候,将只调用基类析构函数,使得继承类对象的自有数据无法释放,造成内存泄漏问题;因此,需要将基类析构函数定义为虚函数;释放该类对象内存时候,先调用继承类析构函数,然后在调用基类析构函数。

2)构造函数不能为虚函数:a.构造一个对象时候,必须知道对象的实际类型,而虚函数是在运行期间确定实际类型的。所以,如果构造函数为虚函数,则构造一个对象时候,由于对象未构造成功,编译器不知道实际对象的类型,无法确定。b.虚函数实现依赖虚函数表,而虚函数表的指针vptr是在构造函数中初始化的,所以如果构造函数为虚函数,虚函数表没被初始化,无法进行。

3)虚函数运行代价:每个虚函数的对象需要维护一个虚函数表(通过虚指针指向这个虚函数表),因此在使用虚函数的时候都会产生一定的系统开销。

4)inline/static/constructor这三种函数不能为虚函数:inline是编译时展开,必须有实体;static属于class自己的类相关,必须有实体,而且没有this指针,无法调用虚函数;constructor参见2)。

4、几种继承方式

解析:1)public继承:派生类对象可以访问基类中的公有成员,派生类成员函数可以访问基类中的公有和受保护成员;

2)private继承:基类的成员只能被直接派生类的成员访问,无法再往下继承;

3)protected继承:基类的成员也只被直接派生类的成员访问,无法再往下继承;

4)虚继承:为了解决多继承时的命名冲突和冗余数据问题;虚继承目的是为了让某个类做出声明,承诺愿意共享它的基类;典型代表为:C++标准库中的iostream类。

使用多继承经常出现二义性,必须十分小心,一般只有比较简单和不易出现二义性或者实在需要时候使用多继承,能用单一继承的就不用多继承。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值