作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] operator overloading
时间Tue Oct 20 10:25:07 2009
※ 引述《ACMTino (哈哈哈)》之铭言:
: 标题: [问题] operator overloading
: 时间: Tue Oct 20 01:55:03 2009
:
: List Test::GetList()
: {
: return m_oList;
: }
:
: Test oTest;
: List oList = oTest.GetList();
当你这样写的时候
[修正]
- 实际上是呼叫一次 copy-assignment (oTest.GetList)
- 以及一次 copy-constructor
- 不过前面那个 copy-assignment 被 RVO 消掉了
- 所以没呼叫到 List::operator=
[/修正]
原本会呼叫两次 copy-constructor
不过其中一次被 copy elision 的规则消除掉了
所以只呼叫一次 copy-constructor
而不会呼叫 List::operator=
: 这样子做还是会取得 m_oList, 等於 oList 是 m_oList 的别名
: 那修改 oList 就会改到 m_oList
不会
都 copy 两次了当然不会是别名 (虽然实际上只 copy 一次)
:
: 请问要怎麽做才能避免修改到 m_oList, 或是能够 overloading operator
: 让 GetList() 回传 copy value
虽然你目前的 code 的确是取得 copy value 没错
但明显是
误打误撞的结果
因为 operator= 的内容就是错的
如果是我会这样写...
: class List
: {
: public:
: List() {}
: ~List() {}
: //
: Ele Get(int index) { return m_vEle[index]; }
: //
: bool Add(const char *sName)
: {
: Ele Ele;
: strcpy(Ele.sName, sName);
strncpy(Ele.sName, sName, MAX_NAME_LENGTH-1);
: m_vEle.push_back(Ele);
return true;
: }
: int GetSize() { return (int)m_vEle.size(); }
: //
: void Clear() { m_vEle.clear(); }
: List operator=(const List &rhs)
List& operator=(const List &rhs)
: {
: printf("....\n");
: if(this == &rhs) return *this;
: this->Clear();
m_vEle = rhs.m_vEle;
: return *this;
: }
: //
: private:
: vector<Ele> m_vEle;
: };
:
:
: class Test
: {
: public:
: //
: Test()
: {
: m_oList.Add("XD");
: }
: ~Test() {}
: //
: List GetList()
List& GetList()
: {
: return m_oList;
: }
:
: void Dump()
: {
: for(int i=0; i<m_oList.GetSize(); ++i)
: {
: printf("%s\n", m_oList.Get(i).sName);
: }
: }
:
: private:
: List m_oList;
: };
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.29.108
1F:推 holymars:inline function应该不会发生RVO.. 10/20 10:43
2F:→ holymars:List oList = oTest.GetList(); 应该直接会变成 10/20 10:43
3F:→ holymars:List oList(oTest.m_oList); 10/20 10:44
4F:→ holymars:上面这行是pseudo code,直接写这样会因为private不给过 10/20 10:45
5F:→ holymars:但是Compiler的inline optimization应该是把code转成类 10/20 10:45
6F:→ holymars:似这样吧.. 10/20 10:45
7F:→ littleshan:inline 与否并不影响程式码的语意 10/20 11:56
8F:→ littleshan:若强制要求 compiler 不去 inline,上述程式码结果不变 10/20 11:57
9F:→ littleshan:因此 RVO 是比较 generalized 的解释方法 10/20 11:58
10F:推 QQ29:C++ 有修饰字可以叫她不要inline嘛!? 10/20 12:08
11F:→ james732:gcc extension有noinline的能力 标准C++好像没有 10/20 12:24
12F:→ littleshan:gcc -fno-inline 10/20 12:30
13F:推 holymars:RVO是因为Compiler会把return value当成参数传进function 10/20 13:02
14F:→ holymars:里才会有的optimization吧..如果函式本身inline 10/20 13:03
15F:→ holymars:就不用把return value放在参数列上,自然也不会进行 10/20 13:03
16F:→ holymars:RVO啊.. 10/20 13:03
※ 编辑: littleshan 来自: 140.112.29.108 (10/21 12:22)