您的位置:首页 > 编程语言 > C语言/C++

C++面试题

2016-06-26 15:39 381 查看
1、引用和指针的区别

  1)引用被创建的时候需要初始化,指针可以等到任何时候再初始化

  2)引用不能指向NULL,指针可以指向NULL

  3) 引用被初始化后,不能再绑定到其它对象,而指针初始化后,可以改变他指向的对象

  对于第3条的理解:

          int m=90;

          int &n=m;

          int b=99;

          n=b;

          b=999;

          cout<<n<<endl;//结果是99而不是999,因为引用n第二次并没有绑定到b上

 2、面向对象的特征

  封装、继承、多态

  封装:增强安全性和简化编程,使用者不需要了解具体的实现细节,而只要通过外部借口和特定的访问权限来使用类的成员

  继承:可以使用现有类的所有功能,继承可以使一个对象直接使用另外一个对象的属性和方法

  多态:使得能够利用基类指针指向不同类的对象,根据所引用对象的不同,以不同方式执行相同的操作

 3、C++三种继承方式

  public继承:基类成员保持自己的访问权限,public在子类中仍是public,proctected在子类仍是protected,基类private成员在子类中不可见

  protect继承:基类成员中的public和protected成员都变成protected成员,基类private成员在子类中不可见

  private继承:基类成员中的public和protected成员都变成private,基类private成员在子类中不可见

 4、class和struct的区别

  class默认是private,struct默认是public

5、多态

  多态简单描述:一个接口,多种实现

  主要作用:提高程序的可复用性,精简了代码的编写量

 6、重载,覆盖(重写),隐藏

   比较好的解释来源:http://blog.csdn.net/kendiv/article/details/675940

   重载:相同的函数名,不同的参数类型(不同的参数类型,不同的参数个数,不同的参数顺序【参数类型必须不一样】),不能呢个通过访问权限,返回类型,抛出异常进行重载

   覆盖(重写):基类有virtual关键字,派生类和基类的函数名相同,参数类型相同,返回类型也要一样

   隐藏:a)如果派生类和基类的函数名和参数类型都相同,但是基类没有virtual关键字,此时基类的函数被隐藏 b)如果派生类的函数和基类的函数函数名相同,但是参数类型不同,此时不论    

    基类是否有virtual 关键字,基类的函数都被隐藏。========对于隐藏的另外理解就是,除了函数名相同,不满足覆盖的条件就是隐藏。

  7、复制构造函数和赋值运算符

    复制构造函数 A(const A &a)

    赋值运算符 A& operator=(const A& a)

    赋值运算函数的编写需要注意的事项:a)是否把返回类型声明为该类型的引用,如果返回类型是void就不能连续赋值,如str1=str2=str3,在函数的末尾返回*this

    b)是否把传入的参数声明为常量引用,如果传入的参数不是引用而是实例,会调用一次复制构造函数,这样做是为了提高代码效率。同时为了不改变传入的实例的状态,加上const关键字

    c)是否释放已有的内存,如果没有释放已有的内存,将会造成内存泄漏

    d)是否判断传入的参数和实例的*this是同一个实例,如果不判断,释放自身内存后,传入参数的内存也就被释放掉了,就找不到赋值的内容

    CMyString& CMyString::operator=(const CMyString &str)

  {

    if(this==&str)

    return *this;

    delete []m_pData;

    m_pData=NULL;

    m_pData=new char[strlen(str.m_pData)+1];

    strcpy(m_pData,str.m_pData)

    return *this;

  } 

  但是如果new失败,分配内存失败,上面代码没有处理,来看下面的代码

CMyString& CMyString::operator=(const CMyString &str)

  {

    if(this!=&str)

  {

   CMyString strTemp(str);

     char *pTemp=strTemp.m_pData;

     strTemp.m_pData=m_pData;

    m_pData=pTemp;

  }

    return *this;

  }

   定义了一个局部变量strTemp,然后将原来的内存和新定义的局部变量strTemp交换,这样出了if的时候,将会自动调用strTemp的析构函数,也就将以前的内存释放掉了

  复制构造函数的调用时期: 1)用一个已有的对象初始化新对象的时候 A(object B), 2)当对象以值传递的方式传入到函数中 3)当变量以值的方式从函数中返回

B b1(b2)和B b1=b2是一样的,也就是声明变量的时候,调用的是复制构造函数,而赋值运算符是两个对象都存在的时候=才调用赋值运算符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: