C++中生成对象有两种方法,显式的和隐式的。
显示生成对象
explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的。
其他不多说明了,这个用法不是太常用。下面的一个例子也有说明。
隐式生成对象
隐式生成对象,主要以标准迭代器为例来说明。
在本例中,主要是为自己定义的类实现一个迭代器。请与implicit区分开来。
{
private:
AA *pAA;
public:
A(AA *pIn){pAA = pIn;}
typedef AIter<A> const_AIter;
}
template <typename T>
class AIter : public std::iterator<
std::input_iterator_tag, // 迭代器类型
T, //
std::ptrdiff_t, // 默认类型即可
const T*, // 指针, pointer
T // 引用, reference
>
{
private:
AA *p;
public:
explicit AIter(AA *pp) : p(pp) {}
iterator& operator++() // 实现 ++i
{
p = p->pNext;
return *this;
}
iterator operator++(int) // 实现i++
{
AIter retval = *this;
++(*this);
return retval;
}
bool operator==(iterator other) const {return this->p == other.p;}
bool operator!=(iterator other) const {return this->p != other.p;}
reference operator*() const {return p;} // 隐式生成对象
// 因为这里面referencce 就是继承模版里面的,也就是T,
// 返回一个AA类型的指针也就意味着,返回之后隐式的构造一个对象
// 比如说本例中所说的: A(p)
}