多维点模板实现思考

来源:互联网 发布:mac如何剪切文件夹 编辑:程序博客网 时间:2024/06/05 09:41

在《深度探索C++对象模型》第一章提到的多维点的实现,这让我印象深刻。首先这样类似的代码我之前没有写过的(以前写过的是一位模板类型的类),其次其中间实现一点让我有点糊涂。先将代码贴出。

 

 

代码的第一部分是Point类的实现,两个模板参数第一个是Point点对应的类型,第二个是Point点对应的维度。这个代码是这类需求的一个例子。代码的第二部分是Point类的输出操

作符重载的实现。要注意加入template<class T,int dim>以及函数参数的表示inline ostream& operator<<(ostream& os,const Point<T,dim>& pt)

 

我的疑惑点:

这样code方式是正确,编译可以的,运行也正确的。

而这样的code方式编译是会出错的。编译的错误有两条:

1.Error C2057: expected constant expression

2.Error C2466: cannot allocate an array of constant size 0

我认为这里关键的问题是dim对应于底层实现不同导致的。

后者dim是普通变量,不是const类型的。这里就引出了C++数据在内存中存放多种方式。

在C++中内存分为5个区,它们是堆、栈、自由存储区、全局/静态存储区以及常量区。

 

堆是存放new操作分配的内存区,他们的释放不是编译器管理的,用户通过与new对应的delete操作符将对应的内存区域释放掉。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

栈是存放临时变量的,是由编译器需要的时候自动分配,不需要的时候自动释放的。常见的有局部变量以及函数参数等

自由存储区:是由那些malloc分配的内存区,它和堆相似,不过是由free来释放的。

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

 

上述的问题主要就可以解释了。

 

原创粉丝点击