,下面這段代碼會引起異常,因為所有權已經轉移,而通過by reference方式傳遞auto_ptr更是糟糕的
若改為: const auto_ptr<int> p(new int);則會在編譯時提示錯誤.是以我們可以通過常數型auto_ptr來終結所有權轉移,它并不是表示你不能更改auto_ptr所擁有的對象,而是不能更改auto_ptr的擁有權,就此特性而言,它比較類似常數指針,而不是指向常數的指針.
複制代碼
template <typename T>
void bad_print(auto_ptr<T> p)
{
if(p.get()==NULL)
cout<<"null";
else
cout<<*p;
}
int main(int argc, char* argv[])
auto_ptr<int> p(new int);
*p = 42;
bad_print(p);
*p = 3;
return 0;
2,auto_ptr之間不能共享擁有權,一個auto_ptr不能指向另一個auto_ptr所擁有的對象,否則當一個指針删除該對象後,就糟糕了.auto_ptr不能指向數組,因為它是通過delete而不是delete[]來釋放其所擁有的對象.它也不是一個引用計數型指針.因為在拷貝和指派後,原來的auto_ptr和新産生的auto_ptr并不相等,而是原auto_ptr會交出擁有權,而不是拷貝給新auto_ptr,是以也不要将auto_ptr作為标準容器的元素.
3,下面重載的輸出運算符的第二個參數是一個const reference,是以并沒有發生擁有權的轉移.
template <class T>
ostream& operator<< (ostream& strm, const auto_ptr<T>& p)
// does p own an object ?
if (p.get() == NULL)
strm << "NULL"; // NO: print NULL
}
else {
strm << *p; // YES: print the object
return strm;
4,容器可分為兩類:1)序列式容器,這是ordered collection,每個元素都有固定位置,取決于插入時機和地點,和元素值無關.它們是:vector,deque,list;2)關聯式容器.這是sorted collection,元素位置取決于特定的排序準則,它們是:set,multiset,map,multimap.
關聯式容器自動對其元素排序,并不意味着它們就是用來排序的,這隻疊是它的一個副作用而已.
5,每個容器将其疊代器以嵌套的方式定義于内部,是以各種疊代器的接口相同,類型卻不同.疊代器有以下兩種類型:1)雙向疊代器.可以雙向行進:以遞增運算前進或以遞減運算後退,list,set,multiset,map和multimap提供的疊代器都是此類.2)随機存取疊代器.不僅具備雙向疊代器的所有屬性,還具備随機通路能力.它們提供了”疊代器算術運算”必要的操作符.可以對疊代器增加或減少一個偏移量,處理疊代器之間的距離,或是使用<和>之類的相對關系操作符來比較兩個疊代器.vector,deque和strings所提供的疊代器都屬于此類.為了寫出盡可能與容器類型無關的泛型程式代碼,最好不使用随機存取疊代器的特有操作.
本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2008/08/19/1270922.html,如需轉載請自行聯系原作者