复制构造函数是触发的,但是如何触发

copy constructor is triggered but how?

本文关键字:何触发 构造函数 复制      更新时间:2023-10-16

这是我的代码:

#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. 现在,一旦我们在第1行中的main()中创建对象。

  2. showvalue( str )运行,它触发" Hello"一词的复制构造函数。如何?创建和临时对象后,它在功能不足时会破坏自身。

  3. showvalue( ptr )运行,它触发了"世界"一词的复制构造函数。如何?创建和临时对象后,它在功能不足时会破坏自身。

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

为什么复制CTOR运行?我没有将躯体对象发送到躯体物体。你能向我解释一下情况吗?

您正在调用

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

如果要避免副本,请传递参考

void showValue(someClass const& o)

在第一种情况下,o是您的someClass参数的函数本地副本,在功能末尾被破坏。

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()上的更改是因为编译器希望确保showValue内部对getValue的调用不会修改const元素const someClass & o的成员对象。