C++ 使用表示容量的当个形参来初始化容器时,有没有使用copy constructor

原创 2015年11月21日 11:03:05

在知乎上的问题链接:

C++ 使用表示容量的当个形参来初始化容器时,有没有使用copy constructor?



测试代码:

//////////////////////////////////////////////////
        */
//////////////////////////////////////////////////


#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>
#include <list>
#include <string>
#include <vector>



std::fstream f("test.log",std::ios::out);



struct Noname
{
        //default constructor
        Noname():pstring(new std::string),i(0),d(0) {  f<<"default constructor called"<<std::endl;}
        // constructor
        Noname(int in,double dou):pstring(new std::string),i(in),d(dou) { f<<"constructor called"<<std::endl;}
        //copy constructor
        Noname (const Noname & no):pstring(new std::string),i(no.i),d(no.d)
        {
            f<<"copy constructor called"<<std::endl;
            *pstring = * (no.pstring);
        }

        //assign operator
        Noname& operator=(const Noname &);

        //destructor
        ~Noname()
        {
            f<<"destructor is called"<<std::endl;
            delete pstring;

        }

    public:
        std::string *pstring;
        int i;
        double d;
};



Noname& Noname::operator=(const Noname & no)
{
    f<<"assign operator called "<<std::endl;
    *pstring = * (no.pstring);
    i = no.i;
    d = no.d;
}



void fuck_test1(Noname no)
{

}


void fuck_test2(Noname & no)
{

}


Noname fuck_test3()
{
    Noname no;
    return no;
}

Noname&  fuck_test4()
{
    Noname no;
    return no;
}

int main(int argc,char* argv[])
{
    Noname test(5,3);
    f<<test.i<<"   "<<test.d<<std::endl;
    Noname test1(test);
    f<<test1.i<<"   "<<test1.d<<std::endl;
    Noname test2;
    f<<test2.i<<"   "<<test2.d<<std::endl;
    test2 =  test1;
    f<<test2.i<<"   "<<test2.d<<std::endl;

    if(true)
    {
        Noname testk(5,5);

    }

    Noname* pNoname = new Noname();
    delete pNoname;

    std::vector<Noname> Novect(5);



    fuck_test1(test);
    fuck_test2(test);
    fuck_test3();
    fuck_test4();




    return 0;
}


上段代码使用vs2015 或者code::blocks 下的gcc 在执行

std::vector<Noname> Novect(5)
语句时都是调用了5次 default constructor
</pre><pre name="code" class="cpp">而在linux 下直接用gcc(cygwin,是调用了一次default constructor 和5次copy constructor:
constructor called
5   3
copy constructor called
5   3
default constructor called
0   0
assign operator called
5   3
constructor called
destructor is called
default constructor called
destructor is called
<span style="color:#ff0000;">default constructor called
copy constructor called
copy constructor called
copy constructor called
copy constructor called
copy constructor called</span>
destructor is called
copy constructor called
destructor is called
default constructor called
destructor is called
default constructor called
destructor is called
destructor is called
destructor is called
destructor is called
destructor is called
destructor is called
destructor is called
destructor is called
destructor is called


为什么会不一样?

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ Copy Constructor (拷贝构造函数,复制构造函数)

1.什么是Copy Constructor? Copy Constructor 是一个特殊的构造函数,一般只有一个参数,这个参数一般是用const修饰的,对自己类的一个引用(reference)。...
  • fox64194167
  • fox64194167
  • 2014年03月14日 08:12
  • 6427

C++ Copy Constructor in depth (深入理解C++拷贝构造函数)

The copy constructor is a special kind of constructor which creates a new object which is a copy of ...
  • wangshubo1989
  • wangshubo1989
  • 2015年08月20日 08:38
  • 1480

常用容器制定初始化容量

前面在javaSe中我已经整理了相关的一些数据结构,现在就性能方面在这里做一个总结。以后在实际编码中,应该按照这样子来初始化相关的数据结构。 1,StringBuffer和StringBui...
  • u011794238
  • u011794238
  • 2015年10月16日 15:19
  • 1536

C++ copy constructor 构建

最近在看《深度探索C++对象模型》一书,里面讲到了C++ 拷贝构造函数的构建,这里做一下笔记,供以后查阅。 我们知道有三种情况类的对象调用拷贝构造函数 1,用一个对象对另外一个对象初始化。2,当该...
  • lazybin
  • lazybin
  • 2012年12月23日 14:00
  • 4237

复制构造函数(copy constructor)

定义:       只有单个形参,该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数。 使用方式: (1)显示使用----用一个同类型的对象初始化该对象时; (...
  • heyabo
  • heyabo
  • 2012年05月13日 10:52
  • 8914

C++对象的copy constructor与copy assignment的区别与联系

copy constructor: 从一个已有的对象来构造另一个对象; 包括: 用已有对象来初始化新声明的对象; 将对象按值传递给函数作为参数; 函数按值返回对象。 copy as...
  • lixiang212121
  • lixiang212121
  • 2015年05月05日 22:17
  • 1935

C++ - 使用copy函数打印容器(container)元素

使用copy函数打印容器(container)元素本文地址: http://blog.csdn.net/caroline_wendyC++可以使用copy函数输出容器(container)中的元素, ...
  • u012515223
  • u012515223
  • 2014年06月17日 08:44
  • 3533

一个类中静态容器对象的初始化问题

一个类中静态容器对象的初始化问题 某网友问: “ 一个类中,有一个成员变量static set SET,怎么用一个1000个元素给它初始化? ”   一个类中特...
  • caipengxiang
  • caipengxiang
  • 2015年05月13日 20:50
  • 457

C++对象模型——Copy Constructor 的建构操作(第二章)

2.2    Copy Constructor 的建构操作         有三种情况,会以一个object的内容作为另一个 class object的初值,最明显的一种情况就是对一个object做...
  • yiranant
  • yiranant
  • 2015年07月30日 23:25
  • 466

函数返回语句与copy (move) constructor, copy (move) assignment operator的关系

简单研究了一下函数按值返回和按引用返回过程中会调用的类的成员函数。
  • u011873969
  • u011873969
  • 2015年11月29日 00:05
  • 704
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 使用表示容量的当个形参来初始化容器时,有没有使用copy constructor
举报原因:
原因补充:

(最多只允许输入30个字)