问题标签 [assignment-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 编译器生成的构造函数
这只是一个快速的问题,可以正确理解当您使用这样的构造函数创建类时会发生什么:
我知道没有生成默认构造函数,因为它已经定义但是是由编译器生成的复制和赋值构造函数,或者换句话说,我是否需要声明一个私有复制构造函数和一个私有赋值运算符以防止这种情况发生?
c++ - 在什么情况下我必须为我的 C++ 类提供赋值运算符、复制构造函数和析构函数?
假设我有一个类,其中唯一的数据成员类似于std::string
or std::vector
。我需要提供复制构造函数、析构函数和赋值运算符吗?
c++ - 复制构造函数和动态分配
我想问你如何为以下类编写一个复制构造函数(和 operator = )。
类 Node 存储每个节点的坐标 x,y 和指向另一个节点的指针。
类 NodesList(继承自 std::vector)存储所有动态分配的节点
主程序:
}
我不想创建每个节点的浅拷贝,而是创建每个节点的深拷贝。我可以问你一个带有复制构造函数的示例代码吗?
每个节点可以被多次指向。让我们有这样的情况,当 3 个节点 n[1]、n[2]、n[3] 存储在 NodesList nl1 中时:
n[1] 指向 n[2]
n[2] 指向 n[3]
n[3] 指向 n[2]
A] 我们的复制构造函数处理节点 n[1]。它创建一个由旧对象 n[1]_old 的副本表示的新对象 n[1]_new。从 n[1]_old 指向的节点 n[2] 仍然不存在,因此还必须创建 n[2]_new... 从 n1_new 指向 n2_new 的指针已设置。
B] 然后处理第二个点n[2]。它不能被创建两次,n[2]_new 是在 A] 中创建的。但是指向的节点 n[3] 不存在,因此创建了新对象 n[3]_new 作为旧对象 n[3]_old 的副本。从 n2_new 到 n3_new 的指针被设置。
C] 节点 n[3]_new 已经创建并且 n[2]_new。从 n3_new 到 n2_new 的指针已设置,不会创建其他对象...
所以复制构造函数应该检查对象是否在过去创建过或者没有...
一些引用计数可能会有所帮助......
c++ - C++中的重载赋值运算符
据我了解,重载 operator= 时,返回值应该是非常量引用。
在以下情况下允许调用非常量成员函数是非常量的:
但是它为什么要返回一个引用呢?如果没有将返回值声明为引用,那么在什么情况下会出现问题,比如说按值返回?
假定复制构造函数已正确实现。
c++ - C ++复制构造构造和分配问题
以下是“C++ Gotchas”一书第 56 项的摘录:
以三种不同方式编写 Y 对象的简单初始化并不少见,就好像它们是等价的一样。
事实上,所有这三个初始化都可能导致生成相同的目标代码,但它们并不等价。a 的初始化被称为直接初始化,它完全符合人们的预期。初始化是通过直接调用 Y::Y(int) 来完成的。
b 和 c 的初始化更复杂。事实上,它们太复杂了。这些都是复制初始化。在初始化 b 的情况下,我们请求创建一个类型为 Y 的匿名临时变量,初始化值为 1066。然后我们使用这个匿名临时变量作为 Y 类的复制构造函数的参数来初始化 b。最后,我们调用匿名临时的析构函数。
为了测试这一点,我做了一个带有数据成员的简单类(最后附加了程序),结果令人惊讶。似乎对于 c 的情况,对象是由复制构造函数构造的,而不是像书中建议的那样。
有谁知道语言标准是否发生了变化,或者这仅仅是编译器的优化功能?我使用的是 Visual Studio 2008。
代码示例:
输出:
我对构建 d 和 e 的结果感到最惊讶。准确地说,我期望创建一个空对象,然后创建一个对象并将其分配给空对象。实际上,对象是由复制构造函数创建的。
java - Java中的快捷“或赋值”(|=)运算符
我在 Java 中有很多比较要做,我想知道其中一个或多个是否为真。比较字符串很长且难以阅读,因此为了便于阅读,我将其拆分,并自动使用快捷操作符|=
而不是negativeValue = negativeValue || boolean
.
negativeValue
如果任何 default<something> 值为负,我希望是真的。这是有效的吗?它会达到我的预期吗?我在 Sun 的网站或 stackoverflow 上看不到它,但 Eclipse 似乎没有问题,并且代码可以编译并运行。
同样,如果我想执行几个逻辑交集,我可以使用&=
代替&&
吗?
c++ - 如何为带有 ptr 的工厂类编写 cctor 和 op= 以抽象成员字段?
我正在将 zip 和 rar 档案中的文件提取到原始缓冲区中。我创建了以下内容来包装 minizip 和 unrarlib:
Archive.hpp - 用于访问所有内容。如果我可以让其他类中的所有功能都无法从外部访问,我会的。(实际上,我想我可以成为 Archive 中所有其他类的朋友,并使用私有函数回调......,但这太迂回了。)
档案库.hpp
ArchiveDerived.hpp "Derived" 是 "Zip" 或 "Rar"
ArchiveDerived.cpp
有人建议我使用这种设计,以便我可以这样做:
如何为存档编写 cctor?
归档的 op= 怎么样?
我能做些什么“重命名”
ArchiveBase::Data
到Archive::Data
?(minizip 和 unrarlib 都使用此类结构进行输入和输出。数据对于 Zip 和 Rar 是通用的,后来用于创建各自库的结构。)其他所有内容都通过 访问Archive
,我想Data
在外部类中声明这种方式也是如此。
我知道我可以将我的 current class Archive
、 nameArchiveBase
扔到Archive
中,并使用全局工厂函数。但是,我想避免使用全局函数。
c++ - 编译时的 C++ 类型检查
全部。我对 C++ 很陌生,我正在用 C++ 编写一个小型库(主要用于我自己的项目)。在设计类型层次结构的过程中,我遇到了定义赋值运算符的问题。
我采用了本文最终达到的基本方法,即对于MyClass
从一个类派生的层次结构中的每个类,Base
您定义两个赋值运算符,如下所示:
我关心的部分是类型相等的断言。由于我正在编写一个库,其中断言可能会从最终结果中编译出来,这导致我采用了一个看起来更像这样的方案:
但我一直想知道是否可以在编译时检查类型。我查看了 Boost.TypeTraits,我通过 接近了BOOST_MPL_ASSERT((boost::is_same<BOOST_TYPEOF(*this), BOOST_TYPEOF(rhs)>));
,但由于 rhs 被声明为对父类而不是派生类的引用,所以它窒息了。
现在我想起来了,我的推理似乎很愚蠢——我希望由于函数是内联的,它能够自己检查实际参数,但当然预处理器总是在编译器之前运行。但我想知道是否有人知道我可以在编译时强制执行这种检查的任何其他方式。
c++ - 将一种类型的向量分配给另一种类型的向量
我有一个“事件”课程。由于日期的处理方式,我们需要将这个类包装在一个“UIEvent”类中,该类包含事件,以及另一种格式的事件日期。
允许从 Event 转换到 UIEvent 并返回的最佳方法是什么?我认为重载 UIEvent 的赋值或复制构造函数以接受事件(反之亦然)可能是最好的。
c++ - 有没有人发现需要声明复制赋值运算符 const 的返回参数?
复制赋值运算符具有通常的签名:
下面的签名有什么实际用途吗?
您只能定义一个或另一个,但不能同时定义两者。