2015-06-20 127 views
-1

Triny从网络测验,看到这段代码。打印结果为02当调用复制构造函数或赋值构造函数时?

这意味着默认复制构造函数用于列表初始化,而赋值构造函数用于矢量。为什么?

#include <algorithm> 
#include <iostream> 
#include <list> 
#include <vector> 

class Int 
{ 
public: 
    Int(int i = 0) : m_i(i) { } 

public: 
    bool operator<(const Int& a) const { return this->m_i < a.m_i; } 

    Int& operator=(const Int &a) 
    { 
     this->m_i = a.m_i; 
     ++m_assignments; 
     return *this; 
    } 

    static int get_assignments() { return m_assignments; } 

private: 
    int m_i; 
    static int m_assignments; 
}; 

int Int::m_assignments = 0; 

int main() 
{ 
    std::list<Int> l({ Int(3), Int(1) }); 
    l.sort(); 
    std::cout << (Int::get_assignments() > 0 ? 1 : 0); 

    std::vector<Int> v({ Int(2), Int() }); 
    std::sort(v.begin(), v.end()); 
    std::cout << (Int::get_assignments() > 0 ? 2 : 0) << std::endl; 

    return 0; 
} 

回答

1

这意味着默认的拷贝构造函数用于列表初始化而分配的构造函数用于向量

如果去掉std::sort(v.begin(), v.end());指令程序打印00。赋值运算符仅用于排序。

注意:该列表可以简单地通过修改指针排序(因此l.sort()不需要operator=)。