在C++中创建并使用Web服务
web服务的确是.net中让人激动的部分——但它们本身比.net要大。其中的道理很简单。几乎所有你能叫出名字的服务都有一些执行服务器端代码的机制:你在浏览器的地址栏中输入一个URL;接收到你的请求,服务器上就开始运行什么东西,然后以html页面返回你要的结果。它可能是ASP,ASP.net,servlets,甚至是五年前通过CGI触发的perl本。因此想象一下,如果运行代码返回的是XML格式而非HTML格式的结果,并且服务请求并非是在浏览器地址栏中输入的url,而是某些代码中以HTTP中的GET方法向服...
EffectiveC++2eItem14
条款14: 确定基类有虚析构函数 有时,一个类想跟踪它有多少个对象存在。一个简单的方法是创建一个静态类成员来统计对象的个数。这个成员被初始化为0,在构造函数里加1,析构函数里减1。(条款M26里说明了如何把这种方法封装起来以便很容易地添加到任何类中,“my article on counting objects”提供了对这个技术的另外一些改进) 设想在一个军事应用程序里,有一个表示敌人目标的类: class EnemyTarget { public: EnemyTarget() { ++numTarge...
EffectiveC++2eItem15
条款15: 让operator=返回*this的引用 C++的设计者Bjarne Stroustrup下了很大的功夫想使用户自定义类型尽可能地和固定类型的工作方式相似。这就是为什么你可以重载运算符,写类型转换函数(见条款M5),控制赋值和拷贝构造函数,等等。他做了这么多努力,那你最少也该继续做下去。 让我们看看赋值。用固定类型的情况下,赋值操作可以象下面这样链起来: int w, x, y, z; w = x = y = z = 0; 所以,你也应该可以将用户自定义类型的赋值操作链起来: string...
EffectiveC++2eItem16
条款16: 在operator=中对所有数据成员赋值 条款45说明了如果没写赋值运算符的话,编译器就会为你生成一个,条款11则说明了为什么你会经常不喜欢编译器为你生成的这个赋值运算符,所以你会想能否有个两全其美的办法,让编译器生成一个缺省的赋值运算符,然后可以有选择地重写不喜欢的部分。这是不可能的!只要想对赋值过程的某一个部分进行控制,就必须负责做赋值过程中所有的事。 实际编程中,这意味着写赋值运算符时,必须对对象的每一个数据成员赋值: templateclass T // 名字和指针相关联的类的模板...
EffectiveC++2eItem17
本条款的最后将会看到,别名可以以大量任意形式的伪装出现,所以在写函数时一 定要时时考虑到它。 在赋值运算符中要特别注意可能出现别名的情况,其理由基于两点。其中之一是效 率。如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回, 从而可以节省大量的工作,否则必须去实现整个赋值操作。例如,条款16指出,一 个正确的派生类的赋值运算符必须调用它的每个基类的的赋值运算符,所以在派生 类中省略赋值运算符函数体的操作将会避免大量对其他函数的调用。 另一个更重要的原因是保证正确性。一个赋值运算符必须首先...
EffectiveC++2eItem18
类和函数:设计与声明 在程序中声明一个新类将导致产生一种新的类型:类的设计就是类型设计。可能你对类型设计没有太多经验,因为大多数语言没有为你提供实践的机会。在C++中,这却是很基本的特性,不是因为你想去做才可以这么做,而是因为每次你声明一个类的时候实际上就在做,无论你想不想做。 设计一个好的类很具有挑战性,因为设计好的类型很具有挑战性。好的类型具有自然的语法,直观的语义和高效的实现。在C++中,一个糟糕的类的定义是无法实现这些目标的。即使一个类的成员函数的性能也是由这些成员函数的声明和定义决定的。 那么...
EffectiveC++2eItem19
条款19: 分清成员函数,非成员函数和友元函数 成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定(见条款38),就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。 看下面表示有理数的一个类: class Rational { public: Rational(int numerator = 0, int denominator = 1); int numerator() const...
EffectiveC++2eItem20
条款20: 避免public接口出现数据成员 首先,从“一致性”的角度来看这个问题。如果public接口里都是函数,用户每次访问类的成员时就用不着抓脑袋去想:是该用括号还是不该用括号呢?——用括号就是了!因为每个成员都是函数。一生中,这可以避免你多少次抓脑袋啊! 你不买“一致性”的帐?那你总得承认采用函数可以更精确地控制数据成员的访问权这一事实吧?如果使数据成员为public,每个人都可以对它读写;如果用函数来获取或设定它的值,就可以实现禁止访问、只读访问和读写访问等多种控制。甚至,如果你愿意,还可以实...
C++数据结构学习:栈和队列
栈和队列是操作受限的线性表,好像每本讲数据结构的数都是这么说的。有些书按照这个思路给出了定义和实现;但是很遗憾,这本书没有这样做,所以,原书中的做法是重复建设,这或许可以用不是一个人写的这样的理由来开脱。 顺序表示的栈和队列,必须预先分配空间,并且空间大小受限,使用起来限制比较多。而且,由于限定存取位置,顺序表示的随机存取的优点就没有了,所以,链式结构应该是首...
EffectiveC++2eItem21
条款21: 尽可能使用const 使用const的好处在于它允许指定一种语意上的约束——某种对象不能被修改——编译器具体来实施这种约束。通过const,你可以通知编译器和其他程序员某个值要保持不变。只要是这种情况,你就要明确地使用const ,因为这样做就可以借助编译器的帮助确保这种约束不被破坏。 const关键字实在是神通广大。在类的外面,它可以用于全局或名字空间常量(见条款1和47),以及静态对象(某一文件或程序块范围内的局部对象)。在类的内部,它可以用于静态和非静态成员(见条款12)。 对指针来说...
关于Linux网络服务器
Linux系统网络服务器模型主要有两种:并发服务器和循环服务器。所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器在同一时刻指可以响应一个客户端的请求。而且对于TCP和UDP套接字,这两种服务器的实现方式也有不同的特点。 1、TCP循环服务器:首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接受下一个客户端的请求。 创建TCP循环服务器的算法如下: socket(……); //创建一个TCP套接字 bind(……); //...
SSTC-标准简单类型类
我们都知道,有些类实际上是实现了某种特殊的类型,是对语言变量类型的扩展。如分数类,等级类等。这些类最终的实现目标是让使用者像使用语言原本就提供的标准类型一样的操作,甚至不必理睬其是类的事实。这种类的使用范围非常具有典型性,我称之为标准类型类SST类。C++Builder中的AnsiString 就是符合这种标准的SST类。 我们来看一个SST类的定义,看看作为一个SST类至少需要实现什么。 一个SST类的例子 在C++中没有提供分数数据类型,我们以类的形式来实现它,因为分数是一种数据类型,自然要实现成S...