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()
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了这几个函数的类,都可以用于这种用途。 因为这是一个招聘题,我认为他想考的是对设计模式的认识, |