là sao chép và di chuyển xây dựng bạn bè tự động?


14

Chúng ta có thể truy cập các biến riêng của một lớp khác khi chúng ta định nghĩa sao chép hoặc di chuyển các hàm tạo. C ++ có làm cho chúng friendtự động với nhau không?

Ví dụ:

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
Đây là cùng một lớp. Vì vậy, bạn ne là cần thiết.
M. Spiller

1
Xem stackoverflow.com/questions/6921185/... - trong ngắn hạn, kiểm soát truy cập trong C ++ không phân biệt được giữa đối tượng trường hợp , duy nhất giữa các loại khác nhau.
osuka_

Khi bạn viết "lớp my_str khác", đó là một lỗi thẳng. Đó là một ví dụ my_str khác , và các nhận xét và câu trả lời khác giải thích những gì đòi hỏi
JonathanZ hỗ trợ MonicaC

Câu trả lời:


21

Nó không được coi là bạn, nhưng vâng, bất kỳ chức năng thành viên nào của lớp my_strđều có thể truy cập các thành viên riêng của tất cả các thể hiện của loại my_str, không chỉ là thisthể hiện:

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.
    }
};

Ý tưởng chung đằng sau nó là cho phép 2 hoặc nhiều đối tượng cùng loại tương tác mà không cần phải phơi bày các thành viên riêng tư của họ.


10

Các hàm thành viên của lớp luôn có quyền truy cập vào các privatethành viên, bất kể hàm thành viên được định nghĩa trong lớp hay ngoài lớp và bất kể đó là hàm thành viên đặc biệt như hàm tạo sao chép / di chuyển.

Vì vậy, họ không friendthuộc lớp, vì điều đó không có ý nghĩa gì. Họ đã là một phần của lớp học. Tuy nhiên, họ có quyền truy cập vào tất cả các privatethành viên, không phải vì họ là friends, mà vì họ là một phần của lớp.

Nếu không thể khởi tạo các thành viên trong một hàm tạo (vì chúng không thể truy cập được), thì toàn bộ khái niệm về khả năng truy cập của thành viên sẽ là vô nghĩa. (Làm thế nào bạn sẽ khởi tạo thành viên?)


Ngoài ra, khả năng truy cập không phải là vấn đề của đối tượng mà thành viên được truy cập. Khả năng truy cập là vấn đề chỉ sử dụng tên (tên của thành viên) trong mã. Nếu một hàm có thể truy cập thành viên của một thể hiện của một lớp, thì nó cũng có thể truy cập vào thành viên của một thể hiện khác của cùng một lớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.