c++面试知识总结


1、对于一个频繁使用的短小函数,在c语言中应用什么实现,在c++中应用什么实现

  答:c:宏定义;c++:inline内联函数

 

2、全局变量和局部变量的区别?

  答:

    1、生命周期不同:

      全局变量:随主程序创建而创建,随主程序结束而销毁。

      局部变量:函数或者{}括号内部,退出或执行完就销毁

    2、作用域不同:

      全局变量:源文件内所有函数都可以使用

      局部变量:函数内部或者{}括号内部有效,只能局部使用

    3、内存分配不同:

      全局变量:全局数据段并且在程序运行的时候加载

      局部变量:分配在堆栈里

 

3、在申请内存找不大足够大的内存块,malloc和new将返回NULL指针,内存申请失败,怎么处理内存耗尽?

  答:直接return

 

4、如何判断一个操作系统是16位还是32位系统

  答:

    1、使用变量指针*p,sizeof(p) == 2 为16位,==4 为32位

    2、unsigned int a = ~0; if( a > 65536 ) 为32位,否则 16位

 

5、为什么数组名做参数会改变数组内容?

  答:数组名就是数组的首地址

 

6、析构函数和虚函数的用法和作用?

  答:

    析构函数:是c++特殊的类成员函数,没返回值、没参数、不能调用。在类对象执行完毕,作用是销毁并释放内存。

    虚函数:是c++多态的一种表现,使用虚函数可以动态绑定,当然也会以系统开销为代价的

 

7、引用和指针有什么区别?

  答:

    引用:必须初始化;初始化后不能改变;不存在指向空值

    指针:不必初始化;指针可以改变所指对象;指针可以指向空值

 

8、虚函数只能借助引用或者指针来达到多态的效果。

 

9、在c++中能否有虚构造函数?

  答:不能,只能有虚析构函数。

 

10、重载、重写、重定义的区别?

  答:

    重载:类对象的同名不同参函数

    重写:子类继承父类的函数

    重定义:子类继承父类的虚函数

 

11、i++和++i的效率比较

  答:

    -》内建数据类型的情况,效率一样

    -》自定义数据类型的情况,++i效率高

 

12、理解内联函数和宏的区别

  答:

    -》内联函数在编译时展开,宏在预编译时展开

    -》在编译的时候,内联函数可以直接嵌套到目标代码中,宏只是一个简单的文本替换

    -》内联函数可以完成类型检测、语句检查等功能,宏不具有这样的功能

 

13、引用和指针易错点:

  -》int &c:引用类型的变量必须初始化。

  -》int &d = 2,&d = c:引用类型只能初始化的时候赋值

  -》int *p; *p = 5:*p是野指针,直接赋值很危险

 

14、类的静态成员和静态函数:

  -》静态成员 不能在内部初始化,只能在类定义外面初始化

  -》静态函数,在类外使用,因它不含this指针,所以不能调用类内的非静态成员

 

15、explicit构造函数:作用是防止隐式转换

 

16、赋值构造函数与复制构造函数的区别

    赋值构造函数:引用指针对象

      格式: A& operator = (const A& other)

      clas A;

      A a;

      A b;

      b = a;// 赋值调用

    复制构造函数:复制指针对象;以参数传进来的对象初始化产生一个对象

      格式:A(const A& other):m_i(other.m_i)

      A a;

      A b = a;//复制构造函数调用

 

17、临时对象在什么情况下产山(会影响程序的执行效率)

  -》参数按值传递

    void fun1( Test test);

  -》返回值按值传递

    void fun1( ){

      Test t(2);

      teturn t;

    }

 

  解决办法:改成对象引用传入

    void fun1( Test &test);

 

18、內存申請,使用之前檢查

  -》函數參數:

    assert( p != NULL);

  -》malloc或者new 

    if( p != NULL )

   释放了内存却继续使用它。 
  有三种情况:
  (1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。
  (2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
  (3)使用free或delete释放了内存后,没有将指针设置为null。导致产生“野指针”。
  【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为null。防止使用指针值为null的内存。
  【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
  【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
  【规则4】动态内存的申请与释放必须配对,防止内存泄漏。

  【规则5】用free或delete释放了内存之后,立即将指针设置为null,防止产生“野指针”。

  

  

 

    


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM