下面是代码,让我感到困惑:
class Simple{
private:
int m_nID;
public:
Simple(int nID) {
m_nID = nID;
}
~Simple() {
std::cout << "Destructing Simple " << m_nID << std::endl;
}
Simple(const Simple& other) {
m_nID = other.m_nID;
};
};
int main(){
Simple Simple1(1); // allocating on stack
Simple Simple2(2); //
Simple Simple3(3); //
std::vector<Simple> m;
m.push_back(Simple1); //
m.push_back(Simple2); // copy constructor called
m.push_back(Simple3); //
std::cout << "\n------ ERASING ELEMENTs FROM VECTOR-------" << std::endl;
m.erase(m.begin()); //
m.erase(m.begin()); // destructor called
m.erase(m.begin()); //
std::cout << "\n------ After ERASING ELEMENT FROM VECTOR-------" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这三行:
m.erase(m.begin());
m.erase(m.begin());
m.erase(m.begin());
Run Code Online (Sandbox Code Playgroud)
导致此输出:
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Run Code Online (Sandbox Code Playgroud)
为什么m_nID总是3?对于每个push_back复制构造函数,将1,2,3复制到m_nID,因此不应该是:
Destructing Simple 1 // or 3
Destructing Simple 2 // or 2
Destructing Simple 3 // or 1
Run Code Online (Sandbox Code Playgroud)
?
如何std::vector删除第一个元素?它将所有元素复制下来(使用赋值),然后破坏最后一个元素.尝试检测复制构造函数和赋值,你会看到发生了什么.(push_back如果向量必须增加其容量,您在执行此操作时也可能会看到一些意外的副本.)
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |