摘要:
1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, 进一步假设这个程序库通过一个工厂函数(Item 7)来给我们提供特定Investment对象: 正如注释所表述的,当createInvesmen 阅读全文
摘要:
1.默认构造函数介绍 在设计良好的面向对象系统中,会将对象的内部进行封装,只有两个函数可以拷贝对象:拷贝构造函数和拷贝赋值运算符。我们把这两个函数统一叫做拷贝函数。从Item5中,我们得知,如果需要的话编译器会为你生成这两个拷贝函数,并且编译器生成的版本能够精确的做到你想做的:它们拷贝了对象的所有数 阅读全文
摘要:
1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: 这看上去是愚蠢的,但这是合法的,所以请放心,客户端是可以这么做的。此外,自身赋值也并不总是很容易的能够被辨别出来。举个例子: 上面的代码在i和j相等的情况下就是自我赋值,同样的,看下面的例子: 如果px和py恰巧指向同一个东西 阅读全文
摘要:
一个关于赋值的有趣的事情是你可以将它们链在一起: 同样有趣的是赋值采用右结合律,所以上面的赋值链被解析成下面这个样子: 在这里,15被赋值给z,然后赋值的结果(更新的z)被赋值给y,再然后赋值的结果(更新的Y)被赋值给x。 实现这个赋值链的方法是使赋值返回指向左边参数的引用,这也是你在为你的类实现赋 阅读全文
摘要:
1.关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样。如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为这是c++同它们不一样的地方。 假设你已经有一个为股票交易建模的类继承体系,它可以买卖股票等。这 阅读全文
摘要:
1.为什么c++不喜欢析构函数抛出异常 C++并没有禁止析构函数出现异常,但是它肯定不鼓励这么做。这是有原因的,考虑下面的代码: 当vector V被销毁,V有责任将它包含的所有Widgets都销毁。假设v含有有10个Widgets对象,当销毁第一个Widgets对象时,抛出了一个异常。其余的9个仍 阅读全文
摘要:
1. 继承体系中关于对象释放遇到的问题描述 1.1 手动释放 关于时间记录有很多种方法,因此为不同的计时方法创建一个TimeKeeper基类和一些派生类就再合理不过了: 许多客户端只想访问时间而不想知道关于时间计算的细节,所以可以创建一个工厂方法,这个工厂方法返回一个指向新创建的派生类对象的基类指针 阅读全文
摘要:
问题描述-阻止对象的拷贝 现实生活中的房产中介卖房子,一个服务于这个中介的软件系统很自然的会有一个表示要被销售的房屋的类: 每个房产中介会立刻指出来,要销售房屋的每个属性都是唯一的,没有两个完全一样的房屋。在这种情况下,拷贝一个HomeForSale对象就没有任何意义了。你在怎么能拷贝一些独一无二的 阅读全文
摘要:
1 编译器会默认生成哪些函数 什么时候空类不再是一个空类?答案是用c++处理的空类。如果你自己不声明,编译器会为你声明它们自己版本的拷贝构造函数,拷贝赋值运算符和析构函数,如果你一个构造函数都没有声明,编译器同样会为你声明一个默认拷贝构造函数。这些所有的函数会是public和inline的(Item 阅读全文
摘要:
C++在对象的初始化上是变化无常的,例如看下面的例子: 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证。看下面的例子: P的数据成员有时候保证能够被初始化(成0),有时候却不能。如果你从不存在未初始化对象的语言中转到c++, 就需要注意了,因为这很重要。 1. 使用未初始化对象的 阅读全文