C++ 如何为具有私有对象作为属性的类编写移动构造函数和赋值运算符?
我今天学的。我阅读了,并尝试将其中的move构造函数示例应用到我的代码中C++ 如何为具有私有对象作为属性的类编写移动构造函数和赋值运算符?,c++,class,c++11,assignment-operator,move-constructor,C++,Class,C++11,Assignment Operator,Move Constructor,我今天学的。我阅读了,并尝试将其中的move构造函数示例应用到我的代码中 class UnicodeString { public: enum ENDIANNESS_TYPE {LITTLE_ENDIAN = 0, BIG_ENDIAN = 1} ENDIANNESS; bool REPLACE_NON_ASCII_CHARACTERS; char REPLACE_NON_ASCII_CHARACTERS_WITH;
class UnicodeString
{
public:
enum ENDIANNESS_TYPE {LITTLE_ENDIAN = 0, BIG_ENDIAN = 1} ENDIANNESS;
bool REPLACE_NON_ASCII_CHARACTERS;
char REPLACE_NON_ASCII_CHARACTERS_WITH;
float VECTOR_RESERVE_COEFFICIENT;
UnicodeString(UnicodeString && Other);
// ...
UnicodeString & operator=(UnicodeString Other);
// ...
private:
std::vector<UnicodeChar> UString;
// ...
}
UnicodeString::UnicodeString(UnicodeString && Other)
{
this->REPLACE_NON_ASCII_CHARACTERS = Other.REPLACE_NON_ASCII_CHARACTERS;
this->REPLACE_NON_ASCII_CHARACTERS_WITH = Other.REPLACE_NON_ASCII_CHARACTERS_WITH;
this->VECTOR_RESERVE_COEFFICIENT = Other.VECTOR_RESERVE_COEFFICIENT;
this->ENDIANNESS = Other.ENDIANNESS;
this->UString = ?????
}
UnicodeString & UnicodeString::operator=(UnicodeString Other)
{
std::swap(?????, ?????);
return *this;
}
class-unicording
{
公众:
enum ENDIANNESS_TYPE{LITTLE_ENDIAN=0,BIG_ENDIAN=1}ENDIANNESS;
bool替换非ASCII字符;
用字符替换非ASCII字符;
浮动向量_储备_系数;
单向破坏(单向破坏和其他);
// ...
UnicodeString和operator=(UnicodeString其他);
// ...
私人:
std::矢量放大;
// ...
}
UnicodeString::UnicodeString(UnicodeString和其他)
{
此->替换非ASCII字符=其他。替换非ASCII字符;
此->将非ASCII字符替换为=其他。将非ASCII字符替换为;
该->向量保留系数=Other.VECTOR保留系数;
this->ENDIANNESS=Other.ENDIANNESS;
这个->UString=?????
}
UnicodeString&UnicodeString::operator=(UnicodeString其他)
{
标准::交换(????,???);
归还*这个;
}
但是,与该示例不同,我的类UnicodeString
不仅仅包含一个简单的C数组。它包含一个std::vector
对象,其元素是我编写的另一个类的实例
首先,在move构造函数中,如何窃取通过R值传递的另一个对象的UString
向量
其次,在赋值运算符中,如何有效地交换主
UnicodeString
对象的UString
s的引用和通过R值传递的引用?请注意,UString
是一个私有属性,因此不能从另一个对象直接访问它。正确的方法是(假设您使用的是Visual Studio,因此编译器不会为您执行此操作)如下所示,带有一个初始化列表:
Unicode::UnicodeString(UnicodeString && other)
: this->REPLACE_NON_ASCII_CHARACTERS(other.REPLACE_NON_ASCII_CHARACTERS)
, this->REPLACE_NON_ASCII_CHARACTERS_WITH(other.REPLACE_NON_ASCII_CHARACTERS_WITH)
, this->VECTOR_RESERVE_COEFFICIENT(other.VECTOR_RESERVE_COEFFICIENT)
, this->ENDIANNESS(other.ENDIANNESS)
, this->UString(std::move(other.UString))
{
}
请注意,UString是一个私有属性,因此不能直接从另一个对象访问它
谁说的?私有意味着对象外部的代码不能访问它。但是一个对象实例肯定可以访问另一个对象实例的隐私。正确的方法是(假设您使用的是Visual Studio,因此编译器不会为您执行此操作)如下所示,带有一个初始化列表:
Unicode::UnicodeString(UnicodeString && other)
: this->REPLACE_NON_ASCII_CHARACTERS(other.REPLACE_NON_ASCII_CHARACTERS)
, this->REPLACE_NON_ASCII_CHARACTERS_WITH(other.REPLACE_NON_ASCII_CHARACTERS_WITH)
, this->VECTOR_RESERVE_COEFFICIENT(other.VECTOR_RESERVE_COEFFICIENT)
, this->ENDIANNESS(other.ENDIANNESS)
, this->UString(std::move(other.UString))
{
}
请注意,UString是一个私有属性,因此不能直接从另一个对象访问它
谁说的?私有意味着对象外部的代码不能访问它。但是一个对象实例肯定可以访问另一个对象实例的隐私
首先,在move构造函数中,如何窃取通过R-Value传递的另一个对象的UString向量
只要是std::vector,因为它是可移动的():
其次,在赋值运算符中,如何有效地交换主UnicodeString对象和通过R值传递的对象的ustring的引用?请注意,UString是一个私有属性,因此不能直接从另一个对象访问它
请注意,private
适用于类,而不是类的实例。这意味着相同类的其他实例可以访问另一个实例的private
成员。所以,只需像前面一样使用std::move(Other.UString)
首先,在move构造函数中,如何窃取通过R-Value传递的另一个对象的UString向量
只要是std::vector,因为它是可移动的():
其次,在赋值运算符中,如何有效地交换主UnicodeString对象和通过R值传递的对象的ustring的引用?请注意,UString是一个私有属性,因此不能直接从另一个对象访问它
请注意,private
适用于类,而不是类的实例。这意味着相同类的其他实例可以访问另一个实例的private
成员。因此,只需像以前一样使用std::move(Other.UString)
。UnicodeString
s应该能够看到彼此UString
s,而不管它们是否是私有的。访问说明符适用于其他客户。UnicodeString
s应该能够看到其他客户UString
s,无论这些客户是否为私有客户。访问说明符适用于其他客户。