• C++&C面试题100道分析(41-60)


    41.c++中结构体和类可以使用malloc来动态分配内存吗?

      不可以,在c++中,结构体和类都必须使用new来建立对象.malloc必须注明申请的空间大小是一个函数,new则不需要,而且它是一个运算符,不但申请了空间,还执行了初始化.

    42.那些情况算什么函数重载?

      1.参数不同

      2.参数类型不同

      3.参数顺序不同

      注意:参数的返回值不同并不会产生重载,只会产生错误.

    43.c++中在一个类中声明一个成员变量为static ,有什么用?

      在 C++ 类的成员变量被声明为 static(称为静态成员变量)意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,也就是说不管创建多少对象, static修饰的变量只占有一块内存。其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。修饰的变量只占有一块内存。其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。 static是加了访问控制的全局变量,不被继承 。

    44.C++中为什么用模板类。

      1.提高代码的利用率

      2.编译的时候不进行类型检查增加了类型的安全性.

      

    45.函数模板和类模板有什么区别

      函数模板是由编译器在处理函数调用时候决定的,类模板是由程序员实例时决定的.

    46.介绍一下 STL ,详细说明 STL 如何实现vector?

      STL是标准模板库,里面包括了常用的容器和算法(vector,map.list,queue,stact)

      vector实际上就是一个动态数组,他可以随着数据的增加自增自己的大小.

    47.介绍一下模板和容器。如何实现?

      模板是实现代码重用的一种重要的工具.常说的泛型编程就是借助模板来编写的.

      容器是c++ STL中的类,定义了一些常用的数据结构,顺序表(vector),链表(list),duilie(queue)等.

    48.请你谈谈你在类中如何使用 const 的?

      1.const修饰变量说明这个是一个常变量.

      2.和宏定义的区别:宏定义是全局的,const可以是局部的变量

      3.修饰函数参数,如果函数的参数列表中含有const,说明这个参数的值不会改变

      4.修饰类中的成员函数,说明这个函数不会改变类中其他成员的值.

    49.所有的运算符都可以重载吗?

      不可以,有一些运算符是不可以重载的. 

      例如.?: :: . 等

      

    50.基类的析构函数不是虚函数,会带来什么问题?

      子类的成员所占用的内存可能无法释放.

     

    51.不使用if,?:switch,写一个函数判断a和b哪一个大的语句段

      (a+b + abs(a-b) ) / 2

    52.不使用第三个变量,交换整数a和b的值?

      a = a + b;

      b = a - b;

      a = a - b ;

    53.如何打印源程序文件名和源程序的行号?

      c++和c语言中有很多系统的宏定义,这些宏定义大多数以_开头,_结尾.

      打印源文件名的句子是_FILE_

      打印行号的句子是_LINE_

      编译日期是_DATA_

      当前的编译时间_TIME

      c++中特有的_cplusplus

    54.写出运行结果: :

    {// test1
      char str[] = "world"; cout << sizeof(str) << ": ";
      char *p = str; cout << sizeof(p) << ": ";
      char i = 10; cout << sizeof(i) << ": ";
      void *pp = malloc(10); cout << sizeof(p) << endl;
    }

     第一个显示的是字符串的长度,为6;

    第二个显示的指针的长度,为4,

    第三个是字符的长度,为1

    第四个是指针的长度为4

    55.代码:cout << (i+++b) <<endl;int i = 5, b = 7;cout << (i+++b) <<endl;

    不用调试,请说出,以上代码在 gcc编译过后的执行结果!

      首先,+++是由+和++两个符号组成的,

      其中++是单目运算符,优先级顺序排在第二位,结合顺序是从右向左.

      其中+是双目运算符,优先级顺序排在第第四位,结合顺序是从左到右.

      所以先计算i++,然后计算i+b ,答案为12.

    56.c++中什么是左值什么是右值

      这是c语言中继承而来的定义,简单的理解,左值就是可以放在赋值语句左边的也可以在右边,右值是只可以在赋值语句的右边

      然而并不是所有的左值一直都可以放在左边的,例如常变量,一次初始化之后,就不可以放在左边.

      也可以分类使用是否可以取地址来区分左右值,如果可以使用&的说明是左值,如果不可以使用&的说明是右值.

    57. 写出一个可以作为左值的函数?

      如果返回值具有引用的情况就可以作为左值

      int & max(int  &x,int &) ; 就可以作为左值.

    58.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正 :

    int add_n(int n)
    {
    static int i=100;
    i+=n;
    return i;
    }

    其中:static是静态变量,生命周期程序的结束,所以i的值并不是一直都是100,可能和之前的状态有关系.

     

    59.以下三条输出语句分别输出什么?

    char str1[] = "abc";
    char str2[] = "abc";
    const char str3[] = "abc";
    const char str4[] = "abc";
    const char* str5 = "abc";
    const char* str6 = "abc";
    cout << boolalpha << ( str1==str2 ) << endl; //
    char str1[] = "abc";
    char str2[] = "abc";
    const char str3[] = "abc";
    const char str4[] = "abc";
    const char* str5 = "abc";
    const char* str6 = "abc";
    cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
    cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
    cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?

     

    首先需要知道c++中对于字符串等于的含义?比较首地址的位置.

    第一条,不同的数组的首地址的位置是不一样的.

    第二条,常变量也是数组,地址也是不一样的.

    第三条.两个指针都指向的是常数,所以地址是一样的.  

    60.以下代码有什么问题?

      cout << (true?1:"1") << endl;

      ?:三目运算符需要格式一致,所以会有错误,如果不一致会被强制转换成第一种的类型.

      

  • 相关阅读:
    Java 泛型约束
    Java 单例模式
    Java中的Atomic包使用指南
    基数排序
    归并排序
    插入排序
    选择排序
    交换排序
    Java多线程 LockSupport
    Java并发控制:ReentrantLock Condition使用详解
  • 原文地址:https://www.cnblogs.com/qiny1012/p/9420130.html
Copyright © 2020-2023  润新知