最近研究emule电驴的代码,觉得有很多地方怪怪的,想请教大家两个不解的地方:
1 在类的定义中把自己类声明为友元类,如:
class CAICHHashTree
{
friend class CAICHHashTree;
...//后面省略
};
不知道这样做有什么用处呢?2 在类的构造函数中,把自己成员的类型强制转换成其他类型的用意又是什么呢?如:
class A
{
CString m_str;
...//省略
A()
{
(void)m_str; //这里的代码又起到什么用呢?
};
}
1 在类的定义中把自己类声明为友元类,如:
class CAICHHashTree
{
friend class CAICHHashTree;
...//后面省略
};
不知道这样做有什么用处呢?2 在类的构造函数中,把自己成员的类型强制转换成其他类型的用意又是什么呢?如:
class A
{
CString m_str;
...//省略
A()
{
(void)m_str; //这里的代码又起到什么用呢?
};
}
class A
{
//friend class A;
private:
int m_iPrivate; //私有成员
protected:
int m_iProtected; //保护成员
public:
int m_iPublic; //公有成员
A(int a=100,int b=200,int c=300):m_iPrivate(a),m_iProtected(b),m_iPublic(c) {}
int GetValue()
{
A aa(1,2,3);
return aa.m_iPrivate+aa.m_iProtected; //访问了同一个类其他对象的私有和保护成员
}
};
结果表明:不管有没有注释掉friend class A;这行代码,VC6下编译都能通过,也都可以得到正确结果,结论是:不必声明自己类为友元类,同一个类的不同对象之间,也可以随意访问其他对象的私有和保护成员。(注:对任何一个对象来说,自己的私有和保护成员,自己还是不能访问的。)
看来为了访问私有和保护成员的说法不完全正确,那这种做法是否另有用意呢,等待楼下其他朋友的看法!
2: 造成没没m_str被使用的假象,有时可以减少一些警告
看了一部分电驴的代码后,感觉编码风格也不怎样,有些对象的命名不规范不说,类里面还经常直接调用全局变量,这样类的代码在其他工程中重用时,一定会有不少麻烦,虽然人家可能也不打算重用了。菜鸟的一点浅见,请大家指正!