Lzp729@Blog
道法自然
Browse: Home / vc

vc

auto_ptr_ref类深入剖析

By lzp729 on September 8, 2009

STL之<memory>所遗留下来的问题, 即在auto_ptr的实现中, 多个构造函数和操作符的重载函数中都引入了auto_ptr_ref这个模板结构(template structure), 这里我就来探讨一下这样做的必要性和可行性.
首先回顾一下最基本的C++语言特性, 即在寻找可行函数列表时, 实参向形参做类型匹配的过程中, 存在从指针(*)到常量指针(const *)的隐式转换, 然而反向的隐式转换时不存在的, 要注意的是这的常量指针是指指针所指向的值是常量, 而指针自身并非常量(* const), 另外提一下, 指针(*)到(*const)之间的匹配属于精确匹配的范畴, 即存在他们之间的相互转换, 下面给出一组例子说明.

#include <cstdlib>
#include <iostream>
using namespace std;
void foo1(int *a) {}
void foo2(const int *a) {}
void foo3(int * const a){}
void foo4(const int * const a){}
 
int main(int argc, char*argv[])
{
int * a = 0;
const int * b = 0;
int * const c = 0;
const int [...]

Posted in inside VS C++ STL | Tagged auto_ptr, auto_ptr_ref, C++, memory, stl, vc | Leave a response

STL之<memory>

By lzp729 on September 7, 2009

STL设计的一个重要目的就是对C++的实用性进行增强, 而C++较之当前时髦的代码托管类的语言, 比如C#或者Java, 一个最为人所诟病的特性就是动态内存的分配策略. 这一特性, 使得程序员有足够的能力来控制内存的分配与回收, 但同时也为程序员的工作量增加了无谓的负担, 并增加了内存泄露的风险. 所以为了规避这一特性所造成的麻烦, STL设计了一个实用类auto_ptr, 其实auto_ptr这个模板类的作用就是对实际对象的指针进行了封装, 并通过C++的语言机制使得该类型的对象行为就像一个普通指针一样使用, 并且由于C++语言机制保证自定义类的对象在退出其生命周期的时候会自动调用其析构函数, 加上auto_ptr类的析构函数保证了对指针所指向对象的析构工作, 这样一来, 就从形式上免去了程序员手动回收内存的麻烦.
auto_ptr类设计了一组构造函数, 包括

explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
template<class _Other> auto_ptr(auto_ptr<_Other>& _Right) _THROW0()

我们知道具有单参数的且该参数有默认值的构造函数实际上就相当于无参数的默认构造函数, 而这样的构造函数实际上定义了参数类型到该类类型的一个转换途径, 而explicit关键字压制了这种自动转换行为, 使得程序员必须给出明显的构造句式来完成构造, 不能通过将一个普通指针赋值给auto_ptr类对象的方式来初始化.对于接下来的

auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()

他们合作定义了对copy contructor的完整支持, 甚至包括右值, 而其中涉及到的技术细节不属于本文的范围, 我将在另一文中阐述.
最后的模板copy constructor

template<class _Other> auto_ptr(auto_ptr<_Other>& _Right) _THROW0()

使得auto_ptr支持不同模板类型参数的auto_ptr实例之间的相互赋值初始化, 例如auto_ptr支持auto_ptr对象初始化auto_ptr对象, 但是实际上, 这样的语句仍然会导致编译报错, 原因就是本质上, 这样的初始化过程在实现上仍然是用int*来初始化float*, 而这样的初始化是被C++所禁止的, 所以就会报错, 其实, [...]

Posted in inside VS C++ STL | Tagged auto_ptr, C++, memory, stl, vc | 1 Response

STL之<utility>

By lzp729 on April 23, 2007

头文件中,定义了:
1. 交换两个值的模板swap

template<class _Ty> inline
void swap(_Ty& _Left, _Ty& _Right)

由于将要交换这个量的值,所以参数作为非const引用传递。由于这个模板的两个参数均属于同一类型的引用,使得使用这个模板函数的时候,实参必须为同一类型,如若类型不同,则会造成函数模板无法实例化的编译时错误。
测试代码:

#include <utility>
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
swap(a,b);
cout << a << b << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

当然我们可以对这个模板进行扩展,使得他可以交换两个不同类型,但可以相互赋值的变量,比如int和float,那么为什么ANSI C++没有这样做呢?这样做的后果往往会很严重,首先如果两个不能相互赋值的变量被程序员错误的使用了swap来交换,那么编译时极有可能不会出现任何错误提示,如果即使是两个相互赋值但不同类型的的变量,也会造成精度丢失等情况,所以如果程序员真的需要这样一个函数,就应该自己定义这样一个函数,而并非函数模板。
2.在std的嵌套名字空间rel_ops内定义了辅助性比较关系运算符。它使得程序员仅需要定义针对某一类型,定义小于<和等于==,便可使用其他的关系运算符
测试代码:

#include <utility>
#include <iostream>
using namespace std;
using namespace std::rel_ops;
class Para
{
public:
Para(int rhs) : a(rhs){}
bool operator < (const Para& rhs) const
{
return a < rhs.a;
}
bool operator == (const Para& rhs) const
{
return a == rhs.a;
}
private:
int [...]

Posted in inside VS C++ STL | Tagged C++, stl, utility, vc | Leave a response

inside visual studio C++ STL

By lzp729 on April 23, 2007

学习C++的时间不短了,一直想找到一个恰当的终点作为自己学习C++的一个暂时性里程碑。就语言机制来说,我个人认为通过多年的学习与积累应该不会在语法层次上再有什么大的困扰了,不过现在依旧保持着每天刷CSDN的C/C++版RSS的习惯,虽然不常去回答什么问题,不过也至少关注一下人家在学习和使用的过程中出现了什么问题,关注一下人家是怎样解决问题,总会有一些收获的。关注归关注,但老感觉对C++的学习始终没有达到一个令自己满意的终点,学无止境那是当然,但也不能一直这样。可能也是性格使然,在学好一个知识之前,我都不愿意去学习新的知识,从心底里有些抵触。最终我不得不给自己学习C++的过程找到一个出口,我决定研读的VC的STL代码的原因就在于此,为了给自己一个令自己满意的句号。
为了VC STL的研读,我先参见到VC为支持ANSI C++ 所提供的所有头文件:
algorithm array bitset cassert ccomplex cctype cerrno cfloat ciso646 climits clocale cmath complex csetjmp csignal cstdarg cstddef cstdio cstdlib cstring ctime cwchar cwctype deque exception fstream functional hash_map hash_set iomanip ios iosfwd iostream istream iterator limits list locale map memory new numeric ostream queue random regex set sstream stack stdexcept streambuf string strstream tuple type_traits typeinfo [...]

Posted in inside VS C++ STL | Tagged C++, stl, vc, 头文件 | 1 Response

vc

  • auto_ptr_ref类深入剖析
  • STL之<memory>
  • STL之<utility>
  • inside visual studio C++ STL

Copyright © 2012 Lzp729@Blog.

Powered by WordPress and Hybrid, Theme By Lzp729.

RSS feed Site Map