복사 및 이동 생성자가 자동 ​​친구입니까?


14

복사 또는 이동 생성자를 정의 할 때 다른 클래스의 개인 변수에 액세스 할 수 있습니다. 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;
}

7
이것은 같은 클래스입니다. 그래서 네 친구가 필요합니다.
M. Spiller

1
stackoverflow.com/questions/6921185/…를 참조하십시오 . 간단히 말해 C ++의 액세스 제어는 객체 인스턴스 간을 식별하지 않고 서로 다른 유형 간을 식별 합니다.
osuka_

"다른 my_str 클래스"를 작성할 때 그것은 바로 실수입니다. 그것은 또 다른되는 my_str의의 예를 , 기타의 의견과 답변은 무엇이 수반 설명
JonathanZ가 MonicaC 지원

답변:


21

친구로 간주되지 않지만 클래스의 모든 멤버 함수는 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.
    }
};

기본 개념은 동일한 유형의 둘 이상의 오브젝트가 개인 구성원을 노출시키지 않고 상호 작용할 수 있도록하는 것입니다.


10

클래스 자체 private의 멤버 함수는 멤버 함수가 클래스 내 또는 클래스 외부에서 정의되었는지 여부와 상관없이 복사 / 이동 생성자와 같은 특수 멤버 함수인지에 관계없이 항상 멤버에 액세스 할 수 있습니다 .

따라서 friend이해가되지 않기 때문에 수업에 참여하지 않습니다. 그들은 이미 수업의 일부입니다. 그럼에도 불구하고 그들은 모든 private회원에게 접근 할 수 있습니다. 왜냐하면 그들은 회원이기 때문이 friend아니라 수업의 일부이기 때문입니다.

액세스 할 수 없기 때문에 생성자에서 멤버를 초기화 할 수 없으면 멤버 액세스의 전체 개념이 의미가 없습니다. (멤버를 어떻게 초기화하겠습니까?)


또한 액세스 가능성은 어떤 방식 으로든 멤버에 액세스하는 개체의 문제가 아닙니다. 내게 필요한 옵션은 코드에서 이름 (멤버 이름)이 사용되는 경우에만 문제가됩니다. 함수가 클래스의 한 인스턴스 멤버에 액세스 할 수 있으면 동일한 클래스의 다른 인스턴스 멤버에도 액세스 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.