- 浏览: 37934 次
- 性别:
- 来自: 上海
最近访客 更多访客>>
最新评论
-
shi5jin:
呵呵,我看的是Effective C++第三版,第一个item ...
站在巨人肩上的思考[连载] (5) -
bigpanda:
欢迎讨论远程数据库和rpc的编程。
“《Effective ...
站在巨人肩上的思考[连载] (5) -
spinach:
读完这两节,我基本就一个字,“基本帅呆了”。
站在巨人肩上的思考 [连载] (3) -
spinach:
终于等到了,慢慢看。
站在巨人肩上的思考 [连载] (2) -
spinach:
期待下文
站在巨人肩上的思考 [连载] (1)
文章列表
5.2 数组
5.2.2 字符串文字量
类似”this is a string.”这样一个字符串文字量,它是一个常量。正如代码中一个显式的数字0xff08一样,其值不可以被更改。如想修改,可以通过复制给一个变量来实现:
<v:shapetype id="_x0000_t202" path="m,l,21600r21600,l21600,xe" o:spt="202" coordsize="21600,21600"><v:stroke joinstyle=&qu ...
4.8 枚举
枚举是表示具有共同属性的整型常量集合的用户自定义类型。这其中包含这些含义:
1. 枚举的取值只能是整数,正负皆可;
2. 枚举的取值是常量,枚举初始化后,这些值不能被改变;
3. 枚举也是一种用户自定义类型,用户定义好枚举后,可以自定义该枚举类型自身的操作,如“++”,“<<”等;
<o:p> </o:p>
枚举类型的取值隐含着这样的“潜规则”:
l 如果枚举中所有枚举值均非负,那么该枚举表示的范围,是包含这些枚举值的所有[0, 2k-1]区间中最小的那个;
编译器是如何针对虚函数产生可以再运行时刻确定被调用函数的代码呢?也就是说,虚函数实际上是如何被编译器处理的呢?Lippman在深度探索C++对象模型中的不同章节讲到了几种方式,这里把“标准的”方式简单介绍一下。
我所说的“标准”方式,也就是所谓的“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同 ...
- 2007-11-09 11:07
- 浏览 1292
- 评论(0)
现有一基础模块A,提供模块间通信服务。类B、C中都有一个私有A*成员用于与其他模块之间通信,B、C的构造函数要求提供一个A的指针来初始化该私有成员。使用B的开发人员在平台W1上开发程序P1,具有A的A1实现版本;使用C的开发人员在平台W2上开发程序P2,具有A的A2实现版本;P1,P2进行通信。现在来看看A的界面如何使用:
对于A的设计者,给出A的界面接口规范A.h向所有驱动厂商、用户提供;并且给出了W1平台的实现A1.h,A1.cpp,其中A1中有派生类A1 : public A,并在A1.cpp中给出了全部接口实现;编译出A1库,并且向客户提供头文件A1.h;
类B为使用A,在B的接口规 ...
- 2007-10-11 15:46
- 浏览 1030
- 评论(0)
Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换
条件放在{}中.
(1) ${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.
(2) ${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将
word赋值给value
(3) ${value:?message}
若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若
此替换出现在Shell程序中,那么该程序将终止运行)
(4) ${value:+word}
若变量以赋值的话,其值才用word替换,否则不 ...
- 2007-09-14 11:10
- 浏览 1100
- 评论(0)
by Christopher Diggins
November 11, 2005
Summary
Ostream iterators are a handy but under-utilized tool for using the STL to output containers and ranges. Here I provide an alternative, which has a more pleasing syntax.
An ostream iterator, allows you to use STL algorithms, such as std::cop ...
- 2007-09-07 08:37
- 浏览 1375
- 评论(0)
可以。不过你得悠着点。当你这样做时,也许你自己都不知道自己在干什么!在构造函数中,虚拟机制尚未发生作用,因为此时overriding尚未发生。万丈高楼平地起,总得先打地基吧?对象的建立也是这样——先把基类构造完毕, ...
- 2007-09-06 11:18
- 浏览 2787
- 评论(0)
类似这样的问题千奇百怪。例如:
为什么我明明不想复制对象,而编译器却偏偏这么做了呢?
如何关闭复制机制?
如何防止隐式转换?
为何 int 自动转换成了复数?
类的默认复制构造函数和赋值运算符可以复制所有元素。例如:
struct Point {
int x,y;
Point(int xx = 0, int yy = 0) :x(xx), y(yy) { }
};
Point p1( ...
- 2007-09-06 10:57
- 浏览 1175
- 评论(0)
如果你想得到一个可用于常量表达式中的常量,例如数组大小的定义,那么你有两种选择:
class X { static const int c1 = 7; enum { c2 = 19 }; char v1[c1]; char v2[c2]; // ... };
一眼望去,c1的定义似乎更加直截了当,但别忘了只有static const ...
- 2007-09-06 10:51
- 浏览 2526
- 评论(0)
为了确保两个不同对象的地址不同,必须如此。也正因为如此,new返回的指针总是指向不同的单个对象。我们还是来看代码吧:
class Empty { }; void f() { Empty a, b; if (&a == &b) cout << "impossible: report error to compiler supplier"; Empty* p1 = new Empty; Empty* p2 = new Empty; if (p1 == p2) cout << "impossible: report er ...
- 2007-09-06 10:46
- 浏览 1915
- 评论(0)
很 简单,只要写“不漏”的代码就完事了啊。显然,如果你的代码到处是new、delete、指针运算,那你想让它“不漏”都难。不管你有多么小心谨慎,君为 人,非神也,错误在所难免。最终你会被自己越来越复杂的代码逼疯的— ...
- 2007-09-06 10:43
- 浏览 971
- 评论(0)
C++ 代码编写标准的要点是:根据使用 C++ 的具体的环境和具体目的制定一套规则。因此,没有哪一种代码编写标准是符合所有需要和所有用户的。对于一个特定的应用程序(或者公司、应用领域,等等)来 说,一种好的代码编写标准当然比没有标准要好得多。话说回来,我看到过很多例子表明一种差劲的代码编写标准比没有标准还要更糟糕。
选择规则时,请切记细心,而且你必须对该应用领域有过硬的知识。一些最差劲的代码编写标准(“为了保护罪犯”,我不会提及这些 名字)的作者既没有过硬的 C++ 知识,而且对其应用领域也相对无知(他们是“专家”,而非开发人员),更误以为约束总是多比少好。针对前面这种误解的一个 ...
- 2007-09-06 10:36
- 浏览 1331
- 评论(0)
你的编译器可能有问题。也许它太老了,也许你安装它的时候出了错,也许你用的计算机已经是个古董。在诸如此类的问题上,我无法帮助你。
但是,这也是很可能的:你要编译的程序设计得非常糟糕,以至于编译器不得不检查数以百计的头文件和数万行代码。理论上来说,这是可以避免的。如果这是你购 买的库的设计问题,你对它无计可施(除了换一个更好的库),但你可以将你自己的代码组织得更好一些,以求得将修改代码后的重新编译工作降到最少。这样的设 计会更好,更有可维护性,因为它们展示了更好的概念上的分离。
看看这个典型的面向对象的程序例子:
class Shape {
...
- 2007-09-05 17:21
- 浏览 1065
- 评论(0)
不,它们的效率并不低下。或许“和什么比较?”会是一个更有用的回答。当人们抱怨标准库容器的性能时,通常会是以下三个现实问题之一:
复制开销
查表很慢
我写的(浸入式)链表比 std::list 要快得多
在优化之前,请先考虑是否真有性能问题。在我收到的大多数案例中,性能问题只是理论上的或者只存在于想象中:首先仔细思量,除非必要,就不要优化。
让我们一个接一个地来分析这些问题。通常,vector<X> 要慢于某些人专门写的 My_container<X>,因为 My_cont ...
- 2007-09-05 09:59
- 浏览 1753
- 评论(0)
请参考 TC++PL 章节 8.3、第十四章,以及附录 E。附录聚焦于如何为“苛刻的”应用程序编写异常安全(exception-safe)的代码,它并非写给初学者看的。
C++ 里,异常用于发出一种信号,表示发生了“本地”处理不了的错误,比如构造函数里某个获取资源的操作失败了。例如:
class Vector {
int sz;
int* elem;
class Range_error { };
public:
Vector(int s) : sz(s) ...
- 2007-09-05 09:34
- 浏览 1017
- 评论(0)