คัดลอกและย้ายเพื่อนอัตโนมัติสร้างหรือไม่


14

เราสามารถเข้าถึงตัวแปรส่วนตัวของคลาสอื่นได้เมื่อเรากำหนด copy หรือ move constructors 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 class อื่น" มันเป็นความผิดพลาดแบบตรง เป็นอีกตัวอย่างหนึ่งของ 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.
    }
};

แนวคิดทั่วไปที่อยู่เบื้องหลังคืออนุญาตให้วัตถุ 2 ประเภทหรือมากกว่านั้นโต้ตอบกันโดยไม่ต้องเปิดเผยสมาชิกส่วนตัว


10

ฟังก์ชั่นสมาชิกของคลาสนั้นสามารถเข้าถึงprivateสมาชิกได้เสมอไม่ว่าฟังก์ชันสมาชิกจะถูกกำหนดในคลาสหรือนอกคลาสและไม่ว่าจะเป็นฟังก์ชันสมาชิกพิเศษเช่นตัวสร้างสำเนา / ย้าย

ดังนั้นพวกเขาไม่ได้อยู่friendในชั้นเรียนเพราะที่ไม่ได้ทำให้รู้สึกใด ๆ พวกเขาเป็นส่วนหนึ่งของชั้นเรียนแล้ว ถึงกระนั้นพวกเขาก็สามารถเข้าถึงprivateสมาชิกทุกคนไม่ใช่เพราะพวกเขาเป็นfriendแต่เป็นเพราะพวกเขาเป็นส่วนหนึ่งของชั้นเรียน

หากไม่สามารถเริ่มสมาชิกในคอนสตรัคเตอร์ได้ (เพราะไม่สามารถเข้าถึงได้) ดังนั้นแนวคิดทั้งหมดของการเข้าถึงสมาชิกจะไม่มีประโยชน์ (คุณจะเริ่มสมาชิกได้อย่างไร)


นอกจากนี้การเข้าถึงไม่ได้อยู่ในรูปแบบของวัตถุที่สมาชิกเข้าถึง การช่วยสำหรับการเข้าถึงเป็นเรื่องของการใช้ชื่อ (ชื่อของสมาชิก) ในรหัสเท่านั้น หากฟังก์ชั่นสามารถเข้าถึงสมาชิกของอินสแตนซ์หนึ่งของคลาสจากนั้นก็สามารถเข้าถึงสมาชิกของอินสแตนซ์อื่นของคลาสเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.