首页 > 代码库 > 未初始化的布尔值(二)

未初始化的布尔值(二)

在C++中所特有的另一种内置类型bool。它只是一种特殊情况,因为对于布尔值,我们并不需要像++这样的操作符。反之,我们需要特定的布尔操作符,例如&=和|=,因此,这个类型是单独定义的:

class Bool
{
public:
	Bool(bool x=false)
		: data_(x)
	{
	}
	operator bool () const
	{
		return data_;
	}

	Bool& operator = (bool x)
	{
		data_ = x;
		return *this;
	}

	Bool& operator &= (bool x)
	{
		data_ &= x;
		return *this;
	}

	Bool& operator |= (bool x)
	{
		data_ |= x;
		return *this;
	}

private:
	bool data_;
};

inline 
	std::ostream& operator << (std::ostream& os, Bool b)
{
	if(b)
		os << "True";
	else
		os << "False";

	return os;
}

同样,和其他包装了内置类型的类一样,Bool类型的行为与bool类型(原先的内置类型)完全相同,仅有的区别在于如下两点:

  • 它被初始化为false
  • 它具有<<操作符,打印出False和True,而不是0和1,这样更为清晰,更容易让人理解
但是,为什么被初始化为false而不是true呢?其实都是一样的,我们也可以写一个新类,并把它默认初始化为true。

到目前为止,使用Int,Unsigned,Double这样的类代替对应的小写字母内置类型的动机是可以避免在多个构造函数中对它们进行初始化。如果更宽泛的使用它们,例如表示传递给函数参数,结果将会是这样的。假设有一个接受unsigned类型(内置类型)的参数函数:

void SomeFunctionTaking_unsigned(unsigned u);

下面的代码就可以通过编译:

int i = 0;
SomeFunctionTaking_unsigned(i);

如果采用我们讨论的类,情况就不会如此,如果对于这样一个函数:

void SomeFunctionTakingUnsigned(Unsigned u);

下面的代码就无法通过编译:

int i = 0;
SomeFunctionTakingUnsigned(i);
因此,在这种情况下,我们就自动获得了编译时类型安全的优点。

总结:

  • 不要使用像int,unsigned·,double,bool等内置类型作为类的数据成员。反之,使用Int,Unsigned,Double,Bool等类,因为这样可以避免在构造函数中对它们进行初始化、
  • 用这些新类代替内置类型表示传递给函数的参数,以获得额外的类型安全。

未初始化的布尔值(二)