拷贝构造函数被调用的情形

来源:互联网 发布:media buy 知乎 编辑:程序博客网 时间:2024/05/17 06:15

拷贝构造函数被调用的情形

 

今天老师问一道题:

C/C++ code

 

#include<iostream>

usingstd::cout;

usingstd::endl;

classMyClass

{

public:

       MyClass(int a=0,int b=0) { m = a+b; count++; }

    MyClass(MyClass& ob) { m =ob.m; count++; }

    static int count;

private:

    int m;

};

intMyClass::count=0;

MyClass fun(MyClass& ob)

{

     MyClass myob = ob;

     return myob;

}

 

intmain()

{

    MyClass obar[3];

    fun(obar[0]);

   cout<<MyClass::count<<endl;

}

 


写输出结果。当时答4,老师说答案是5.回来后测试了一下,MinGW下是4,VC6.0下是5。求解,返回值为类对象时到底会不会调用拷贝构造函数?C++标准有这方面的说明吗?

 

 

 

 

答案:

1.  这就是理论与现实的差别,

Google “具名返回值优化”

2.  A

3.#include<iostream>
4.using std::cout;
5.using std::endl;
6.class MyClass
7.{ 
8.public:
9.    MyClass(int a=0,int b=0) { m = a+b; count++; }
10.          MyClass(MyClass& ob) { m = ob.m; count++; }
11.          static int count;
12.      private:
13.          int m;
14.      };
15.      int MyClass::count=0;
16.      MyClass fun(MyClass& ob)
17.      { 
18.          MyClass myob = ob;//4
19.          return myob;//5你返回值还要占用一个拷贝构造函数
20.      }
21.       
22.      int main()
23.      {
24.          MyClass obar[3];//3
25.          fun(obar[0]);
26.          cout<<MyClass::count<<endl;
27.      }
28.       

 

B

#include<iostream>
using std::cout;
using std::endl;
class MyClass
{ 
public:
    MyClass(int a=0,int b=0) { m = a+b; count++; }
    MyClass(MyClass& ob) { m = ob.m; count++; }
    static int count;
private:
    int m;
};
int MyClass::count=0;
MyClass & fun(MyClass& ob)//这样修改就是4 按引用和值拷贝
{ 
    MyClass myob = ob;//4
    return myob;
}
 
int main()
{
    MyClass obar[3];//3
    fun(obar[0]);
    cout<<MyClass::count<<endl;
}
 

 

    具体的设计一些编译器的优化 不过一般的还是5

3int MyClass::count=0;
MyClass fun(MyClass& ob)

  MyClass myob = ob;
  return myob;
}

构造函数3个,myob初始化(MyClass myob = ob;这里调用的是拷贝构造函数)1个,返回值1个,共5

 

0 0
原创粉丝点击