初始c++(13)之关于typename和size_t的讨论

typedef  typename std::vector::size_type size_type;
  • c++ premier中多次出现上面的代码,让人看了似曾相识,但是有觉得什么都不是,因为这里包含了好几个知识点,让我来慢慢解答。

1.独立于对象存在的类成员

首先来看这句:

std::vector::size_type

要想知道上面的代码什么意思,当我们看一下STL中vector类是怎么写的就明白啦:

template 
class vector{
public:
    //...
    typedef size_t size_type;
    //...
};

其实size_type就是size_t(size_t是什么,下面会讲到)。

std::vector::size_type,这种直接用类名加成员的写法,让我想起来了类静态变量,类静态函数的用法。(静态变量,静态函数可以看我关于static的博客)。于是我做了总结;
 

静态数据成员 
静态成员函数 
嵌套类型

上面这三种情况,都可以用类名加成员的写法来用, typedef size_t size_type;这句话就是嵌套类型,std::vector::size_type,这句就是引用,显然它是独立于对象存在的类成员。

typename

那么问题就来了,上面三种类型都可以用std::vector::size_type这种形式来引用,那么编译器要怎么才能分清这个是类的嵌套类型,还是静态数据成员呢?我们就用typename来告诉编译器我这个是一个嵌套类型,这样就解决了定义不明确的问题了。

size_t

这是一个很重要的概念,网上也有很多解释,但是写的是云里雾里的,我就说一下我的理解:

template 
class Blob{
	public:
		typedef T value_type;
		typedef  typename std::vector::size_type size_type;
		Blob();
		Blob(std::initializer_list il) :data(make_shared>(il)) {}
		size_type size() const { return data->size();}
		bool empty() const { return data->empty();}
		void push_back(const T& t) {data->push_back(t);}
	private:
		std::shared_ptr> data;
};

这c++ premier中的一段代码,其实我们在STL经常见到size_type而很少见到size_t,经过上面的解释我们就知道了,size_type只是size_t的一个别名,其实是一个东西。上面的代码我们可以看到size_type作为vector的size()返回类型,这也是size_type最常用的一种用法,下面继续解释。

int A[i];
std::vector V[i];

如上面例子,大家有没有想过一个数组,一个vector最多有几个元素,这就跟i是什么类型有关了,先告诉你,i的类型就是size_t(很多地方说size_t就是unsigned int,但是这不重要),也就是说,我们抽象出来一个类型size_t专门来表示一个序列对象的元素的多少(有人说这与地址的位数有关,但是这也不重要)。我们这样抽象出来的size_t类型有很多好处:

  • 增加程序的可移植性。不同的环境下int 或者unsigned int这些内置类型的字节数是不同的,如果我们用int定义了数组的大小,而用unsigned int去索引,在我们的环境中程序可以运行,但是换了环境可能就会出现bug
  • 如果size_t报错,我们立刻就知道是数组大小出了问题。

你可能感兴趣的:(初识C++系列)