+ -
当前位置:首页 → 问答吧 → 关于STL元素

关于STL元素

时间:2011-12-16

来源:互联网

大家好,源码和问题如下:
C/C++ code

#include <iostream>
#include <vector>
using namespace std;

class Test
{
public:
  Test(int i)
  {
    this->i=i;
    cout<<i<<endl;
  }

  virtual ~Test()
  {
    cout<<this->i<<" ~Test()"<<endl;
  }
private:
  int i;
};

int main ()
{
  Test test1(1);
  Test test2(2);
  vector<Test> first;
  vector<Test> second;
  first.push_back(test1);
  second.push_back(test2);

  second=first;
  first=vector<Test>();

  cout << "Size of first: " << int (first.size()) << endl;
  cout << "Size of second: " << int (second.size()) << endl;
  return 0;
}



输出结果:
1
2
1 ~Test()
Size of first: 0
Size of second: 1
1 ~Test()
2 ~Test()
1 ~Test()

问题1.请问为什么执行语句“first=vector<Test>();”会导致first元素析构,但是执行语句“second=first;”不会导致second元素析构呢?
问题2.栈元素test1、test2在容器释放的时候调用了一次析构函数,自己生命周期结束有调用一次,是否不妥?
一般情况,容器的元素是否只能是new出来的元素呢?

请大家探讨以上两个问题,谢谢!

作者: chennut0802   发布时间: 2011-12-16

Test test1(1);//test1调用构建函数,输出1
  Test test2(2);//test2调用构建函数,输出2
  vector<Test> first;
  vector<Test> second;
  first.push_back(test1);//复制复本,调用默认拷贝构造函数,LZ没实现,所以没输出任何东西
  second.push_back(test2);//复制复本,调用默认拷贝构造函数,LZ没实现,所以没输出任何东西

  second=first;//first与second大小相同,所以直接把first的内容赋值给second的内容。即调用默认赋值函数,LZ没实现,所以没输出任何东西
  first=vector<Test>();//first与vector<Test>()大小不同,所以先清空first(调用析构函数),输出1 ~Test()

  cout << "Size of first: " << int (first.size()) << endl;//输出 Size of first: 0
  cout << "Size of second: " << int (second.size()) << endl;//输出 Size of first: 1
  return 0;

//test1析构,输出:1 ~Test()
//test2析构,输出:2 ~Test()
//second析构,调用其元素的析构函数,输出:1 ~Test()

作者: wqvbjhc   发布时间: 2011-12-16

C/C++ code
Test test1(1);//test1调用构建函数,输出1
  Test test2(2);//test2调用构建函数,输出2
  vector<Test> first;
  vector<Test> second;
  first.push_back(test1);//复制复本,调用默认拷贝构造函数,LZ没实现,所以没输出任何东西
  second.push_back(test2);//复制复本,调用默认拷贝构造函数,LZ没实现,所以没输出任何东西

  second=first;//first与second大小相同,所以直接把first的内容赋值给second的内容。即调用默认赋值函数,LZ没实现,所以没输出任何东西
  first=vector<Test>();//first与vector<Test>()大小不同,所以先清空first(调用析构函数),输出1 ~Test()

  cout << "Size of first: " << int (first.size()) << endl;//输出 Size of first: 0
  cout << "Size of second: " << int (second.size()) << endl;//输出 Size of first: 1
  return 0;

//test1析构,输出:1 ~Test()
//test2析构,输出:2 ~Test()
//second析构,调用其元素的析构函数,输出:1 ~Test()

作者: wqvbjhc   发布时间: 2011-12-16

mark~

作者: sunnyorange   发布时间: 2011-12-16