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;

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

  

原文地址:https://www.cnblogs.com/qiny1012/p/9420130.html