一些面试题目zz

1。在C++中有没有纯虚构造函数?
2。在c++的一个类中声明一个static成员变量有没有用?
3。在C++的一个类中声明一个静态成员函数有没有用?
4。如何实现一个非阻塞的socket?
5。setsockopt, ioctl都可以对socket的属性进行设置,他们有什么不同?
6。解释一下进程和线程的区别?

7。解释一下多播(组播)和广播的含义?
8。多播采用的协议是什么?
9。在c++中纯虚析构函数的作用是什么?请举例说明。
10。编程,请实现一个c语言中类似atoi的函数功能(输入可能包含非数字和空格)

1。在C++中有没有纯虚构造函数?
2。在c++的一个类中声明一个static成员变量有没有用?
3。在C++的一个类中声明一个静态成员函数有没有用?
4。如何实现一个非阻塞的socket?
5。setsockopt, ioctl都可以对socket的属性进行设置,他们有什么不同?
6。解释一下进程和线程的区别?
7。解释一下多播(组播)和广播的含义?
8。多播采用的协议是什么?
9。在c++中纯虚析构函数的作用是什么?请举例说明。
10。编程,请实现一个c语言中类似atoi的函数功能(输入可能包含非数字和空格)

我的答案

1。在c++中没有不支持虚构造函数,当然也不支持纯虚构造函数。
2。有用,static成员变量不属于某个对象,而属于类。比如一个类中要用圆周率,你可以把它声明为static
3. 有用,可以对static成员变量访问
4。使用setsockopt或ioctl
5. ioctl改变的是系统内核的行为,setsockopt改变的是应用socket的行为(没有找到相应的资料)
6. 一个进程被创建是对父进程所有资源的复制,可独立运行。 线程本身并不复制资源,它与其他线程共享父进程的资源,不能独立运行,如果一个线程出问题会影响其他线程
7。多播是向一个D类地址发送数据如224.1.1.1, 客户端如想接收该数据包,必须利用IGMP协议加入该组,通知路由器。广播是向一个子网段发送数据包,如192.168.3.255,在该段的主机直接可接受到数据,使用的协议随网络的不同而不同
8.多播采用IGMP,网络组管理协议
9. 能释放子类的资源。
10。见楼上

-------------------------------
试着回答:
1。在C++中有没有纯虚构造函数?
9。在c++中纯虚析构函数的作用是什么?请举例说明。
Yarco: 感觉假如是依照OO的想法,纯虚析构函数的存在也未尝不可. 不过昨晚gcc编译未通过说明,c++不支持纯虚构造函数. 因为看到过虚析构函数,所以知道虚析构函数是为了能使子类释放资源.比如在一个函数中:
void use(baseCls* p)
{
delete p;
}
我可以传递一个之向子类实例的指针,然后正常释放它的资源.

