c++ 笔试面试题 难题精选 持续更新

//第一题   问下面的输出结果是 什么?
#include <stdio.h>
#include <iostream>
using namespace std;

class A
{
protected:
	int m_data;
public:
	A(int data = 0)
	{
		m_data = data;
	}
	int GetData()
	{
		return doGetData();
	}
	virtual int doGetData()
	{
		return m_data;
	}
};

class B: public A
{
protected : int m_data;
public: 
	B(int data = 1)
	{
		m_data  =  data;
	}
	int doGetData()
	{
		return m_data;
	}

};

class C : public B
{
protected :  int m_data;
public :
	C(int data = 2)
	{
		m_data = data;
	}
};
int main()
{
	C c(10);
	cout<<c.GetData() << endl;
	cout<<c.A::GetData()<<endl;
	cout<<c.B::GetData()<<endl;
	cout<<c.C::GetData()<<endl;

	cout<<c.doGetData()<<endl;
	cout<<c.A::doGetData()<<endl;
	cout<<c.B::doGetData()<<endl;
	cout<<c.C::doGetData()<<endl;
	
	return 0;
}             <span style="white-space:pre">																																																										</span><span style="font-family: Arial, Helvetica, sans-serif;">答:   </span><span style="font-family: Arial, Helvetica, sans-serif;">为   1   1   1   1  1  0  1  1  具体请参看程序员面试宝典 P134</span>



第二题  :

#include <stdio.h>
#include <iostream>
using namespace std;

class A
{
protected:
	int m_data;
public:
	A(int data = 0)
	{
		m_data = data;
	}
	int GetData()
	{
		return doGetData();
	}
	 int doGetData()
	{
		return m_data;
	}
};

class B: public A
{
protected : int m_data;
public: 
	B(int data = 1)
	{
		m_data  =  data;
	}
	int doGetData()
	{
		return m_data;
	}

};

class C : public B
{
protected :  int m_data;
public :
	C(int data = 2)
	{
		m_data = data;
	}
};
int main()
{
	C c(10);
	cout<<c.GetData() << endl;
	cout<<c.A::GetData()<<endl;
	cout<<c.B::GetData()<<endl;
	cout<<c.C::GetData()<<endl;

	cout<<c.doGetData()<<endl;
	cout<<c.A::doGetData()<<endl;
	cout<<c.B::doGetData()<<endl;
	cout<<c.C::doGetData()<<endl;
	//cout << A::doGetData()<<endl;  这种调用方式是错的
	return 0;
}

/*
结果为  0 0 0 0 1 0 1 1
*/

#include <stdio.h>
#include <iostream>
using namespace std;

class A
{
public:
	 static void doGetData()
	 {
		 printf("A");
	 }
};

class B: public A
{
public:
 void doGetData()
 {
     printf("B");
 }

};

  
int main()
{
    B  b ;
	b.doGetData();
	b.A::doGetData();
 
	return 0;
}

/*
结果为  B A
*/

第三题   请介绍回调函数  并说出其某个应用场景

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

#include<stdio.h>

typedef int (*CallBackFun)(char *p); 

int Afun(char *p) 
{      
    printf("Afun 回调打印出字符%s!\n", p);
    return 0;
}

int Cfun(char *p)
 {    
    printf("Cfun 回调打印:%s, Nice to meet you!\n", p);
    return 0;
}

 
int call(char *p, int (*ptr)(char *)) // 执行回调函数  ptr就是回调函数
{ 
    printf("==============\n", p); 
    (*ptr)(p); 
	return 0;
}
 
int main() 
{    
    char *p = "hello";
    call(p, Afun);
    call(p, Cfun);
    return 0;
}
应用场景:
STL中的一个算法 sort排序中就存在一个回调函数    window api  OnTime的使用也需要一个回调函数


#include<iostream>
#include<algorithm>
using namespace std;

bool myFun(const int &a, const int&b)
{
	return a<b;
}
 
int main() 
{  
   int a[10] = {4, 3, 54, 23, 45, 23, 65, 34, 55, 55};
   sort(a, a+10, myFun);// myFun就是回调函数
   for(int i = 0; i < 10; i++)
	   printf("%d ", a[i] );
    return 0;
}


第四题   介绍   try{}catch{}finally{}机制

try 
{ 
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 
} 
catch 
{ 
//除非try里面执行代码发生了异常,否则这里的代码不会执行 
} 
finally 
{ 
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally 
} 

第五题  常用的几种进程通信方式     介绍共享内存方式


管道  有名管道  消息队列   信号  信号量   套接字  共享内存

共享内存的介绍


<1>共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。

<2> 为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。

<3>由于多个进程共享一段内存,因此也需要依靠某种同步机制。

共享内存的操作流程

<1>创建/打开共享内存
<2>映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
<3>撤销共享内存映射
<4>删除共享内存对象

第六题  互斥量和信号量的区别

1. 互斥量用于线程的互斥,信号量用于线程的同步。

这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

2. 互斥量值只能为0/1,信号量值可以为非负整数。

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。



第七题        小题 

1. const char *p = "Hello World";
char p[] = "Hello World";
分别求长度和所占用空间大小,有啥区别?
提示:求长度都可以用strlen(p),求占内存空间大小第一个不能用sizeof,第二个可以用sizeof
另外:第二个:strlen(p) = 11, sizeof(p) = 12



你可能感兴趣的:(c++ 笔试面试题 难题精选 持续更新)