#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不可见标签,及标签属性(元素对象属性) a href target name id 相对路径

    标签属性分类(元素对象属性) 不可见标签与可见标签: <head></head>        属于不可见标签, 里面的内容一般用于css还有全局的一些变量,声明等. 而且如果 ...

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

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

  3. opencv图像处理时使用stringstream批量读取图片,处理后并保存

    简介: 同文件输入输出流一样,使用stringstream可以批量读取图片,处理后并进行保存.因为C++中头文件 stringstream既可以从string读数据也可向string写数据,利于其这个 ...

  4. java 内存分析之方法返回值二

    package Demo; class Point { private double x, y; public Point(double x, double y) { this.x = x; this ...

  5. Django Redis验证码 密码 session 实例

    1.settings CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCach ...

  6. Windows 安装 python MySQLdb模块

    pip install wheel 去这个网站查找whl格式的MYSQL-python http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python ...

  7. map合并,相同键对应的值相加

    最近在做统计钱的计算时遇到的一个需求,需要将一个大类别下的每一种钱进行特定的运算然后获得六年的钱,最后将这些钱按照年份进行汇总,获得总得大类型的六年的钱,在这个过程中采用了这种方法,每次算得钱放在ma ...

  8. ORACLE闪回机制分析与研究应用

    1.查看数据库归档和闪回状态,及环境准备SQL> archive log list;SQL> select flashback_on from v$database;关闭数据库,启动归档和 ...

  9. 用block将UIAlertView与UIActionSheet统一起来

    用block将UIAlertView与UIActionSheet统一起来 效果 1. 将代理方法的实例对象方法转换成了类方法使用 2. 要注意单例block不要长期持有,用完就释放掉 源码 https ...

  10. [控件] 心形加载的view

    心形加载的view 效果: 素材图片: 源码: StarView.h 与 StarView.m // // StarView.h // Star // // Created by XianMingYo ...