c++基础知识点

面向对象特征?

答:面向对象的特征主要有以下几个方面:

  • 抽象:

    抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

  • 继承:

    继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有
    了一定的延续性,同时继承也是封装程序中可变因素的重要手段.

  • 封装:
    通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。

  • 多态性:
    多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西.

如何实现多态?

要实现多态需要做两件事:1).
方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

什么是虚函数?虚函数有什么用?虚函数实现的原理?

虚函数是重载的另一种表现形式。这是一种动态的重载方式,它提供了一种更为灵活的、运行时的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的动态连编。

  • 虚函数首先是基类中的成员函数,但这个成员函数前面加了关键字virtual,并在派生类中被重载。

    它的一般形式:

    virtual 返回类型 函数名(形参表)

    {
    函数体

    }

在基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义。虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型的顺序,都必须与基类中的原型完全相同。**

对于虚函数的定义有几点说明:

1、由于虚函数使用的基础是赋值兼容规则,而赋值兼容规则成立的前提条件是派生类从基类公有派生。

2、必须首先在基类中定义虚函数。由于“基类”与“派生类”是相对的,因此这项说明并不表明必须在类等级的最高层类中声明虚函数。在实际应用中,应该在类等级内需要具有动态多态性的几个层次中的最高层类内首先声明虚函数。

3、在派生类中对基类中声明的虚函数进行重新定义时,关键字virtual可以写可以不写。但在容易引起混乱的情况下,最好在派生类的虚函数进行重新定义时加上关键字virtual。

4、虽然使用对象名和点运算符的方式可以调用虚函数,若 定义 基类 Base对象 b 虚函数为show() b.show();可以调用虚函数Base::show();但是这种调用在编译时进行的是静态连编,没有充分利用虚函数的特性,只有通过基类指针访问虚函数是才能获得运行时的多态性。

5、一个虚函数无论被继承多少次,它仍然保持虚函数的特性。

6、虚函数必须是其所在类的成员函数,不能是友元函数,也不能是静态成员函数,因为虚函数调用要靠特定的对象来决定该激活那个函数。

7、内联函数不能为虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时仍将其看作是非内联的。

8、构造函数不能是虚函数,但是析构函数可以是虚函数,而且通常说明为虚函数。

什么是纯虚函数?什么是抽象类?抽象类与普通类区别?抽象类作用?

hahah

const函数有什么用?

const修饰this指针,说明这个成员函数不会修改类的成员变量。

构造函数与析构函数可以是虚函数?为什么?

构造函数不能是虚函数

析构函数可以是虚函数,并且通常是虚函数,因为你的夫类不知道你的子类会不会有动态内存,有动态内存的情况下需要调用子类自定义的析构函数。

初始化列表初始化属性与在函数体内初始化有什么区别?

初始化列表是初始化,而在函数体内是赋值操作。

内联函数是什么?宏定义是什么?内联函数与宏定义区别?什么样的函数是内联函数?什么样的函数适合写成内联函数?内联函数有什么优点?

(1)类中的成员函数都是内连函数,类外的在函数定义(实现的时候而不是声明的时候)的时候前面加 inline关键字的函数也是内联函数。但是具体实不实现是靠编译器来决定的。

(2)内联函数和宏定义函数的区别:

​ 1.内联函数是在编译阶段进行展开,而宏定义是在预编译阶段进行简单的替换操作

​ 2.内联函数会检查类型的错误,会检查要替换的参数符不符合我写的内联函数的函数参数,而宏定义不会。

tip:内联函数的使用肯定会使的代码变长,但是可以省去调用函数的开销。所以太长的代码不要作为内联函数,不然会适得其反。

拷贝构造函数什么时候被调用?

手动调用:

类名 对象2 = 对象1;    // 调用复制构造函数
类名 对象3(对象1);     // 调用复制构造函数

自动调用:

一个对象作为函数参数,以值传递的方式传入函数体
一个对象作为函数返回值,以值从函数返回
一个对象用于给另外一个对象进行初始化(赋值初始化)

拷贝构造函数与赋值运算符重载的区别?

拷贝构造函数是构造对象的时候给对象初始化,而赋值运算符重载是把一个对象的值赋给另外一个已经存在的对象。

c++里面,class与struct区别?

class的默认访问权限是private的,而struct的默认访问权限是public的。
class不能使用花括号来对其初始化,(c++98不可以,c++11可以),但是struct是可以的。

查看linux的版本命令

[root@foundation45 kiosk]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.2 张三 张三 李四 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说: 忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.2 开始 我的操作 确认? 结束 yes no
  • 关于 序列图 语法,参考 [这儿][4],
  • 关于 流程图 语法,参考 [这儿][5].
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值