关于STL元素
时间:2011-12-16
来源:互联网
大家好,源码和问题如下:
C/C++ code
输出结果:
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出来的元素呢?
请大家探讨以上两个问题,谢谢!
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()
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28