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


为什么会不一样?

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

相关文章推荐

python字典(dictionary)使用:基本函数code实例,字典的合并、排序、copy,函数中*args 和**kwargs做形参和实参

python字典dictionary,以前有过介绍,现就几个不常用函数写测试例子, 字典声明如,a={}; [python]dictionary方法说明:参考:http://blog.csdn.net...

C++ Class 构造时由于LazyMode 和 Copy Constructor导致的问题

这里写代码片reference: http://stackoverflow.com/questions/1993727/expanding-tuples-into-arguments...
  • norsd
  • norsd
  • 2017年07月27日 14:41
  • 101

C/C++指针形参的使用与陷阱

C/C++指针形参的使用与陷阱 转载自:http://www.cnblogs.com/wwillforever/archive/2010/12/11/1903061.html       最近写代...

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

1.什么是Copy Constructor? Copy Constructor 是一个特殊的构造函数,一般只有一个参数,这个参数一般是用const修饰的,对自己类的一个引用(reference)。...

C++拷贝构造函数语意学 copy constructor(The Semantics of Constructors)

使用copy constructor的三种情况有三种情况,会以一个object的内容作为另一个class object的初值。 1.显式的以一个object的内容作为另一个class object的...

C++类的拷贝构造(Copy constructor)函数隐藏陷阱

好长时间没写C++了,今天写了个很简单的String类,竟然调试了半天,最终发现了一个十分隐蔽的陷阱,写出来供大家分享。 C++中类的拷贝构造函数的作用就是通过类的一个对象来实例化另一个对象。下面是我...

深入探索C++对象模型笔记之四 —— 构造函数语意学 (Copy Constructor的建构操作)

 有三种情况,会以一个object的内容作为另一个class object的初值。 1.当对一个object做明确的初始化操作时 2.当object被当做参数交给某个函数时 3.当函数传回一个clas...

[C++]异常处理中的拷贝构造操作(copy constructor)

*书生注:就算More Effective C++的读后感吧 [问题] 下面这段代码中,类型T的复制拷贝操作(copy constructor)一共被调用几次? 如何改进来减少调用次数?能减少到几次...

《深度探索C++对象模型》:copy constructor

1.只有三种情况会调用copy constructor (1)X xx=x; (2)参数 (3)返回值2.bitwise copy semantice 按位直接复制,类似memset3.一个c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 使用表示容量的当个形参来初始化容器时,有没有使用copy constructor
举报原因:
原因补充:

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