第一次来CSDN写自己的博客,关于面试的题目,我差不多面试一个月了

1.static 有什么作用?至少写出2种?
答:a.在函数体,一个被申明为static的变量,在函数的调用过程中,维持其值不变;
    b.在模块内(函数体外),一个被申明为static的变量,只能被模块内的函数访问,本地的全局变量
    c.在模块内,一个被申明为static的函数,只能被模块内的成员函数访问,本地范围内使用


这个简单的问题很少有人能回答完全。


2.全局变量与局部变量有什么不同?
全局变量存在静态区,局部变量存在栈上。


3.堆栈溢出一般是由于什么造成的?
未回收垃圾资源


4.一个空类,都包含哪些信息?
答:一个默认构造,一个析构,一个拷贝构造和一个赋值运算符.


5.哪些函数不能为虚函数?


6.请写出内存拷贝函数.


7.请写出 类String 的构造.拷贝构造.赋值函数和析构函数.


8.虚函数与纯虚函数的区别是什么?函数重载与虚函数有什么不同?


9.指针与引用有什么区别?
a.使用使用必须初始化,,指针可以不必;
b.引用的对象不能改变,而指针所指的对象可以改变
c.不存在空值的引用,却有指向空值的指针
d.引用不占内存,


10.在TCP/IP协议中,哪个协议负责将物理地址转化为IP地址?
 答:反地址解析协议(RARP).


11.IP地址分为哪两个部分?
 答:网络号和主机号.


12.请实现strcmp函数.若相等则输出0,否则为-1;


13.#ifndef/define/endif这些语句有何作用?
答:防止头文件重复引用


14.在C++程序中调用被C编译后的函数,为什么要加extern “C”;
答:变量和函数在被C++编译后在符号库里面的名字与C不同,加extern 修饰词是为了让该代码按照C的方式编译和连接,
15.请至少写出一个死循环.
答: while(1){ }
16.do ...while 和 while ..do 的区别.
答:执行一次再判断(至少会执行一次);判断后再执行,


17.请写出冒泡算法的时间复杂度.
O(n^2)
18.用C实现N进制加法运算.(这道题应该从哪里入手?)


19.下面哪些指向的对象可改,哪些指向的内容可改?
 a.  const int *p;(const 修饰的*P <指向的内容>,对象可改)
 b.  int const *p;
 c.  int* const p;(const修饰的是P <指针本身>,内容可改)
 d.  const int* const p;( 常量指针指向一个常量,都不可改?)




下面的声明都是什么意思?


const int a;
int const a;
const int *a;
int * const a;
int const * a const;


/******/
前两个的作用是一样,a是一个常整型数。


第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。


第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。


最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。


如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。
顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?


我也如下的几下理由:
1) 关键字const的作用是为给读你代码的人传达非常有用的信息,
实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。




20.在c++ 类中,静态成员函数如何调用非静态成员
 答:可通过参数传递,然后···


21.什么是平衡二叉树?画出一个二叉树,然后写出先,中,后序遍历···


22.写出一个双向链表,要求该链表存储学生的学号和姓名;可以查找和删除....


23.简述反斜杠在程序当中的用途....请举例说明


24.有这样的代码
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; // 输出什么?
          
这里的boolalpha是什么意思?
分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,
它们的值则是各存储区首地址,不等;str3和str4同上,
只是按const语义,它们所指向的数据区不能修改。
str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,
而它们自己仅是指向该区首地址的指针,相等。
boolalpha  用符号形式表示真假。




25.下面的代码输出是什么,为什么?


void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
}
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。
不管如何,这无符号整型问题的答案是输出是 ">6"。
原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。
这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。
如果你答错了这个问题,你也就到了得不到这份工作的边缘。


26.TCP和UDP网络编程函数和步骤
TCP编程的服务器
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt(); * 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();
4、 开启监听,用函数listen();
5、 接收客户端上来的连接,用函数accept();
6、 收发数据,用函数send()和recv(),者read()和write();
7、 关闭网络连接;
8、 关闭监听;


客户端
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt();* 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、 设置要连接的对方的IP地址和端口等属性;
5、 连接服务器,用函数connect();
6、 收发数据,用函数send()和recv(),或者read()和write();
7、 关闭网络连接;


UDP编程的服务器
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt();* 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind()
4、 循环接收数据,用函数recvfrom();
5、 关闭网络连接;
客户端
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt();* 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、 设置对方的IP地址和端口等属性;
5、 发送数据,用函数sendto();
6、 关闭网络连接;


27.进程间的通信方式
# 管道
# 有名管道
# 信号量
# 消息队列
# 共享内存
# 套接字
线程间的通信方式
# 锁机制:包括互斥锁、条件变量、读写锁
# 信号量机制
# 信号机制


28.将“引用”作为函数参数有哪些特点?
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,
所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,
需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,
还将调用拷贝构造函数。因此,当参数传递的数据较大时,
用引用比用一般变量传递参数的效率和所占空间都好。
(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,
且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;
另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。




29.“引用”与指针的区别是什么?
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。
程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名
,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和pointer的区别。


30..面关于“联合”的题目的输出?
a)
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;


void main()
{
a.x[0] = 10; 
a.x[1] = 1;
printf("%d",a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)


31.struct 和 class 的区别?
struct 的成员默认是公有的,而类的成员默认是私有的


32.分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句
BOOL :    if ( !a ) or if(a)
int :     if ( a == 0)
float :   const EXPRESSION EXP = 0.000001
          if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)


33.编写一个标准strcpy函数


char * strcpy( char *strDest, const char *strSrc )
  {
  assert( (strDest != NULL) &&(strSrc != NULL) ); 
  char *address = strDest;
  while( (*strDest++ = * strSrc++) != ‘\0’ );
  return address;
  }


34.String 的具体实现
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};


尝试写出类的成员函数实现。


答案:
String::String(const char *str)
{
if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断
{
m_data = new char[1] ;
m_data[0] = '\0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}





String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}


String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data; //删除原来的数据,新开一块内存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}




String::~String()
{
delete []m_data ;
}


35. 现要求你用C++代码写一个及格分数线系统,要求如下
1)学生的及格成绩数目是总人数的60%;
2)若学生全部成绩高于60分,那么及格线定于60分;
3)及格线是10的倍数;
4)使用面向对象的语言,使语言具有可扩展性,高效性;
这个问题的答案,自己去想咯;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值