Tất cả các toán tử C ++ mà tôi đã làm việc trả về một cái gì đó, ví dụ: +
toán tử trả về kết quả của phép cộng.
Tất cả các toán tử C ++ có trả về một cái gì đó không, hoặc có một số toán tử C ++ không trả về bất cứ điều gì?
Tất cả các toán tử C ++ mà tôi đã làm việc trả về một cái gì đó, ví dụ: +
toán tử trả về kết quả của phép cộng.
Tất cả các toán tử C ++ có trả về một cái gì đó không, hoặc có một số toán tử C ++ không trả về bất cứ điều gì?
+=
để trả lại void
, nhưng điều này không được khuyến khích. Ngoài ra, các nhà khai thác cuộc gọi hàm có thể trả lại void
và điều này là hợp lệ
::
không trả lại bất kỳ điều gì, nhưng tôi phải tham khảo tiêu chuẩn để đảm bảo.
Câu trả lời:
Mặc dù chúng có thể không chính xác như những gì bạn đang nghĩ, lưu ý rằng 'từ khóa' delete
và delete[]
C ++ thực sự là các toán tử ; và chúng được định nghĩa là có void
kiểu trả về - có nghĩa là chúng không đánh giá gì ( không phải là 'cái gì đó').
Từ cppreference :
void operator delete ( void* ptr ) noexcept;
void operator delete[]( void* ptr ) noexcept;
delete
, delete[]
, throw
, (void)x;
Diễn viên, bên trái của ,
nhà điều hành, ngay bên của ,
nhà điều hành mà sản lượng một void
, một ?:
ternary có sử dụng một throw
cho một trong những cánh tay, dfri của operator void()
(mà sẽ được người dùng định nghĩa),眠りネロク's void operator()()
(mà sẽ được người dùng định nghĩa).
delete
nhà điều hành phá hủy đối tượng và sau đó gọi operator delete
. Ergo, delete
toán tử và operator delete
là những thứ riêng biệt :( stackoverflow.com/a/8918942/845092
operator delete
.
Các nhà khai thác của các loại tùy chỉnh có thể bị quá tải để làm những điều kỳ lạ nhất.
ví dụ, toán tử + trả về kết quả của phép cộng.
Không cần thiết:
#include <iostream>
struct foo {
int value = 0;
void operator+(int x) {
value += x;
}
};
int main () {
foo f;
f + 3;
}
Đây operator+
thêm phía bên trái cho value
thành viên và kiểu trả về của nó là vô hiệu. Đây là một ví dụ được tạo sẵn, nhưng nói chung, việc không trả lại thứ gì đó từ một toán tử tùy chỉnh không phải là bất thường.
Toán tử duy nhất có thể bị quá tải và có yêu cầu trả lại một cái gì đó, mà tôi biết, là operator->
. Nó phải trả về một con trỏ thô hoặc một đối tượng có operator->
.
operator->
hơi đặc biệt và cần trả về một con trỏ hoặc một đối tượng có một operator->
, không chắc liệu có ngoại lệ nào khác không
operator*(Matrix const& left, Matrix const& right)
trả về không Matrix
mà thay vào đó MatrixMul
, để nếu sau đó nó được đưa vào operator+(Matrix const& left, MatrixMul const& right)
hoạt động có thể là một phép nhân-cộng hợp nhất hiệu quả hơn phép nhân đầu tiên sau đó thêm
<<
và >>
quá tải cho các hoạt động I / O, họ dự kiến sẽ trả lại luồng để bạn có thể xếp tầng chúng:stream << foo << bar;
Đối với nitpick, các nhà khai thác không trả lại bất kỳ thứ gì. Chúng chỉ là các yếu tố từ vựng mà chúng ta sử dụng để tạo ra các biểu thức trong ngôn ngữ. Bây giờ, các biểu thức có các loại và có thể đánh giá thành các giá trị, và tôi cho rằng đây là ý của bạn đối với các toán tử "trả về các thứ".
Và, vâng, vâng. Có các biểu thức C ++ với kiểu void
(và do đó không đánh giá thành bất kỳ giá trị nào). Một số là hiển nhiên, những người khác ít như vậy. Một ví dụ hay sẽ là
throw std::runtime_error()
throw
là một biểu thức theo ngữ pháp C ++. Bạn có thể sử dụng nó trong các biểu thức khác, chẳng hạn như trong biểu thức điều kiện
return goodStatus() ? getValue() : throw std::runtime_error();
Và loại biểu thức ném, là void
. Rõ ràng là vì điều này chỉ khiến việc thực thi nhanh chóng chuyển sang chỗ khác, nên biểu thức không có giá trị.
Không có toán tử C ++ nào trả về điều gì đó. Các toán tử C ++ bị quá tải trả về một cái gì đó trong chừng mực mà ký hiệu toán tử là một đường cú pháp cho một lệnh gọi hàm.
Thay vào đó, tất cả các nhà khai thác đều đánh giá một cái gì đó. Cái gì đó có giá trị cũng như kiểu được xác định rõ ràng . Ngay cả người điều hành cuộc gọi chức năng void operator()(/*params*/)
cũng là một void
kiểu.
Ví dụ: +'a'
là một int
loại có giá trị 'a'
được mã hóa trên nền tảng của bạn.
Nếu câu hỏi của bạn là "Các toán tử C ++ có thể có void
kiểu trả về không?" thì câu trả lời chắc chắn nhất là có.
I++
không trả về giá trị. Nếu kiểu của i
là kiểu do người dùng định nghĩa, thì biểu thức đó được triển khai dưới dạng operator++
, là một hàm trả về giá trị. Bạn gọi đó là “đường cú pháp”; Tôi gọi đó là một sự khác biệt có hậu quả quan trọng.
Bạn thực sự có thể xác định một toán tử gọi hàm để trả về không có gì. Ví dụ:
struct Task {
void operator()() const;
};
Bạn có thể xác định đặc biệt operator void()
chức năng chuyển đổi, nơi trình biên dịch sẽ thậm chí cảnh báo bạn rằng T
đến void
chức năng chuyển đổi sẽ không bao giờ được sử dụng :
#include <iostream>
struct Foo {
operator void() { std::cout << "Foo::operator void()!"; }
// warning: conversion function converting 'Foo' to
// 'void' will never be used
};
int main() {
Foo f;
(void)f; // nothing
f.operator void(); // Foo::operator void()!
}
được điều chỉnh bởi [class.conv.fct] / 1
[...] Một chức năng chuyển đổi là không bao giờ sử dụng để chuyển đổi một (có thể cv-đủ điều kiện) đối tượng với cùng loại đối tượng (có thể cv-đủ điều kiện) (hoặc một tham chiếu đến nó), đến một lớp cơ sở (có thể cv-đủ điều kiện) kiểu đó (hoặc một tham chiếu đến nó), hoặc để (có thể cv-đủ điều kiện)
void
. 117( 117 ) Các chuyển đổi này được coi là chuyển đổi tiêu chuẩn cho mục đích giải quyết quá tải ([over.best.ics], [over.ics.ref]) và do đó khởi tạo ([dcl.init]) và các phôi rõ ràng. Một chuyển đổi thành
void
không gọi bất kỳ hàm chuyển đổi nào ([expr.static.cast]). Mặc dù chưa bao giờ được gọi trực tiếp để thực hiện chuyển đổi, nhưng các hàm chuyển đổi như vậy có thể được khai báo và có thể đạt được thông qua lệnh gọi hàm chuyển đổi ảo trong lớp cơ sở.
Tuy nhiên, trong khi được hiển thị ở trên, bạn vẫn có thể gọi nó bằng .operator void()
cú pháp rõ ràng .
Các toán tử được ngôn ngữ xác định (nội trang) là các mã thông báo được sử dụng để thực hiện các loại tính toán khác nhau:
và như thế. Danh sách có thể rất rộng.
Trong tài liệu tham khảo ngôn ngữ như này hoặc cái này , đây là những không nhất thiết phải tham chiếu như trở về một cái gì đó, chỉ cần thực hiện một số học hoặc logic hoạt động , một sự so sánh bởi điều đó có nghĩa là một biến thể được sửa đổi, vv
Vì hoạt động này dẫn đến một số giá trị, nó có thể được hiểu là được "trả về" bởi toán tử, nhưng nó khác với giá trị trả về của hàm.
Mặt khác, các toán tử được nạp chồng có thể được định nghĩa với một giá trị trả về thuộc một số kiểu, thậm chí có thể bị vô hiệu hóa, vì vậy, không, không phải tất cả các toán tử đều trả về một số giá trị trong C ++.
Tôi giả sử bạn đang nói về các hàm toán tử chứ không phải toán tử như một đơn vị cú pháp của ngôn ngữ.
Nếu bạn quá tải các toán tử trên bất kỳ loại nào, bạn thực sự có thể trả về bất kỳ thứ gì bạn muốn.
Điều này cũng có ý nghĩa, bởi vì các phép toán như * hoặc () đôi khi có thể không trả về kiểu đầu vào của chúng một cách trực quan. Hãy tưởng tượng nhân một kiểu số phức với một kiểu số thực. Hoặc một toán tử trả về một phần tử từ một tập hợp.
Bạn cũng có thể nạp chồng các toán tử ++ và - để không trả về bất kỳ thứ gì, do đó loại bỏ sự trộn lẫn hiệu ứng phụ và giá trị biểu thức cực kỳ dễ xảy ra lỗi mà phiên bản chuẩn có.
Không. Hãy xem xét hai ví dụ này ở đây:
int multiply (int a, int b) {
return a*b;
}
void multiply_void(int a, int b) {
cout << a*b;
//or cout << multiply(a,b);
}
Hàm đầu tiên sẽ trả về một giá trị số nguyên có thể được sử dụng bởi một hàm khác. Giá trị được trả về và lưu trong bộ nhớ để sử dụng khi cần thiết. Nếu không, nó không được nhìn thấy cho con người và chỉ ngồi một cách hạnh phúc trong ký ức.
Chức năng thứ hai sẽ xuất ra thiết bị đầu ra mặc định (thường là bàn điều khiển). Giá trị được trả về bởi toán tử nhân được chuyển đến thiết bị đầu ra. Hàm Multi_void không trả về giá trị thực.
Tất cả các toán tử trả về một cái gì đó. Chúng được gọi là toán tử vì chúng vận hành một cái gì đó, do đó chúng sẽ trả về một cái gì đó. Những toán tử không trả về một cái gì đó không thể được gọi là toán tử. Chúng sẽ trả về một số giá trị hoặc trả về True hoặc False tùy thuộc vào tình huống.
Các nhà khai thác của riêng họ không nhất thiết phải trả lại bất cứ điều gì. Các cuộc gọi hàm trả về giá trị. Các toán tử có thể dẫn đến các giá trị. Các toán tử đôi khi có thể gọi các hàm. Những ví dụ bao gồm:
• Người điều hành cuộc gọi chức năng.
• Một toán tử quá tải được chuyển đổi thành một cuộc gọi hàm.
• toán tử mới, được gọi như một phần của biểu thức mới , là một lời gọi hàm.
Mục đích duy nhất của tôi khi đề cập đến lời gọi hàm là để làm rõ kết quả so với trả về. Dựa trên việc xem xét tất cả 126 trường hợp của “return” và các từ bắt nguồn từ nó trong [expr] , phần này dường như sử dụng cẩn thận từ return để chỉ:
• kết quả của một lệnh gọi hàm
• các khía cạnh của luồng kiểm soát liên quan đến các quy trình
OK, thế là đủ về kết quả so với lượt về.
Các toán tử C ++ trả về cái gì đó hay không phụ thuộc vào cách bạn sử dụng chúng. Các toán tử C ++ tích hợp trả về một số giá trị cho đến khi và trừ khi được thực thi để trả về giá trị vô hiệu.