C++&C面试题100道分析(61-80)

Posted qiny1012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++&C面试题100道分析(61-80)相关的知识,希望对你有一定的参考价值。

61.字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?

  指针变量占有的空间是固定的,他和计算机操作系统的位数有关系。

 

62.构造函数可否是虚函数,为什么?析构函数呢,可否是纯虚的呢?

  构造函数不可以是虚函数,构造函数的作用是申请内存空间,实例化类成为对象的,而虚函数存储在虚函数表中,构造函数执行的时候还没有空间,也没有虚函数表。

  析构函数可以是虚函数。

 

63.C++的空类,默认产生哪些类成员函数?(c++类中默认的一些方法)

class Empty
{
public:
Empty(); // 缺省构造函数
Empty ( const Empty& ) ; // 拷贝构造函数
~Empty(); // 虚构函数
Empty& operator(const Empty& ) // 赋值运算符
Empty& operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
}

//缺省构造函数,缺省拷贝构造函数,缺省析构函数,对符号 = , &  , * 的重载。

 

64.拷贝构造函数相关问题,深拷贝,浅拷贝等

  拷贝构造分为浅拷贝和深拷贝,

  所谓的浅拷贝就是仅仅拷贝地址,而不拷贝地址指向的内容。浅拷贝可能会在结束的时候对对象的空间二次释放。

  深拷贝就是拷贝地址指向的内容而不是简单的拷贝地址。

 

65.下面的代码是否有问题?

unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];

  数组的长度必须在编译时期就确定,常变量可以初始化

  第二个str2并没有确定长度,所以无法是错误的。

 

66.c++中那些函数不可以被声明成为虚函数?

  1.普通函数,虚函数是类中的函数,普通函数不可以被声明。

  2.构造函数,构造函数不能通过虚函数表来调用,他运行在虚函数表产生之前。

  3.静态函数,静态函数不可以被继承

  4.友元函数,

 

67.当一个类 A 中没有生命任何成员变量与成员函数, 这时 sizeof(A)的值是多少,请解释一下编译器为什么没有让它为零。

  为1;

  需要区分不同的对象,需要设置虚函数指针。

 

68.以下代码中的输出语句输出0 0 吗,为什么?

struct CLS{
int m_i;
CLS( int i ) : m_i(i) {}
CLS() {
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;

不会,考察初始化表的执行。

如果在默认构造函数中调用构造函数,只会执行函数体,而不会执行初始化表达式不会执行。

只有在类实例成对象的时候才会执行初始化表达式。

 

69.What are the values of a, b, and c after thefollowing instructions:

int a=5, b=7, c;
c = a+++b;

++的优先级高,而且执行的顺序是从右向左,所以先读取的是++,然后在执行++;

b = 7 , c = 12 , a = 6;

 

70.在排序方法中,关键码比较次数与记录地初始排列无关的是()

A. Shell 排序 B. 归并排序
C. 直接插入排序 D. 选择排序

D,

希尔排序:选择位置是4,2,1的余数的排列。

归并排序:8 , 4  ,2  , 1 ,逐渐的排序。

直接插入,从后面开始,向前移动,把数据插入到有序的队列中

选择排序,c++STL中algorithm中有sort可以对vector,string,dequeu

 

71.代码 void func()

{
static int val;

}
void func()
{
static int val;

} 中,变量 val 的内存地址位于:
A. 已初始化数据段 B. 未初始化数据段
C.堆 堆 D.栈

答案:A,static修饰的变量,会被初始化,所以应该放在已经初始化的数据段。

  数据段中还会存放全局变量

 

 72.

class A {
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};

上面的代码有什么问题?

P指向的是this也就是对象自己,delet会调用自己的析构函数,这样就会无限的循环下去。

 

73.写出判断 ABCD 四个表达式的是否正确, 若正确, 写出经过表达式中  a 的值。

int a = 4;
(A)a += (a++);    (B) a += (++a) ;
(C)(a++) += a;    (D) (++a) += (a++);

A  a = a + a ;    a ++    a = 9

B a++ a = a+ a  a = 10;

C,左侧没有可以赋值的变量

D a = 11

 

74.请你谈谈你是如何使用 return语句的。

  return表明一个函数体的结束,一些内存的释放。

  return返回值的类型,有指针,引用,普通变量。

  也要考虑效率

 

75.return String(s1 + s2); 和②String temp(s1 +s2);return temp;String temp(s1 +s2);return temp; 一样吗?

  不一样,第一条语句是返回了一个临时的变量。

  第二条语句是创建了一个局部变量,在函数结束的时候,这个局部变量还会被销毁。

  第一条语句建立的临时变量会不需要被销毁。

 

76.下列代码执行的结果,理由?

inline void max_out( int val1, int val2 ) {
cout << ( val1 > val2 ) ? val1 : val2;
}
int main() {
int ix = 10, jx = 20;
cout << "The larger of " << ix;
cout << ", " << jx << " is ";
max_out( ix, jx );
cout << endl;
}

  执行的结果是 The larger of 10, 20 is 0;

  此处在cout语句中使用了三目运算符(条件选择运算符),<< 的优先级比 ?: 的优先级要高,所以返回的是比较的结果。

 

77.下列语句算重载还是重复声明

int max( int *ia, int sz );
int max( int *, int = 10 );

他们的区别是一个具有默认参数,一个没有默认参数。

因为只有缺省时他们的参数列表才不一样,所以他们不是重载,而是重复声明了。

 

78.请编写一个 C 函数,该函数给出一个字节中被置1 的位的个数。

  

int count(char tmp)
{
	int count = 0;
	for(int i = 0 ; i < 8 ; i ++)
	{
		char ret = tmp & 0x01;
		tmp = tmp >> 1;
		if(ret)
		{
			count ++;
		}	
	} 
	return count;
}

  

79.编程题

//编写一个函数,函数接收一个字符串, , 是由十六进制数组成的一组字符串, ,函
//数的功能是把接到的这组字符串转换成十进制数字函数的功能是把接到的这组字
//符串转换成十进制数字. . 并将十进制数字返回。

int mun(int len)
{
    int tmp = 1;
    for(int i = 0 ; i < len;i++)
    {
        tmp *= 16;
    }
    return tmp;
}

int HToD(string tmp)
{
    //分割
    int length = tmp.length();
    int sum = 0;
    for(int i = 0 ; i < length; i++)
    {
        int tmp1 ;
        if(tmp[i] > 96)
        {
            tmp1 = tmp[i] - 87;
        }
        else if(tmp[i] > 64)
        {
            tmp1 = tmp[i] - 55;
        }
        else
        {
            tmp1 = tmp[i] - 48;
        }
        
        sum += mun(length-i-1)    * tmp1;
    } 
    return sum;
} 

 

80.输入一个字符串,将其逆序后输出 。

string reserve(string tmp)
{
    int length = tmp.length();
    for(int i = 0 ; i < length /2; i++)
    {
        char excharge;
        excharge = tmp[i];
        tmp[i] = tmp[length - i -1 ];
        tmp[length - i - 1] = excharge;
    }        
    return tmp;
} 

 

 

 






















































以上是关于C++&C面试题100道分析(61-80)的主要内容,如果未能解决你的问题,请参考以下文章

Java面试题收集以及参考答案(100道)

100道Java面试题收集整理及参考答案

100道Java基础面试题

剖析Linux内核100道面试题及内存屏障

100道Java基础面试题收集整理(附答案)

华为C语言面试题求解?