2。在c++的一个类中声明一个static成员变量有没有用?
3。在C++的一个类中声明一个静态成员函数有没有用?
Yarco: 有用. 在smalltalk中,它们的概念分别是类变量和类(成员)函数,显然是对整个类负责.有用的地方比如:
统计类/子类的实例化对象个数,获得某个实例化对象(cls& obj = cls::getInst()icon_wink.gif

4。如何实现一个非阻塞的socket?
5。setsockopt, ioctl都可以对socket的属性进行设置,他们有什么不同?
6。解释一下进程和线程的区别?
7。解释一下多播(组播)和广播的含义?
8。多播采用的协议是什么?
Yarco:这部分不属于c++.更象是linux c socket编程.查书查书.不过题目8似乎不够严谨.因为协议本身是一层套一层的.要回答出全部的协议似乎不够理智.

10。编程,请实现一个c语言中类似atoi的函数功能(输入可能包含非数字和空格)
Yarco:写步骤吧.
int atoi(const char*);

//char* p指向字符串首, int total = 0, int flag = 1;
//for循环跳过空格
//判断+/-符号, + 跳过, - 设置flag = -1;
//while判断 *p>='0' && *p<='9'
// 循环 total =  total*10 + *p - '0';
//返回total* flag;





10.
/*10。atoi的实现,把字符串转换为数字*/

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>


int t_atoi(const char *str)
{
   char *s1,*s2,*s3;
   char arr[200];
   int t_int;


   s1 =  (char *)malloc(sizeof(str));
   strcpy(s1 , str);
   s2 = s1;
   s3 = arr;
   printf("s1 = %s\n", s1);
   while(*s1 != '\0')
   {
       if(*s1<48 || *s1>57)
       {
           printf("entry error\n");
           return -1;
       }
       else
       {
           *s3 = *s1;
       }
       s1++;
       s3++;

   }
   free(s2);
   *s3 = '\0';
   sscanf(arr, "%d", &t_int);
   return t_int;
}

int main(int argc, char *argv[])
{
   char s[200];
   int t_i;
   printf("please entry a number:\n");
   scanf("%s", s);
   t_i = t_atoi(s);
   printf("t=%d\n", t_i);
   return 0;
}



--------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int myatoi(const char *s)
{
   int a,b,c;
   int flag;
   char *j;
   a=b=c=0;
   flag=1;
   j=(char *)s;
   if(NULL==s)
      return 0;
   if(*j=='-')
   {
      flag=-1;
      j++;
   }
   while(isdigit(a=*j++))
   {
      b=c;
      a=a-0x30;   
      c=10*b+a;
      if(c<0) //处理溢出,做到行为与atoi一致
         return flag*INT_MAX;
   }
   return flag*c;
}
int main()
{
   char *num="-153.78abc";
   printf("%d %d\n",myatoi(num),atoi(num));
   printf("%d %d\n",myatoi("7788"),atoi("7788"));
   printf("%d %d\n",myatoi("-7788"),atoi("-7788"));
   printf("%d %d\n",myatoi("abcd7788"),atoi("abcd7788"));
   printf("%d %d\n",myatoi("7788abcd"),atoi("7788abcd"));
   printf("%d %d\n",myatoi("9876543210123"),atoi("9876543210123"));
   printf("%d %d\n",myatoi("-9876543210123"),atoi("-9876543210123"));
   printf("%d\n",myatoi(NULL));
   printf("%d\n",INT_MAX);
   int i;
   printf("%d\n",(sscanf(num,"%d",&i),i));
   float t;
   printf("%f\n",(sscanf(num,"%f",&f),f));
   //sscanf这样就可以直接代替atoi,atof了
   return 0;
}

--------------------------------------------------------------------------------------

代码:

虚构造函数(virtual constructor)”?

一种允许你做一些 C++ 不直接支持的事情的用法。

你可能通过虚函数 virtual clone()(对于拷贝构造函数)或虚函数 virtual create()(对于默认构造函数),得到虚构造函数产生的效果。

class Shape {
   public:
  virtual ~Shape() { }                 // 虚析构函数
  virtual void draw() = 0;             // 纯虚函数
  virtual void move() = 0;
  // ...
  virtual Shape* clone()  const = 0;   // 使用拷贝构造函数
  virtual Shape* create() const = 0;   // 使用默认构造函数
};

class Circle : public Shape {
   public:
  Circle* clone()  const { return new Circle(*this); }
  Circle* create() const { return new Circle();      }
  // ...
};

在 clone() 成员函数中,代码 new Circle(*this) 调用 Circle 的拷贝构造函数来复制this的状态到新创建的Circle对象。在 create()成员函数中,代码 new Circle() 调用Circle的默认构造函数。

用户将它们看作“虚构造函数”来使用它们:

void userCode(Shape& s)
{
  Shape* s2 = s.clone();
  Shape* s3 = s.create();
  // ...
  delete s2;    // 在此处,你可能需要虚析构函数
  delete s3;
}

这个函数将正确工作,而不管 Shape 是一个Circle,Square,或是其他种类的 Shape,甚至它们还并不存在。

注意:成员函数Circle's clone()的返回值类型故意与成员函数Shape's clone()的不同。这种特征被称为“协变的返回类型”,该特征最初并不是语言的一部分。如果你的编译器不允许在Circle类中这样声明Circle* clone() const(如,提示“The return type is different”或“The member function's type differs from the base class virtual function by return type alone”),说明你的编译器陈旧了,那么你必须改变返回类型为Shape*。
to redsnow:
这实际上是一种创建型模式。它的目的是为了引入一种‘虚‘的构造函数。

如果shape不存在的话,那么Shape* s2 = s.clone(); 中的clone()就是一个存虚函数呀,这样行吗?

应当注意到,s被定义位Shape&类型,而实际传入的是一个由Shape继承而来的实际类型,在派生类型中clone等方法必然比override。

所谓的“shape不存在”的话,是指任何一个继承自Shape的并override了这几个函数的类,都可以用于这种用途。

因为这是一个招聘题,我认为他想考的是对设计模式的认识,



原文地址:https://www.cnblogs.com/dayouluo/p/219275.html