中易网

c类中的外部接口怎样定义

答案:2  悬赏:70  
解决时间 2021-10-17 00:38
c类中的外部接口怎样定义
最佳答案
请认真阅读,如果有不懂,请先将我选我最佳答案后,用IASK给我发邮件,或用UC加我。



我如何定义一个类内部(in-class)的常量?





如果你需要一个通过常量表达式来定义的常量,例如数组的范围,你有两种选择:





class X {



static const int c1 = 7;



enum { c2 = 19 };





char v1[c1];



char v2[c2];





// ...



};





乍看起来,c1的声明要更加清晰,但是要注意的是,使用这种类内部的初始化语法的时候,常量必须是被一个常量表达式初始化的整型或枚举类型,而且必须是static和const形式。这是很严重的限制:





class Y {



const int c3 = 7; // 错误:不是static



static int c4 = 7; // 错误:不是const



static const float c5 = 7; // 错误:不是整型



};





我倾向使用枚举的方式,因为它更加方便,而且不会诱使我去使用不规范的类内初始化语法。





那么,为什么会存在这种不方便的限制呢?一般来说,类在一个头文件中被声明,而头文件被包含到许多互相调用的单元去。但是,为了避免复杂的编译器规则,C++要求每一个对象只有一个单独的定义。如果C++允许在类内部定义一个和对象一样占据内存的实体的话,这种规则就被破坏了。对于C++在这个设计上的权衡,请参见《C++语言的设计和演变》。





如果你不需要用常量表达式来初始化它,那么可以获得更大的弹性:





class Z {



static char* p; // 在定义中初始化



const int i; // 在构造函数中初始化



public:



Z(int ii) :i(ii) { }



};





char* Z::p = "hello, there";





你可以获取一个static成员的地址,当且仅当它有一个类外部的定义的时候:





class AE {



// ...



public:



static const int c6 = 7;



static const int c7 = 31;



};





const int AE::c7; // 定义





int f()



{



const int* p1 = &AE::c6; // 错误:c6没有左值



const int* p2 = &AE::c7; // ok



// ...



}





为什么delete不会将操作数置0?





考虑一下:





delete p;



// ...



delete p;





如果在...部分没有涉及到p的话,那么第二个“delete p;”将是一个严重的错误,因为C++的实现(译注:原文为a C++ implementation,当指VC++这样的实现了C++标准的具体工具)不能有效地防止这一点(除非通过非正式的预防手段)。既然delete 0从定义上来说是无害的,那么一个简单的解决方案就是,不管在什么地方执行了“delete p;”,随后都执行“p=0;”。但是,C++并不能保证这一点。





一个原因是,delete的操作数并不需要一个左值(lvalue)。考虑一下:





delete p+1;



delete f(x);





在这里,被执行的delete并没有拥有一个可以被赋予0的指针。这些例子可能很少见,但它们的确指出了,为什么保证“任何指向被删除对象的指针都为0”是不可能的。绕过这条“规则”的一个简单的方法是,有两个指针指向同一个对象:





T* p = new T;



T* q = p;



delete p;



delete q; // 糟糕!





C++显式地允许delete操作将操作数左值置0,而且我曾经希望C++的实现能够做到这一点,但这种思想看来并没有在C++的实现中变得流行。





如果你认为指针置0很重要,考虑使用一个销毁的函数:





template<class T> inline void destroy(T*& p) { delete p; p = 0; }





考虑一下,这也是为什么需要依靠标准库的容器、句柄等等,来将对new和delete的显式调用降到最低限度的另一个原因。





注意,通过引用来传递指针(以允许指针被置0)有一个额外的好处,能防止destroy()在右值上(rvalue)被调用:





int* f();



int* p;



// ...



destroy(f()); // 错误:应该使用一个非常量(non-const)的引用传递右值



destroy(p+1); // 错误:应该使用一个非常量(non-const)的引用传递右值
全部回答
为了提高硬盘速度几大硬盘厂商共同制定了Serial ATA接口(串行ATA)。这种技术极大地简化了接口的针脚数目,只用四个针就完成了所有的工作。串行ATA工作的时候,第1针发出数据、第2针接收数据、第3针向硬盘供电、第4针为地线。和我们的习惯性思维带来的想法相反,这种串行接口技术将提供比并行接口技术更高的传输速率,还将同时降低电力消耗,减小发热量。 数硬盘业内专家认为并行ATA(普通硬盘)的最高传输率将不超过 200MB/s。而串行的最终目标将是实现600MB/s的外部数据传输率。鉴于串行ATA的特点及其潜在的技术发展能力,业内普遍认为Serial ATA将会取代并行ATA接口类型成为将来硬盘的主流接口类型。 其实硬盘的速度不取决于外部接口,因为现在硬盘接口的传输速度也只是80MB/S左右,ATA100就足够了,SATA 150MB/S的对外速度也只是理论的硬盘接口传输速度而已.并没有什么实际的意义,硬盘的速度主要是取决于转速和磁盘密度,在这两点上,现在的IDE和SATA并没有区别,但SATA硬盘数据是以包的方式发送,需要占用一定的CPU资源来解包,这样就照成了SATA在数据相互传输时慢于IDE的情况 串口硬盘比并口硬盘快只是硬盘接口的最大传输速度而已,并不是真的比并口快(当然,上面的说的一切都是在硬盘缓存,转速,单碟容量等都相同的情况下) 在正常的理解是并行的比串行的快(因为八个“车”比一个“车”得快),可是串行的很容易提高速度,而并行的ATA硬盘为什么从原来的40根线增加到后来ATA100的80根数据线,就是为了避免干扰,多出来的40根线不是用来传数据而是都接地。而串行可以很容易的提高速度而不受干扰的太大影响。就是说并行也能提高速度,可是到一定程度后就不能再提高了,而串行的还能再提高速度所以SATA的硬盘就比ATA的硬盘快了.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
欧司朗泛光灯的价格贵不贵?
谁能解释下手摇式电筒是什么原理?
凯里到杭州高速公路怎么走
长沙羊肉串为什么不正宗?
阿里斯顿灶具维修电话是多少
水动乐是饮料吗?
《喜洋洋与灰太狼》为什么灰太狼煮羊老是煮不
深圳西餐厅急寻桶装冰淇淋桶装雪糕供应商
贺氏育发堂怎么样
北京有哪些名牌运动鞋打折店?
什么是高层直连设备供暖?
研究生学历的留学生办理北京户口问题
桔子的营养价值
有没有淄博市全市的3D地图啊?有模拟实物的那
完美国际黑夜传说的蓬莱在哪里
推荐资讯
武汉,武广那里有一家卖粥的,就在怪脚丫旁边
家用小型加湿器价格多少
请将磁盘插入驱动器H 是什么意思?
谁能告诉我最新型的墙面装饰材料有哪些?
安阳哪家窗帘店便宜质量又好??
奇胜防水插座价格多少?
室外防雨电气插头插座的价格怎么样?
引产,刮宫后一个星期,可以吃月饼吗
微信怎么扫淘宝店二维码?
深圳固戍这里有好玩又比较近的地方吗?
张新发地址有知道的么?有点事想过去!
拐角沙发套怎么做?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?