• 一些面试题目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了这几个函数的类,都可以用于这种用途。

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



  • 相关阅读:
    合一算法最新版
    string.at(i)
    字符串逆转
    String
    Vector
    1005POJ
    但愿天堂一切都好
    合一算法
    合一算法2
    BTREE与其它索引的优缺点对比
  • 原文地址:https://www.cnblogs.com/dayouluo/p/219275.html
Copyright © 2020-2023  润新知