复制和移动构造函数是自动朋友吗?
are copy and move constructors automatic friends?
当我们定义复制或移动构造函数时,我们可以访问另一个class的私有变量。 C++ 会自动使它们 friend
相互吗?
例如:
my_str::my_str(my_str&& m)
{
size_ = m.size_; //accessing private variable another my_str class
buff_ = m.buff_; //accessing private variable another my_str class
m.buff_ = nullptr;
m.size_ = 0;
}
class 本身的成员函数总是可以访问 private
成员,无论成员函数是定义在-class 还是在-[=24 之外=] 而不管它是否是一个特殊的成员函数,例如 copy/move 构造函数。
因此它们不是 class 的 friend
,因为那没有任何意义。他们已经是 class 的一部分。尽管如此,他们仍然可以访问所有 private
成员,不是因为他们是 friend
,而是因为他们是 class.
的一部分
如果无法在构造函数中初始化成员(因为它们不可访问),那么成员可访问性的整个概念将毫无意义。 (你会如何初始化成员?)
此外,可访问性绝不是访问成员所在的对象的问题。可访问性仅与代码中使用名称(成员名称)的位置有关。如果一个函数可以访问 class 的一个实例的成员,那么它也可以访问同一个 class.
的另一个实例的成员
它不被认为是友元,但是 class my_str
的任何成员函数都可以访问类型 my_str
的所有实例的私有成员,而不仅仅是 this
实例:
class my_str {
void foo(my_str& other) {
// can access private members of both this-> and other.
}
static void bar(my_str& other) {
// can access private members of other.
}
};
其背后的总体思路是允许 2 个或更多相同类型的对象进行交互,而不必公开其私有成员。
当我们定义复制或移动构造函数时,我们可以访问另一个class的私有变量。 C++ 会自动使它们 friend
相互吗?
例如:
my_str::my_str(my_str&& m)
{
size_ = m.size_; //accessing private variable another my_str class
buff_ = m.buff_; //accessing private variable another my_str class
m.buff_ = nullptr;
m.size_ = 0;
}
class 本身的成员函数总是可以访问 private
成员,无论成员函数是定义在-class 还是在-[=24 之外=] 而不管它是否是一个特殊的成员函数,例如 copy/move 构造函数。
因此它们不是 class 的 friend
,因为那没有任何意义。他们已经是 class 的一部分。尽管如此,他们仍然可以访问所有 private
成员,不是因为他们是 friend
,而是因为他们是 class.
如果无法在构造函数中初始化成员(因为它们不可访问),那么成员可访问性的整个概念将毫无意义。 (你会如何初始化成员?)
此外,可访问性绝不是访问成员所在的对象的问题。可访问性仅与代码中使用名称(成员名称)的位置有关。如果一个函数可以访问 class 的一个实例的成员,那么它也可以访问同一个 class.
的另一个实例的成员它不被认为是友元,但是 class my_str
的任何成员函数都可以访问类型 my_str
的所有实例的私有成员,而不仅仅是 this
实例:
class my_str {
void foo(my_str& other) {
// can access private members of both this-> and other.
}
static void bar(my_str& other) {
// can access private members of other.
}
};
其背后的总体思路是允许 2 个或更多相同类型的对象进行交互,而不必公开其私有成员。