#include <map>
#include <stdio.h>
using namespace std;
class Test
{
public:
Test()
{
printf("1111 %p\n", this);
}
Test(const Test &test)
{
printf("2222 %p %p\n", this, &test);
}
Test& operator=(const Test &test)
{
printf("3333 %p %p\n", this, &test);
}
};
int main()
{
map<int, Test> mapTmp;
Test a;
printf("hello\n");
mapTmp[1] = a;
return -1;
}
列印結果:
1111 0x7ffd293db95b
hello
1111 0x7ffd293db8ef
2222 0x7ffd293db914 0x7ffd293db8ef
2222 0x2455054 0x7ffd293db914
3333 0x2455054 0x7ffd293db95b
我所知的分析:0x7ffd293db95b這個物件是a,0x2455054這個物件是map中在紅黑樹上構建好的Test物件。
問題:求解釋最后四行列印解釋,每一行被列印的物件分別是什么,以及為什么是呼叫相應的函式,感謝
uj5u.com熱心網友回復:
這里主要是map的operator[]成員方法實作;當map中不存在該元素時,該函式使用鍵插入新元素,并回傳對其映射值的參考。請注意,即使沒有為元素分配映射值(使用其默認建構式構造元素),這也會將容器大小增加一個;等同于(*((this->insert(make_pair(k,mapped_type()))).first)).second
上面代碼的27行就等同于:(*((mapTmp.insert(make_pair(1,Test()))).first)).second = a;
那么最后四行的列印分別對應于
make_pair(1,Test())
==> 默認構造方法:1111 0x7ffd293db8ef
==> 拷貝構造方法:2222 0x7ffd293db914 0x7ffd293db8ef (make_pair創建一個pair物件,會呼叫pair的構造方法pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) { },故此處呼叫了Test拷貝構造方法)
mapTmp.insert(make_pair(1,Test())
==> 拷貝構造方法:2222 0x7ffd293db914 0x7ffd293db8ef (map的insert方法,呼叫pair的拷貝構造方法,進而呼叫Test的拷貝構造方法)
(*((mapTmp.insert(make_pair(1,Test()))).first)).second = a
==> 賦值構造方法:3333 0x2455054 0x7ffd293db95b (呼叫operator=構造方法)
uj5u.com熱心網友回復:
c++98標準 g++實作,先mapped_type()默認構造一個,再拷貝構造成value_type即std::pair的成員,然后整個pair被拷貝構造進紅黑樹,所以有兩次拷貝構造:
mapped_type&
operator[](const key_type& __k)
{
// concept requirements
__glibcxx_function_requires(_DefaultConstructibleConcept<mapped_type>)
iterator __i = lower_bound(__k);
// __i->first is greater than or equivalent to __k.
if (__i == end() || key_comp()(__k, (*__i).first))
#if __cplusplus >= 201103L
__i = _M_t._M_emplace_hint_unique(__i, std::piecewise_construct,
std::tuple<const key_type&>(__k),
std::tuple<>());
#else
__i = insert(__i, value_type(__k, mapped_type())); //c++98:先mapped_type()默認構造一個,再拷貝構造成value_type即std::pair的成員,然后整個pair被拷貝構造進紅黑樹,所以有兩次拷貝構造。
#endif
return (*__i).second;
}
c++11之后就直接在紅黑樹上默認構造了,不需要拷貝構造。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/15822.html
標籤:C++ 語言
上一篇:BUTTON 的setstat會導致按鈕的點擊函式被執行兩次
下一篇:C++工控方面怎么提升?
