2009-06-22 41 views
10

Tôi đã nhìn vào một Qt tutorial trong đó sử dụng một cấu trúc Tôi chưa từng thấy trước đây:"void" mới có nghĩa là gì trong C++?

(void) new QShortcut(Qt::Key_Enter, this, SLOT(fire())); 
(void) new QShortcut(Qt::Key_Return, this, SLOT(fire())); 
(void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close())); 

Tôi đã thử này mà không có sự (void) và nó vẫn biên dịch và các công trình, vì vậy mục đích là gì (void)?

+1

Bật mức cảnh báo trình biên dịch của bạn tối đa. Biên dịch mà không có (void) và xem những gì sẽ xảy ra. –

+0

Nhưng hầu hết thời gian tôi thấy điều này là bởi vì ai đó đang viết C và không nhận ra rằng bạn không _need_ chuyển đổi nữa. –

Trả lời

21

Việc truyền một biểu thức đến (void) về cơ bản cho trình biên dịch bỏ qua kết quả của biểu thức đó (sau khi tính toán nó). Trong ví dụ của bạn, mỗi biểu thức (mỗi câu lệnh/dòng) tự động cấp phát bộ nhớ thông qua toán tử mới - và vì mới trả về một con trỏ (địa chỉ) cho bộ nhớ, thực hành thông thường là lưu con trỏ đó vào một biến mà bạn có thể sử dụng để cuối cùng xóa đối tượng và deallocate bộ nhớ. Trong ví dụ của bạn, vì con trỏ đang bị hủy, một diễn viên rõ ràng (void) làm cho ý định của lập trình viên rõ ràng: "Tôi biết chính xác những gì tôi đang làm - vui lòng hủy giá trị được trả về bởi"

Nếu bạn là quan tâm đến các kỹ thuật (trích dẫn từ tiêu chuẩn C++, khoản 5):

Bất kỳ biểu thức nào cũng có thể được chuyển đổi thành loại cv void. Giá trị biểu thức bị hủy. [Lưu ý: tuy nhiên, nếu giá trị nằm trong một biến tạm thời (12.2), hàm hủy cho biến đó không được thực hiện cho đến thời điểm thông thường và giá trị của biến được giữ nguyên cho mục đích thực thi hàm hủy. —end note]
Biến đổi giá trị từ rvalue-to-rvalue (4.1), chuyển đổi mảng thành con trỏ (4.2) và chuyển đổi tiêu chuẩn hàm-to-pointer (4.3) không được áp dụng cho biểu thức.

Và nếu bạn đang tự hỏi làm thế nào những đối tượng đó bị xóa (nếu chúng thực sự bị xóa), câu trả lời là con trỏ 'this' bên trong hàm tạo QShortcut sẽ có cùng giá trị như được trả về bởi và điều đó có thể được chuyển đến một ShortcutManager. Lưu ý, 'this' trong hàm khởi tạo không giống như con trỏ 'this' đang được truyền cho constructor của QShortcut.

7

Một số trình biên dịch C++ sẽ đưa ra cảnh báo nếu bạn vứt bỏ giá trị trả lại của một hàm như vậy. Trong trường hợp này, mã có vẻ như nó bị rò rỉ bộ nhớ, vì vậy bạn nhận được một cảnh báo. (void) yêu cầu trình biên dịch không phát ra cảnh báo: "Xử lý chức năng này như thể nó trả về void".

0

Tôi nghĩ rằng tham chiếu được trả lại từ câu lệnh new không được gán cho con trỏ. Tôi thấy rằng this đang được thông qua để QT phải làm điều gì đó với tham chiếu đó.