复制构造函数被触发但如何?

时间:2016-12-07 18:53:55

标签: c++ copy copy-constructor

这是我的代码:

#include <iostream>
#include <cstring>
using namespace std;

class someClass{
    char * data;
public:
    someClass(const char * s){
        data = new char[strlen(s)+1];
        strcpy(data,s);
        cout << "constructing.."<<endl;
    }

    someClass(const someClass &o){
        data = new char[strlen(o.data)];
        strcpy(data,o.data);
        cout << "copy construction" << endl;
    }

    ~someClass(){delete [] data; cout << "destructing..." << endl;}
    char * getValue(){return data;}
};

void showValue(someClass o){
    char * s;
    s = o.getValue();
    cout << s << endl;
}

int main(int argc, char ** argv){
    someClass str("Hello"), ptr("world");
    showValue(str);
    showValue(ptr);
}

,输出为:

constructing..
constructing..
copy construction
Hello
destructing...
copy construction
world
destructing...
destructing...
destructing...
  1. 现在前两个&#39;构建..&#39;我们在第1行的main()中创建对象时会立即触发。

  2. showValue( str )运行并触发单词&#39; hello&#39;的复制构造函数。 如何?创建和临时对象后,它会在功能失效时自行破坏。

  3. showValue( ptr )运行并触发单词&#39; world&#39;的复制构造函数。 如何?创建和临时对象后,它会在功能失效时自行破坏。

  4. 最后,我们的str和ptr对象以相反的顺序被销毁。

  5. 为什么要复制ctor?我没有将someClass对象发送到someClass对象。你能解释一下情况吗?

2 个答案:

答案 0 :(得分:4)

致电

时正在制作副本
void showValue(someClass o)

如果您想避免复制,请参考

void showValue(someClass const& o)

在第一种情况下,osomeClass参数的函数本地副本,在函数结束时被销毁。

答案 1 :(得分:2)

void showValue(someClass o){
    char * s;
    s = o.getValue();
    cout << s << endl;
}

你的cade的这一部分调用someClass的复制构造函数。 如果你想摆脱它,你可以将你的班级改为:

 void showValue(const someClass & o){
        char * s;
        s = o.getValue();
        cout << s << endl;
    }

并将GetValue更改为:

 char * getValue() const {return data;} 

这被称为传递const-reference,而不是传递值(你正在做什么)。当您传递值时,该函数将调用名为。

的类的复制构造函数

建议对getValue()进行更改是因为编译器希望确保对getValueshowValue的调用不会修改const元素{{1}的成员对象}。