2016-09-29 29 views
5

đây là một câu hỏi T/F gần đây xuất hiện trong khóa học cs của tôi mà tôi thấy hơi khó hiểu.Tôi có thể sử dụng toán tử = để gán giá trị của một đối tượng cho một đối tượng khác mà không làm quá tải toán tử không?

Các sách giáo khoa nói:

Các toán tử = có thể được sử dụng để gán dữ liệu một đối tượng để đối tượng khác, hoặc để khởi tạo một đối tượng với dữ liệu của đối tượng khác. Theo mặc định, mỗi thành viên của một đối tượng được sao chép vào đối tác của nó trong đối tượng khác.

Câu hỏi đặt ra đúng nguyên văn là:

Bạn không thể sử dụng toán tử = để gán giá trị một đối tượng để đối tượng khác, trừ khi bạn nạp chồng toán tử. T/F?

Đánh giá từ đoạn cụ thể của sách giáo khoa đó, tôi đã trả lời sai. Tuy nhiên, nó chỉ ra câu trả lời bài kiểm tra đã thực sự đúng sự thật.

Khi tôi tra cứu câu hỏi trực tuyến, tôi cũng thấy các nguồn khác liệt kê câu trả lời là "sai". Cấp, đây chỉ là các trang web flashcard/quiz chung, vì vậy tôi không đặt nhiều cổ phiếu trong đó.

Về cơ bản, tôi chỉ tò mò câu trả lời thực sự là gì cho mục đích học tập trong tương lai.


PS: Các sách giáo khoa sau tiếp tục nói rõ: "Để thay đổi cách thức hoạt động của toán tử gán, nó phải được quá tải hành quá tải cho phép bạn để xác định lại hành vi của một nhà điều hành hiện khi sử dụng với một lớp . vật."

Tôi cảm thấy như thế này có liên quan và hỗ trợ câu trả lời "đúng", nhưng tôi không thực sự chắc chắn.

+1

Với tiêu chuẩn hiện hành này sẽ được tạo ra bởi trình biên dịch theo mặc định. –

+5

Nhà văn đố vui lên, phàn nàn. –

Trả lời

2

Tuyên bố

Bạn không thể sử dụng toán tử = để gán giá trị một đối tượng để đối tượng khác, trừ khi bạn nạp chồng toán tử.

& hellip; là không đáng kể, bởi vì bạn có thể gán cho ví dụ biến số int. Đó là một đối tượng. Trong C++.

Có thể họ định viết “ đối tượng loại lớp ”, nhưng thậm chí là sai. Ví dụ. bất kỳ đối tượng kiểu lớp POD (Plain Old Data) nào đều có thể gán và thiếu một toán tử gán quá tải.

Tuy nhiên, có những trường hợp bạn muốn hoặc cần cấm hoặc chịu trách nhiệm chuyển nhượng.

2

Nếu bạn không tự mình thực hiện toán tử gán, trình biên dịch sẽ tạo một tệp cho bạn, sẽ sao chép dữ liệu từ nguồn đến đích, gọi các toán tử gán của các thành viên trong lớp của bạn nếu có thể/cần thiết.

Điều này không có tác dụng nếu lớp của bạn, ví dụ: có các thành viên const và không mang lại kết quả mong muốn nếu lớp của bạn chứa con trỏ đến các đối tượng được phân bổ động.

Vì vậy, tôi cũng sẽ nói rằng tuyên bố là sai.

1

Đó là câu hỏi mẹo. Câu trả lời cú pháp là "sai" nhưng câu trả lời ngữ nghĩa là "có thể".

struct Foo 
{ 
    int a; 
    double b; 
}; 

Foo foo1; 
Foo foo2; 
foo2 = foo1; // Ok in both senses. 

struct Bar 
{ 
    Bar() : arr(new int[20]) {} 
    ~Bar() { delete [] arr; } 
    int* arr; 
}; 

Bar bar1; 
Bar bar2; 
bar2 = bar1; // Ok in syntax not in semantics 
       // This will lead to UB 
0

Bạn không thể sử dụng toán tử = để gán giá trị một đối tượng để đối tượng khác, trừ khi bạn nạp chồng toán tử. T/F?

Ans: F

Bạn có thể gán giá trị một đối tượng để đối tượng khác mà không quá tải toán tử =, như trình biên dịch theo mặc định định nghĩa toán tử gán cho lớp trong tất cả các trường hợp ngoại trừ bên dưới

  • bạn đã khai báo rõ ràng một toán tử gán bản sao (cho lớp X một toán tử = lấy X, X & hoặc const X &))
  • có một thành viên trong lớp của bạn không thể gán được (chẳng hạn như một tham chiếu, đối tượng const hoặc một lớp không có hoặc toán tử gán không thể truy cập)

Nhưng bạn cần hiểu tại sao nó bắt buộc phải quá tải toán tử gán trong trường hợp bạn có người dùng xác định hoặc phân bổ bộ nhớ động cho điều này đọc khái niệm về nông và bản sao sâu

1

trong C++, khi User-Defined Types như classstruct tham gia sau đó nó tốt hơn để quá tải operator= cho Type. Sử dụng default assignment operator với đối tượng class hoặc struct sẽ liên quan đến Shallow Copy. Shallow Copy đôi khi dẫn đến hành vi không xác định khi đối tượng class hoặc struct có phân bổ động bộ nhớ bên trong chúng.

cách thích hợp quá tải operator= cho classstruct loại sẽ dẫn đến Deep Copy đó là phương pháp đúng đắn về gán một đối tượng ObjA phản đối ObjB (ObjB = ObjA) khi ObjAObjB là đối tượng của một số class hoặc struct và chứa được cấp phát động bộ nhớ bên trong chúng .

Toán tử = có thể được sử dụng để gán dữ liệu của một đối tượng cho đối tượng khác hoặc để khởi tạo một đối tượng với dữ liệu của đối tượng khác. Theo mặc định, mỗi thành viên của một đối tượng được sao chép vào đối tác của nó trong đối tượng khác. Điều này đúng khi đối tượng của class/struct chỉ có static basic loại dữ liệu bên trong nó. Ở đây,

  • bởi tĩnh nó có nghĩa là tất cả các yêu cầu bộ nhớ của đối tượng được cố định ở mức chỉ có thời gian biên dịch.

Bạn không thể sử dụng toán tử mặc định = để gán giá trị của một đối tượng cho đối tượng khác, trừ khi bạn quá tải toán tử. Điều này đúng khi đối tượng của class/struct có một số bộ nhớ được cấp phát động bên trong bộ nhớ, có thể bằng cách sử dụng pointers.

Để biết thêm tài liệu tham khảo see: What is the difference between a deep copy and a shallow copy?

Các vấn đề liên quan