operator double() const
,该函数将类转为 double
,其无需定义返回类型,因为返回类型就是这个函数的名字】double asDouble();
。explicit
关键字,此时只有显式调用该构造函数才会生效,编译器就不会在意想不到的时候调用它。explicit
关键字,还有一种方案可以更高效地避免单参数构造函数带来的隐式转换:【所谓的高效指的是用了这种技术,可以让部分隐式构造非法化】
class Array{
public:
class ArraySize{
public:
ArraySize(int numElements): theSize(numElements){}
private:
int theSize;
};
Array(ArraySize size);//接收一个ArraySize对象,而非一个int
......
};
Array(int) a(10)
来定义对象是允许的,因为编译器知道 ArraySize(int numElements)
可以将 int
转换为一个临时的 ArraySize
对象,而该对象正是 Array(ArraySize size)
需要的。
ArraySize
类被称为 proxy(代理)类,关于代理类的相关内容会在条款 30 中进行讨论。bool operator==(const Array<int>& lhs,const Array<int>& rls);
Array<int> a;
Array<int> b;
for(int i=0;i<10;++i)
if(a==b[i]){}//错
int
参数,在调用时,编译器传递一个 0
给函数。【后置式的参数不会被使用,只是用来区分】
i++++
这样的式子能够通过编译,因为 i++
返回一个临时对象,而 i++++
的第二个后置式会作用在临时对象上,这就导致了 i
实际上只累加了一次。【为了避免这种没必要的误会,于是便将后置式返回 const 变量,这样就能避免第二次后置式的调用(为什么能避免?因为后置式是一个 non-const member function,也就是说不能传入 const 参数)】A* a = new A()
,这里的 new 是 new operator(后面统称为 new),它是 C++ 内置的,不能改变它的意义(无法重载),它总是先分配足够内存然后调用构造函数初始化内存中的对象。void* operator new(size_t size)
,这里返回类型为 void*
因为函数返回的是一个未初始化内存的指针。
size_t
。