对于Visual C++开发工具进行学习指导

开发 后端
Visual C++和Borland C++ Builder是Windows操作系统上常见的C++开发工具。前者是微软公司出品的,应用广泛。。。。

本文主要讲述Visual C++,怎样创建Visual C++项目。如何编制Visual C++的代码,这些内容都是一些门户网站和技术论坛找到的,中间可能有不少错误是我没有挑出的,欢迎大家指正。

它将指针包装成了类,并且重载了反引用(dereference)运算符operator *和成员选择运算符operator ->,以模仿指针的行为。关于auto_ptr<>的具体细节,参阅《The C++ Standard Library》(中译本:C++标准库)。

例如以下Visual C++代码,

  1. #include < cstring > 
  2. #include < memory > 
  3. #include < iostream > 
  4. class string  
  5. {  
  6. public:  
  7. string(const char* cstr) { _data=new char [ strlen(cstr)+1 ]; strcpy(_data, cstr); }  
  8. ~string() { delete [] _data; }  
  9. const char* c_str() const { return _data; }  
  10. private:  
  11. char* _data;  
  12. };  
  13. void foo()  

由于str是函数的局部对象,因此在函数退出点生存期结束,此时auto_ptr<string>的析构函数调用,自动销毁内部指针维护的string对象(先前在构造函数中通过new表达式分配而来的),并进而执行string的析构函数,释放为实际的字符串动态申请的内存。在string中也可能管理其他类型的资源,如用于多线程环境下的同步资源。下图说明了上面的过程。

  1. auto_ptr < string > str1( new string( < str1 > ) );  
  2. cout << str1->c_str();  
  3. auto_ptr < string > str2(str1); // str1内部指针不再指向原来的对象  
  4. cout << str2->c_str();   
  5. cout << str1->c_str(); // 未定义,str1内部指针不再有效 

现在我们拥有了最简单的废料收集机制(我隐瞒了一点,在string中,你仍然需要自己编码控制对象的动态创建和销毁,但是这种情况下的准则极其简单,就是在构造函数中分配资源,在析构函数中释放资源,就好像飞机驾驶员必须在起飞后和降落前检查起落架一样。),即使在foo函数中发生了异常,str的生存期也会结束,C++保证自然退出时发生的一切在异常发生时一样会有效。

auto_ptr<>只是智能指针的一种,它的复制行为提供了所有权转移的语义,即智能指针在复制时将对内部维护的实际指针的所有权进行了转移,例如:

  1. template < typename T > 
  2. class shared_ptr  
  3. {  
  4. private:  
  5.   class implement  // 实现类,引用计数  
  6.   {  
  7.   public:  
  8.     implement(T* pp):p(pp),refs(1){}  
  9.       
  10.     ~implement(){delete p;}  
  11.       
  12.     T* p; // 实际指针  
  13.     size_t refs; // 引用计数  
  14.   };  
  15.   implement* _impl;  
  16.    
  17.    
  18. public:  
  19.   explicit shared_ptr(T* p)  
  20.     :  _impl(new implement(p)){}  
  21.    
  22.    
  23.   ~shared_ptr()  
  24.   {  
  25.     decrease();  // 计数递减  
  26.   }  
  27.    
  28.    
  29.   shared_ptr(const shared_ptr& rhs)  
  30.     :  _impl(rhs._impl)  
  31.   {  
  32.     increase();  // 计数递增  
  33.   } 

某些时候,需要共享同一个对象,此时auto_ptr就不敷使用,由于某些历史的原因,Visual C++的标准库中并没有提供其他形式的智能指针,走投无路了吗?在main()函数中,先调用foo1(val),函数中使用了一个局部对象temp,它和val共享同一份数据,并修改了实际值。

函数返回后,val拥有的值同样也发生了变化,而实际上val本身并没有修改过。然后调用了foo2(val),函数中使用了一个无名的临时对象创建了一个新值,使用赋值表达式修改了val,同时val和临时对象拥有同一个值,函数返回时,val仍然拥有这正确的值。

责任编辑:chenqingxiang 来源: 博客园
相关推荐

2010-01-21 10:44:59

Visual C++

2010-01-26 17:44:32

Visual C++开

2010-01-19 14:54:58

Visual C++

2010-01-20 11:02:42

C++开发环境

2010-03-01 15:57:59

Python开发工具

2010-01-12 09:59:08

Visual C++

2010-01-12 14:22:26

Visual C++

2010-01-18 15:40:37

Visual C++工

2010-01-11 10:19:57

C++开发工具

2010-01-15 15:13:28

C++概述

2010-01-08 17:01:46

C++开发工具

2010-09-29 14:06:09

Visual Basi

2010-01-13 14:35:10

Visual C++

2010-01-20 10:49:29

Visual C++界

2010-01-11 11:02:59

Visual C++

2017-04-11 08:50:22

应用开发云服务开源

2010-01-18 14:41:52

Visual C++开

2010-01-13 10:09:24

C++标准库

2010-01-18 15:19:41

Visual C++开

2009-08-07 10:53:59

Visual C#Excel
点赞
收藏

51CTO技术栈公众号