Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写复制构造函数来复制指针?_C++_Oop_Memory Management - Fatal编程技术网

C++ 如何编写复制构造函数来复制指针?

C++ 如何编写复制构造函数来复制指针?,c++,oop,memory-management,C++,Oop,Memory Management,我有一个简单的课程: class Device { std::string _serialNumber; DeviceInfo(std::string serialNumber){ _serialNumber = serialNumber; } } 现在我创建了一个指针变量: Device *device1 = new Device(); 我想复制device1的内容,但device2应该指向不同的内存 Device *devic

我有一个简单的课程:

class Device {
      std::string _serialNumber;

      DeviceInfo(std::string serialNumber){
            _serialNumber = serialNumber;
      }
}
现在我创建了一个指针变量:

Device *device1 = new Device();
我想复制device1的内容,但device2应该指向不同的内存

Device *device2 = device1;
这显然不起作用,因为device2仍然指向device1的内存地址


如何使用复制构造函数实现这一点?谢谢。

当您有一个成员变量不能被简单地复制时,您需要一个自定义的复制构造函数

例如:

如果类中有int*memVar,因为如果它被简单地复制,那么新对象的memVar将与源对象的memVar包含的地址相同

现在,可以轻松地复制类对象而不会出现问题,因此不需要自定义复制构造函数

最后一行与复制构造函数无关。如果您想让一个ptr指向某个对象(如*device1)的副本,可以按如下操作

Device *devicePtr1 = new Device{};
Device deviceCopy = Device {*devicePtr1};//using the trivial cpy ctor

Device * devicePtr2 = &deviceCopy;//Now define your new pointer
或者你也可以直接简化最后两行,就像cigien说的那样

Device *devicePtr2 = new Device{*devicePtr1};

当无法简单地复制成员var时,需要自定义复制构造函数

例如:

如果类中有int*memVar,因为如果它被简单地复制,那么新对象的memVar将与源对象的memVar包含的地址相同

现在,可以轻松地复制类对象而不会出现问题,因此不需要自定义复制构造函数

最后一行与复制构造函数无关。如果您想让一个ptr指向某个对象(如*device1)的副本,可以按如下操作

Device *devicePtr1 = new Device{};
Device deviceCopy = Device {*devicePtr1};//using the trivial cpy ctor

Device * devicePtr2 = &deviceCopy;//Now define your new pointer
或者你也可以直接简化最后两行,就像cigien说的那样

Device *devicePtr2 = new Device{*devicePtr1};

只有当类本身正在管理内存时,才需要复制构造函数。在这种情况下,只需执行Device*device2=新设备{device1}@cigien,我得到一个错误:“设备”初始化没有匹配的构造函数@cigien我想你在新设备{*device1}@asmmo中漏掉了一个*,是的,我漏掉了。感谢您提供了一个详细的答案:只有在类本身管理内存时才需要复制构造函数。在这种情况下,只需执行Device*device2=新设备{device1}@cigien,我得到一个错误:“设备”初始化没有匹配的构造函数@cigien我想你在新设备{*device1}@asmmo中漏掉了一个*,是的,我漏掉了。感谢您提供详细的答案: