面向对象

来源:互联网 发布:erp软件系统 报表 编辑:程序博客网 时间:2024/05/22 02:30

虽然有很多知识点心里是知道的,但是往往很多时候不能准确描述,或”只能意会“,所以对于基础概念的准确描述是十分必要的。

1、面向对象与面向过称有什么区别?
面向对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法进行处理。

面向过程是一种以事件为中心的开发方法,就是自顶向下顺序执行,逐步求精,其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构,各模块关系比较简单,相对比较独立,其模块化实现的具体方法是使用子程序。

2、面向对象的基本特征有哪些?
(1)封装:类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息屏蔽
(2)继承:不需要重新编写原来的类,就可以使用现有类的所有功能,它的目的是为了进行代码复用和支持多态,继承的过程就是从一般到特殊(具体)的过程
(3)多态:它主要体现在类的继承体系中,就是允许将子类类型的指针赋值给父类类型的指针,声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法

3、深拷贝和浅拷贝
如果一个类拥有资源(堆或者其他系统资源),当这个类的对象发生复制过程时,资源重新分配,这个过程就是深拷贝;反之对象存在资源,但复制过程并未复制资源的情况称为浅拷贝。浅拷贝资源后,在释放资源时会产生资源归属不清的情况,导致程序运行错误。

4、友元
友元一般定义在类的外部,但它需要在类的体内说明,在说明前加上关键字friend。在类外实现是不用加friend和”::“,因为友元函数不是类的成员函数,但是它可以访问类中的私有成员,友元的作用在于提高程序的运行效率,但是它破坏了类的封装性和隐藏性。友元函数与成员函数最大的区别在于成员函数可以是虚的,而非成员函数不行,友元函数是可以访问类所有成员的非成员函数。

友元也可以是一个类,称为友元类。

5、复制构造函数与赋值运算符的区别?
(1)复制构造函数生成新的对象,而赋值运算符不能
(2)由于复制构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象与新建对象是否相同,而赋值运算符需要这个操作,另外赋值运算中如果原来的对象中有内存分配,要先把内存释放掉
(3)当类中有指针类型的成员变量时,一定要重写复制构造函数和赋值运算符,不能使用默认的

简单来说,当进行一个类的实例初始化时,也就是构造时,调用的是构造函数,如果用其他实例来初始化,则调用复制构造函数,非初始化时对这个实例进行赋值调用的是赋值运算符

Ctest(const Ctest& t)//复制构造函数不指定返回类型,只有一个对某对象引用的参数{    this->number=t.number;}Ctest& operator=(const Ctest& t)//赋值运算符{      this->number=t.number;      return *this;}

6、基类的构造函数/析构函数是否能被派生类继承?
不能!
基类的构造函数不能被派生类继承,派生类中需要声明自己的构造函数。声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,需要调用基类构造函数完成。
基类的析构函数也不能被派生类继承,派生类需要自行声明析构函数,不需要显示调用基类的析构函数,系统会自动隐式调用。

7、初始化列表与构造函数初始化的区别是什么?

//初始化列表一般如下:Object::Object(int _x,int _y):x(_x),y(_y){}//构造函数初始化如下:Object::Object(int _x,int _y){      x=_x;      y=_y;}

对于内置类型的成员,使用成员初始化列表和构造函数体内进行,性能和结果都是一样的。但是对于非内置类型成员变量,因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用赋值操作符才能完成(如果没提供,编译器使用默认成员赋值行为)。为了避免两次构造,推荐使用类构造函数初始化列表。
在有些情况下,如const成员或引用类型的成员,只能初始化而不能对其赋值,所以只能使用初始化列表进行构造。

8、类的成员变量的初始化顺序
在C++中,类的成员变量的初始化顺序与变量在内存中的次序有关,而内存中的次序根据变量在类中声明的顺序有关,与在构造函数中的初始化列表的顺序无关,而且静态成员变量先于实例变量,父类成员变量先于子类成员变量,父类构造函数先于子类构造函数。

从全局看,变量的初始化顺序如下:
(1)基类的静态变量或全局变量
(2)派生类的静态变量或全局变量
(3)基类的成员变量
(4)派生类的成员变量

当一个类为另一个类的成员变量时,只能用成员初始化列表进行初始化。

9、C++中的空类默认产生哪些成员函数?
C++中的空类默认会产生以下六个函数:默认构造函数、复制构造函数、析构函数、赋值运算符重载函数、取址运算符重载函数、const取址运算符重载函数。

10、C++提供默认参数的函数

void delay(int loops=1000);//函数声明void delay(int loops)      //函数定义{    if(loops==0)          return;    for(int i=0;i<loops;i++)    ;}

允许函数使用默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。
默认参数是在函数声明中提供,当有声明又有定义时,定义中不允许默认参数。如果函数只有定义,则默认参数才可以出现在函数定义中。默认值不可以是局部变量,默认参数的函数调用是在编译时确定的。

11、C++中哪些情况只能用初始化列表而不能赋值?
在C++中,赋值是删除原值,赋予新值,初始化列表是开辟空间和初始化同时完成,直接给予一个值。
只能用初始化列表而不能用赋值的情况一般有三种:
(1)当类中有const(常量)、reference(引用)成员变量时
(2)基类的构造函数都需要列表初始化。构造函数的意思是先开辟空间然后为其赋值,只能为其赋值不能算是初始化
(3)成员类型是没有构造函数的类,要提供显示初始化列表进行初始化

1 0