提问人:redkont 提问时间:11/25/2019 最后编辑:walnutredkont 更新时间:11/25/2019 访问量:1318
复制和移动构造函数是自动朋友吗?
are copy and move constructors automatic friends?
问:
当我们定义复制或移动构造函数时,我们可以访问另一个类的私有变量。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;
}
答:
10赞
walnut
11/25/2019
#1
类本身的成员函数始终可以访问成员,无论成员函数是在类内定义还是在类外定义,也无论它是特殊成员函数(如复制/移动构造函数)定义。private
因此,他们不属于该类,因为这没有任何意义。他们已经是班级的一部分。尽管如此,他们仍然可以访问所有成员,不是因为他们是 s,而是因为他们是班级的一部分。friend
private
friend
如果无法在构造函数中初始化成员(因为它们不可访问),那么成员可访问性的整个概念将毫无意义。(您将如何初始化成员?
此外,可访问性绝不是访问成员的对象的问题。可访问性只是代码中名称(成员名称)的使用位置的问题。如果函数可以访问类的一个实例的成员,则它也可以访问同一类的另一个实例的成员。
21赞
Shloim
11/25/2019
#2
它不被视为朋友,但是是的,类的任何成员函数都可以访问所有类型的实例的私有成员,而不仅仅是实例: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 个或更多相同类型的对象进行交互,而不必公开其私有成员。
评论