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
  • 56

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

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

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.当函数传回一个class...

[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...

Inside the C++ Model第二讲之 Copy Constructor的构造操作

Default Memberwise Initialization如果class没有提供一个explicit copy constructor又当如何呢?当class object以”同一个class...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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