#include<iostream>
using namespace std;
class IP
{
private:
union //由此匿名联合体可以看出,IP地址共占4个字节
{
struct //这是一个由4个字节构成的匿名结构体
{
unsigned char seg0;
unsigned char seg1;
unsigned char seg2;
unsigned char seg3;
}; //4字节的IP地址可以看作4部分,每部分1字节
//unsigned char seg[4];//等于上面四个成员的结构体
unsigned int address; //4字节的IP地址可以看成一个4字节的整体
};
public:
IP(int=0,int=0,int=0,int=0); //构造函数
void showIP(); //用四段法显示IP地址
bool sameSubnet(const IP &ip, const IP &mark); //判断是否处于同一子网
char whatKind(); //返回属于哪一类网络
};
IP::IP(int s0,int s1,int s2,int s3)
{
seg0=s0;
//seg[0]=s0;//下面都一样
seg1=s1;
seg2=s2;
seg3=s3;
}
void IP::showIP()//四段:分成四部分。
{
cout<<int(seg0)<<'.'<<int(seg1)<<'.'<<int(seg2)<<'.'<<int(seg3)<<endl;
//第一次直接写出来是一些问号,因为前面忘记了强制转换类型了,IP地址是数字。
}
char IP::whatKind()
{
if(seg0<=127)
return 'A';
//cout<<'A类'<<endl;//搜了搜百度,得出各类网的范围。
else if(seg0<=191)
return 'B';
//cout<<'B类'<<endl;
else if(seg0<=223)
return 'C';
//cout<<'C类'<<endl;
else if(seg0<=239)
return 'D';
//cout<<'D类'<<endl;
else
return 'E';
//cout<<'E类'<<endl;//开始第一次将这个函数的类型写成了void,所以想着直接在函数类部直接打印出来,改成了char才设定返回值。
}
bool IP::sameSubnet(const IP &ip, const IP &mark)
{
unsigned int i1,i2;
i1=address&mark.address;
i2=ip.address&mark.address;//刚开始打算把四个字节一个一个的&,但是写了好一会儿,但还是没写对,才想到联合体共用一段存储空间,并且以体积最大的成员作为联合体的大小。
// cout<<i1<<','<<i2<<endl;
// cout<<true<<','<<false<<endl;
// cout<<(i1==i2)<<endl;//检测为什么答案不一样。
// if(i1==12)
// return true;
// else
// return false;//改成这样的话,答案就和最终的不一样了。
return (i1==i2); //可是这样又可以
}
int main()
{
IP ip1(202,194,116,97), ip2(202,194,119,102), mark(255,255,248,0);
cout<<"ip1: ";
ip1.showIP();
cout<<"ip2: ";
ip2.showIP();
if(ip1.sameSubnet(ip2,mark))
cout<<"两个IP在同一子网"<<endl;
else
cout<<"两个IP不在同一子网"<<endl;
cout<<"ip1属于"<<ip1.whatKind()<<"类网络"<<endl;
return 0;
}
心得:知道IP,但是没有涉及这方面的知识,所以比较困难。包括网络的类型也是在百度搜索才知道,戳这里。联合体也是翻书才知道他的一点点基本的概念,都怪自己上课的时候不认真。在暑假的这些天,能这样还是挺满足的,并没把时间拿来睡懒觉。不过这里最开始的模板是老师的,我只是写出函数来实现功能,如果让我自己设出类,并在其中定义出函数的功能,还是有些怕,因为我不知道某些功能的函数类型到底怎么决定,如果这个没弄好,之后的很多的功能要是接不上程序就会崩溃。
但在这里面还是有个问题没有得到解决;return(i1==i2),改成上面的if....else语句结果就不同了。如果用if....else下面的主函数中的if语句里面的ip1.sameSubnet(ip2,mark)的值就为假了,我把里面的true,false,(i1==i2),ip1.sameSubnet(ip2,mark)全部cout出来都检查它的值只是ip1.sameSubnet(ip2,mark)和预想的不一样,其他的发现值并没有错误,就是结果不一样,可是就不知道错在了哪儿。