- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我创建的类编写一个复制赋值运算符,并使用上一篇文章作为指导: What is The Rule of Three?
我对这个人的解释的一方面有点困惑。
这是他们的类(class):
class person
{
char* name;
int age;
};
这是我用作引用的复制赋值运算符定义(至少提供了 2 个):
// 2. copy assignment operator
person& operator=(const person& that)
{
char* local_name = new char[strlen(that.name) + 1];
// If the above statement throws,
// the object is still in the same state as before.
// None of the following statements will throw an exception :)
strcpy(local_name, that.name);
delete[] name;
name = local_name;
age = that.age;
return *this;
}
我感到困惑的是,为什么它们包含行 delete[] name;
?
这是他们提供的另一个示例:
person& operator=(const person& that)
{
if (this != &that)
{
delete[] name;
// This is a dangerous point in the flow of execution!
// We have temporarily invalidated the class invariants,
// and the next statement might throw an exception,
// leaving the object in an invalid state :(
name = new char[strlen(that.name) + 1];
strcpy(name, that.name);
age = that.age;
}
return *this;
}
我立即回避了这个,因为我无法理解为什么该函数会检查 if(this != &that)
然后在一个不存在的数组上运行 delete (delete[] name;)好像还没有生成。当调用赋值运算符时,是否在调用复制赋值运算符函数之前立即调用常规构造函数?因此,这意味着我们必须删除由类构造函数生成的数组,因为它只能充满垃圾数据?
为什么我不能直接写:名称 = that.name
或
name = new char[that.name.size()];
for (int i = 0; i < that.name.size(); i++)`
{
name[i] = that.name[i]
}
这可能真的很基本,我应该只实现帖子建议的内容,但我的实际用例涉及具有多个成员的struct
数组,所以我只是遇到了一点困难了解我到底需要做什么。
我意识到这里有大约 2.5 个问题。任何见解将不胜感激。
这是我第一次实现自定义复制构造函数和复制赋值运算符,我确信在完成几次后它会看起来很容易。
提前致谢。
最佳答案
所有这些都是确保内存得到正确管理所必需的。
如果我理解正确,您需要回答何时实际调用 operator=
?
好吧,当存在两个有效对象时,operator=
总是被调用。其中之一是分配给,第二个是数据源。执行此操作后,两个对象必须仍然有效。
这意味着在 operator=
内部,您有 this
对象,该对象为字符串分配了内存(在构造函数之一中分配)和 that
对象,还为另一个字符串分配了内存。
What I'm finding confusing is, why are they including the line
delete[] name;
?
我们必须首先清理当前驻留在 this
对象中的内存,否则在为它分配新的 momry 后我们将丢失该指针。
When the assignment operator is invoked, is the regular constructor called immediately before the copy assignment operator function is called?
没有。该对象已经存在,这就是调用 operator=
的原因(而不是复制构造函数)。
Therefore meaning that we must delete the array that was generated by the classes constructor because it can only be full of junk data?
它充满了有效数据。您的对象已构造完毕,其中包含一些数据,然后您可以为该对象分配其他内容。
<小时/>附录:何时调用复制构造函数以及何时调用 operator=
?(有关更多详细信息,请参阅 this question):
class A{};
int main()
{
A a1; //default constructor
A a2 = a1; //copy-constructor, not assignment operator! New object is needed
A a3;
a3 = a1; //we have valid and existing object on the left side, assignment operator is used
}
关于c++ - 复制赋值运算符说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59364218/
我正在编写一个应用程序,允许用户创建一个“问卷”,然后向其中添加问题。我正在使用核心数据来存储信息。我创建了一个问卷实体,并与问题实体建立了“一对多”关系。我的问题是,如果要允许用户复制(复制)整个调
有没有办法复制或复制 SharedPreference?或者我需要从一个变量中获取每个变量,然后将它们放入另一个变量中吗? 最佳答案 尝试这样的事情: //sp1 is the shared pref
下面的(A)和(B)有区别吗? (假设 NON ARC,如果重要的话) // --- (A) --- @interface Zoo : NSObject{} @property (copy) Dog
我正在尝试将 mysql SELECT 查询保存到文件中,如下所示: $result = mysqli_query($db,$sql); $out = fopen('tmp/csv.csv', 'w'
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
我在 Source 文件夹中有一个 Active wave 录音 wave-file.wav。我需要使用新名称 wave-file-copy.wav 将此文件复制到 Destination 文件夹。
在使用 GNU Autotools 构建的项目中,我有一个脚本需要通过 make 修改以包含安装路径。这是一个小例子: configure.ac: AC_INIT(foobar, 1.0) AC_PR
我想将 SQL 的行复制到同一个表中。但是在我的表中,我有一个“文本”列。 使用此 SQL: CREATE TEMPORARY TABLE produit2 ENGINE=MEMORY SELECT
谁能给我解释一下 df2 = df1 df2 = df1.copy() df3 = df1.copy(deep=False) 我已经尝试了所有选项并执行了以下操作: df1 = pd.DataFram
Hazelcast 是否具有类似于 Ehcache 的复制? http://www.ehcache.org/generated/2.9.0/pdf/Ehcache_Replication_Guide.
我有以下拓扑。一个 Ubuntu 16.04。运行我的全局 MySQL 服务器的 Amazon AWS 上的实例。我想将此服务器用作许多本地主服务器(Windows 机器 MySQL 服务器)的从服务
使用 SQLyog,我正在测试表中是否设置了正确的值。我尝试过 SELECT type_service FROM service WHERE email='test@gmail.com' 因此,只输出
有人可以提供一些关于如何配置 ElasticSearch 进行复制的说明。我在 Windows 中运行 ES,并且了解如果我在同一台服务器上多次运行 bat 文件,则会启动一个单独的 ES 实例,并且
一 点睛 ThreadGroup 复制线程的两个方法。 public int enumerate(Thread list[]) // 会将 ThreadGroup 中的 active 线程全部复制到
一 点睛 ThreadGroup 复制线程组的两个方法。 public int enumerate(ThreadGroup list[]) // 相对于 enumerate(list,true) pu
官方documentation Cassandra 说: Configure the keyspace and create the new datacenter: Use ALTER KEYSPAC
This question already has answers here: How to weight smoothing by arbitrary factor in ggplot2? (2个答
我们有一个表格来表明对各种俱乐部的兴趣。输出将数据记录在 Excel 电子表格中,其中列有他们的首选姓名、姓氏、电子邮件、代词,以及他们感兴趣的俱乐部的相应列中的“1”(下面的模型)。 我们希望为俱乐
This question already has answers here: Closed 8 years ago. Possible Duplicate: In vim, how do I get
如何复制形状及其所在的单元格?当我手动复制时,形状会跟随单元格,但是当我使用宏进行复制时,我会得到除形状之外的所有其他内容。 Cells(sourceRow, sourceColumn).Copy C
我是一名优秀的程序员,十分优秀!