#include <iostream>
#include <vector>
using namespace std;
class Obj
{
public:
Obj(void){cout<<"Obj(void)"<<" "<<countOne<<endl;countOne++;}
Obj(int x){cout<<"Obj(int x)"<<" "<<countThree++<<endl;}
Obj(const Obj &b) {cout<<"复制构造函数:"<<endl;}
~Obj(void){cout<<"Destroy"<<" "<<countTwo++<<endl;}
void GetCount(int x){ countOne = x;}
private:
static int countOne;
static int countTwo;
static int countThree;
static int countFour;
};
int Obj::countOne();
int Obj::countTwo();
int Obj::countThree();
int main (void)
{
vector<Obj> obj();
vector<Obj> obj2(,); return ;
}

结果如下:

//执行了构造函数2次,20次复制构造函数,析构函数22次

//我想提出的问题是上图中第1-3行

//在第一次使用vector和第二次使用vector之间为什么执行一次析构函数

//[补充]这是老师的回答

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

class Obj
{
public:
Obj(void){cout<<"Obj(void)"<<" "<<countOne<<endl;countOne++;}
Obj(int x){cout<<"Obj(int x)"<<" "<<countThree++<<endl;}
~Obj(void){cout<<"Destroy"<<" "<<countTwo++<<endl;}
void GetCount(int x){ countOne = x;}
private:
static int countOne;
static int countTwo;
static int countThree;
};

int Obj::countOne(0);
int Obj::countTwo(0);
int Obj::countThree(0);

int main (void)
{

//关于vector的说明以及其构造函数与析构函数
//以下调用是调用的vector<Obj>模板类的构造函数 vector(size_type n, const Obj& v = Obj()); 
//在vector的构造函数调用过程中使用了默认形参const Obj& v= Obj(),会自动调用一次Obj的默认构造函数,
//然后vector类的构造函数内部中会自己调用Obj的拷贝构造函数创建10个拷贝,离开vector的构造函数后会自动调用Obj的析构函数销毁默认形参v
vector<Obj> obj(10);
//以下调用也是调用了vector<Obj>模板类的构造函数 vector(size_type n, const Obj& v = Obj());
//不同的是第二个参数传递的本应是一个Obj类型的引用或不设置,而这里却使用了整型参数,但这不是错误,因为做使用参数传递时,系统会自动
//寻找是匹配的参数,如果没有匹配的参数,还会用参数去匹配类类型的形参的构造函数参数,这里就是这种情况,这里是使用了Obj类的构造函数Obj(int x)
//同样,在vector类的构造函数内部中会自己调用Obj的拷贝构造函数创建10个拷贝,离开vector的构造函数后会自动调用Obj的析构函数销毁自动构造的形参
vector<Obj> obj2(10,0);

return 0;
//在离开main函数时会调用vector的析构函数,它会自动调用其内嵌对象obj 2*10(两个vector对象,里面各有10个obj对象)次。
//所以其结果是两次构造函数(一次Obj(void),一次Obj(int x),另外20构造函数是调用Obj类的默认拷贝构造函数Obj(const Obj&),所有没有输出),22次析构函数。
}

C\C++ vector 构造函数 & 析构函数的更多相关文章

  1. C++构造函数/析构函数 设置成private的原因

    C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...

  2. C++反汇编第一讲,认识构造函数,析构函数,以及成员函数

    C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...

  3. C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数

    C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...

  4. C++ 中的类构造函数 & 析构函数

    类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可用于为某些成员变量设置 ...

  5. c++基础语法 构造函数 析构函数 类的组合

    1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...

  6. c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

    每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A ...

  7. c#类 对象 构造函数 析构函数——面向对象

    类: 也是复杂数据类型 也是需要我们先定义出类型,才能使用它的数据 对象: 是通过模板类实例化出来的个体,具有具体的属性和行为(方法),对象是不能索引到静态方法. 对象的生命周期 构造—— 使用—— ...

  8. C++ 构造函数+析构函数

    3-2 构造函数的调用 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握构造函数和析构函数的调用: 创建类A:类中仅包含构造函数和析构 ...

  9. C++ 构造函数 析构函数 虚函数

    C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup ...

随机推荐

  1. html5中高德、腾讯、百度 地图api调起手机app

    html 部分 <div id="mapBg"> <div class="mapTab"> <a href="" ...

  2. 基于Maven + SSM (Spring、SpringMVC、Mybatis)构建一个简单的测试项目

    最近在公司实习期间的培训交流中有机会接触到SSM,然后自己花费1周的时间投入学习.谈不上深刻理解其中原理,所以没有涉及理论知识,只是浅层次的学习如何使用,在此将学习过程记录整理出来,一方面自己备用:另 ...

  3. Ubuntu加入opencv库的环境变量

    1.用gedit打开/etc/ld.so.conf 终端输入: sudo gedit /etc/ld.so.conf 文件末行加入:include /usr/loacal/lib .然后终端执行指令: ...

  4. <Android 基础(二十五)> View Animation

    简介 视图动画,主要包括位移,透明度,旋转和缩放,View本身的属性并没有发生变化,只是在这个视图上添加一些渐变的效果,所以总体而言,视图动画只能实现一些简单的动画效果,属性动画功能更强大. 使用 r ...

  5. Maven + Spring4

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. 使用cancelBubble竟然可以阻止所有浏览器的冒泡?

    以前一直以为cancelBubble是IE8及以下的专属,今天做一个测试的时候意外发现了所有浏览器都支持,便提出来希望有哪位解释下. 1.使用原生js在FF下和chrome下两种方法都可以阻止冒泡 d ...

  7. Entity Framework工具POCO Code First Generator的使用

    在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...

  8. Flask的错误日志处理和|ORM操作

    flask有个很人性化的处理就是 你的错误的输出是可以通过错误日志来自定义  ,让你输入的错误不再是“大黄页”, 通过 errorhandler()来装饰函数之后你的所有的输入错误的函数你都会进入这个 ...

  9. 使用jqGrid过程中出现的问题

    在使用jqGrid过程中,需要后台查询数据添加到表格中,在js中循环调用addRowData方法时出现浏览器崩溃现象. 原因:jqGrid的addRowData方法中做了一系列的处理,在后台返回数据量 ...

  10. Lambda表达式学习记录

    Lambda表达式可以简化C#编程的某些方面,用法非常灵活.因此也不容易掌握. 下边是我学Lambda表达式的一点记录. 1.Lambda表达式是与委托紧密联系的.只要有委托参数类型的地方,就可以使用 ...