2022年C语言技巧 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年C语言技巧 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言技巧 .pdf(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C+ 中使用 union的几点思考这段时间整理旧资料,看到一些文章,虽然讲的都是些小问题,不大可能用到,但也算是一个知识点,特整理出来与大家共享。与此相关的那篇文章的作者的有些理解是错误的,我写此文,也是纠正为了作者的一些错误认识。当然,如果我的理解有任何错误,也恳请大家批评指正。c+ 虽说被 b.s. 称作一门新语言, 但它毕竟与c 有着千丝万缕的联系,虽然 b.s. 一再坚持, 但我还是愿意把 c+ 看作是 c + 。我们应该按照c 中的 convention 去使用 union ,这是我这篇文章要给出的观点。虽然c+ 使得我们可以扩展一些新的东西进去,但是,我建议你不要那样去做,看完这篇
2、文章之后,我想你大概也是这么想的。c 由于没有类的概念,所有类型其实都可以看作是基本类型的组合,因此在union 中包含 struct 也就是一件很自然的事情了,到了c+ 之后,既然普遍认为c+ 中的 struct 与 class 基本等价,那么union 中是否可以有类成员呢?先来看看如下的代码: struct testunion testunion() ; typedef union testunion obj; ut; int main (void) return 0; 编译该程序,我们将被告知: error c2620: union _unnamed : member obj has
3、user-defined constructor or non-trivial default constructor 而如果去掉那个什么也没干的构造函数,则一切ok。为什么编译器不允许我们的union 成员有构造函数呢?我无法找到关于这个问题的比较权威的解释,对这个问题,我的解释是: 如果 c+ 标准允许我们的union 有构造函数,那么,在进行空间分配的时候要不要执行这个构造函数呢?如果答案是yes,那么如果testunion的构造函数中包含了一些内存分配操作,或者其它对整个application 状态的修改,那么,如果我今后要用到obj 的话,事情可能还比较合理,但是如果我根本就不使用
4、obj 这个成员呢 ?由于 obj 的引入造成的对系统状态的修改显然是不合理的;反之,如果答案是no,那名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 么一旦我们今后选中了obj 来进行操作,则所有信息都没有初始化(如果是普通的struct ,没什么问题,但是, 如果有虚函数呢?)。 更进一步,假设现在我们的union 不是只有一个testunion obj , 还有一个 testunion2 obj2 ,二者均有构造函数,并且
5、都在构造函数中执行了一些内存分配的工作(甚至干了很多其它事情),那么,如果先构造obj ,后构造 obj2 ,则执行的结果几乎可以肯定会造成内存的泄漏。鉴于以上诸多麻烦(可能还有更多麻烦),在构造 union 时,编译器只负责分配空间,而不负责去执行附加的初始化工作,为了简化工作,只要我们提供了构造函数,就会收到上面的error 。同理,除了不能加构造函数,析构函数/拷贝构造函数 / 赋值运算符也是不可以加。此外,如果我们的类中包含了任何virtual 函数,编译时,我们将收到如下的错误信息: error c2621: union _unnamed : member obj has copy
6、constructor 所以,打消在 union 中包含有构造函数/析构函数 /拷贝构造函数 / 赋值运算符 /虚函数的类成员变量的念头,老老实实用你的c 风格 struct 吧! 不过,定义普通的成员函数是ok 的,因为这不会使得class与 c 风格的 struct 有任何本质区别,你完全可以将这样的class 理解为一个c 风格的 struct + n个全局函数。现在,再看看在类中包含内部union 时会有什么不同。看看下面的程序,并请注意阅读程序提示: class testunion union dataunion dataunion(const char*); dataunion(l
7、ong); const char* ch_; long l_; data_; public: testunion(const char* ch); testunion(long l); ; testunion:testunion(const char* ch) : data_(ch) / if you want to use initialzing list to initiate a nested-union member, the union must not be anonymous and must have a constructor。 testunion:testunion(lon
8、g l) : data_(l) testunion:dataunion:dataunion(const char* ch) : ch_(ch) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - testunion:dataunion:dataunion(long l) : l_(l) int main (void) return 0; 正如上面程序所示,c+ 中的 union 也可以包含构造函数,但是,这虽然被语言所支持,但实在是
9、一种不佳的编程习惯,因此,我不打算对上面的程序进行过多的说明。我更推荐如下的编程风格: class testunion union dataunion const char* ch_; long l_; data_; public: testunion(const char* ch); testunion(long l); ; testunion:testunion(const char* ch) data_ 。ch_ = ch; testunion:testunion(long l) data_ 。l_ = l; int main (void) return 0; 它完全是 c 风格的。名师
10、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - C 语言高效编程的的四招技巧引言:编写高效简洁的c 语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。第一招:以空间换时间计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1 招-以空间换时间。例如:字符串的赋值。方法 a:通常的办法:#define len 32 cha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C语言技巧 2022 语言 技巧
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内