2007年3月24日
摘要: 宏不遵循C++中关于范围和类型的规则。这经常导致一些微妙的或不那么微妙的问题。因此,C++提供更适合其他的 C++(译注:原文 the rest of C++,当指 C++除了兼容 C 以外的部分)的替代品,例如内联函数、模板与名字空间。
阅读全文
摘要:
写出那些不会导致任何内存泄漏的代码。很明显,当你的代码中到处充满了 new 操作、delete操作和指针运算的话,你将会在某个地方搞晕了头,导致内存泄漏,指针引用错误,以及诸如此类的问题。这和你如何小心地对待内存分配工作其实完全没有关系:代码的复杂性最终总是会超过你能够付出的时间和努力。于是随后产生了一些成功的技巧,它们依赖于将内存分配(allocations)与重新分配(deallocation)工作隐藏在易于管理的类型之后。标准容器(standard containers)是一个优秀的例子。它们不是通过你而是自己为元素管理内存,从而避免了产生糟糕的结果。想象一下,没 string 和 vector 的
帮助,写出这个:
阅读全文
摘要: 没有,不过如果你需要的话,可以自己写一个。
阅读全文
摘要:
二者都是正确的,因为二者在 C 和 C++中都是有效的,而且意义完全一样。就语言的定义与相关的编译器来说,我们还可以说“int*p”或者“int * p”。
在“int* p”和“int *p”之间的选择与正确或错误无关,而只关乎风格与侧重点。C侧重表达式;对声明往往比可能带来的问题考虑得更多。另一方面,C++则非常重视类型。
阅读全文
摘要:
我把它放在前面,但那仅仅是个人爱好问题。“const T”和“T const”总是都被允许的,而且是等效的。例如:
阅读全文
摘要: 最简单的方法是使用一个字符串流(stringstream):
阅读全文
摘要:
可以,但是要小心。它可能不象你期望的那样工作。在构造函数中,虚拟调用机制不起作用,因为继承类的重载还没有发生。对象先从基类被创建,基类先于继承类(base before derived)”。
阅读全文
摘要: 虚拟调用是一种能够在给定信息不完全(given partial information)的情况下工作
的机制。特别地,虚拟允许我们调用某个函数,对于这个函数,仅仅知道它的接口,而不知道具体的对象类型。但是要建立一个对象,你必须拥有完全的信息。特别地,你需要知道要建立的对象的具体类型。因此,对构造函数的调用不可能是虚拟的。
阅读全文
摘要: 因为很多类并不是被设计作为基类的。只有类在行为上是它的派生类的接口时(这些派生类往往在堆中分配,通过指针或引用来访问),虚拟函数才有意义。
那么什么时候才应该将析构函数定义为虚拟呢?当类至少拥有一个虚拟函数时。拥有虚拟函数意味着一个类是派生类的接口,在这种情况下,一个派生类的对象可能通过一个基类指针来销毁。
阅读全文
摘要: 要清楚,两个不同的对象的地址也是不同的。基于同样的理由,new总是返回指向不同对象的指针。
阅读全文
摘要: 我如何写个非常简单的程序?
特别是在一个学期的开始,我常常收到许多关于编写一个非常简单的程序的询问。这个问题
有一个很具代表性的解决方法,那就是(在你的程序中)读入几个数字,对它们做一些处理,
再把结果输出。下面是一个这样做的例子:
阅读全文
摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。
阅读全文