面向对象
特征
- 封装
封装是保证软件内部具有优良的模块性的基础,防止程序相互依赖而带来的变动影响。面对对象的封装就是把描述一个对象的属性和方法的代码封装到一个“模块”中或者时一个“类”中,属性用变量定义,行为用方法定义,方法可以直接访问同一个对象中的属性。一般把一个类的成员变量全部定义为私有
原则是把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和他操作的数据放在同一个类中。 - 抽象
就是找出一些事物的相似和共性之处,然后把这些事物归为一类。忽略与当前主题和目标无关的那些方面 - 继承
再定义一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以添加若干新的内容,或修改原来的方法使之更适合特殊要求。子类继承共享父类资源(数据或方法),可提高软件的可重用性和可扩展性。 - 多态
按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的调用在该编程时不确定,在程序运行期间才能确定。即一个引用变量会指向哪一个类的实例对象,该引用变量发出的方法调用是哪个类中的实现方法,必须在运行程序时才能确定。有了多态,可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。增加软件的灵活性和拓展性。
- 虚函数vitural声明
常见问题
-
类与对象的关系
类是一种数据结构,将不同类型的数据与这些数据相关的操作封装在一起的集合体。关键是数据抽象和封装。包含了数据表示法和用于处理数据的方法
对象是指将类实例化的实体,具体的事物或者抽象的事物 -
类与结构体
- C语言只有结构体,C++两个都有
- C中结构体只涉及数据结构,C++ 中类体现数据结构与算法的结合。C结构体中没有成员函数,可以被声明为变量、指针和数组等。类有成员函数
- 访问机制:结构体默认访问机制是public,而类默认是private
- 继承:class继承默认是private继承,struct继承默认是public继承
-
对象都具有的二方面特征的含义
静态特征:能描述对象的一些属性
动态特征:指对象表现出来的行为 -
成员函数通过什么来区分不同对象的成员数据?为什么能区分?
通过this指针来区分,指向的是对象的首地址 -
构造函数与普通函数的形式不同
构造函数是特殊成员函数,一般用来初始化对象成员变量;构造函数的名字与类相同,不具有任何类型,不返回任何值; -
构造函数的调用顺序:
- 先调用基类构造函数
- 按声明顺序初始化数据成员
- 最后调用自己的构造函数
-
抽象类的特点
指C++中憨纯虚函数的类,不能生成对象;
特点:- 子类来实现接口类中没有实现的所有接口
- 接口方法前面右virtual关键词修饰,且等于0
- 只能被继承,不能独自生成对象(不能实例化)
-
private 、protect、public三种限制访问类型的区别?
- private:私有类型,只有本类的成员函数访问
- peotect:保护型,本类和继承类可以访问
- public:共有类型,任何类都可以访问
-
类外怎样访问类的非公有成员?
友元、继承、公有成员函数 -
多重继承与多继承的区别
多继承指一个子类继承多个父类;对个数、继承方式无限制
多重继承指:当B类从A类派生,C类从B类派生。特点:
- 实例化子类时,会首先依次调用所有基类的构造函数,最后调用该子类的构造函数;销毁时相反
- 不论继承多少层,只要他们保持直接或间接的继承关系,子类都可以与其直接父类或间接父类构成is a的关系,且能通过父类的指针对直接子类或间接子类进行相应的才做,子类对象可以给直接父类或间接父类的对象或引用赋值或初始化
-
函数重载与虚函数区别:
函数重载同名函数完成不同功能,编译系统阶段通过函数参数个数、参数类型不同、函数返回值来区分调用哪一个函数。
虚函数是在基类中使用关键字virtural来声明一个函数为虚函数,是该函的功能在将来的派生类中定义或者在基类的基础上进行扩展,系统只能在运行阶段才能动态决定调用那一个函数,实现的是动态的多态性。 -
构造函数和析构函数是否可以被重载?
构造函数可以被重载,析构函数不可以被重载;析构函数可以有多个且可以带参数,析构函数只能有一个且不带参数 -
拷贝构造函数调用情况:
- 通过使用另一个同类型的对象来初始化新创建的对象
- 如果函数的形参是类的对象,复制对象把它作为参数传递给函数
- 如果函数的返回值时类的对象,复制对象并从函数返回这个对象
-
深拷贝和浅拷贝的区别
在未定义显示拷贝构造函数时,系统会默认调用的拷贝函数(浅拷贝),能够完成成员的一一构造。数据成员没有指针类型时,浅拷贝是可行的;但有指针时,采用浅拷贝会使两个类的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,导致指针悬挂现象。即必须使用深拷贝
深拷贝会在堆内存中另外申请空间来存储数据,避免指针悬挂现象 -
构造函数与析构函数的区别
构造函数的名称与类的名称相同,并不会返回任何类型,也不返回void,可以带参数
析构函数的名称与类的名称相同,只是在前面加~作为前缀,不返回任何值,也不带任何参数
目的不同:析构函数:主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中;析构函数:在跳出程序(关闭文件、释放内存等)前释放资源,清理善后工作 -
构造函数可以是虚函数吗?
不可以。构造对象时,必须知道对象的实际类型。虚函数行为实在运行期间确定实际类型;虚函数的运行依赖于虚函数指针,虚函数真指针在构造函数中进程初始化,让他指向正确的许哈桉树虚函数表,而在对象构造期间,虚函数指针还未构造完成