OOP truyền thống có xu hướng xác định khái niệm "đối tượng" là "thực thể đa hình" mang các phương thức và dữ liệu và có thể được tham chiếu từ các đối tượng khác một thuật toán.
Định nghĩa C++ của đối tượng là bản chất - "bất cứ điều gì chiếm một không gian để giữ lại trạng thái". Điều này dẫn đến sự khác biệt chính mà C++ "đối tượng" có "hành vi giá trị" và rằng "phương pháp" không nhất thiết phải là thành viên, và đối tượng không nhất thiết phải hỗ trợ đa hình thời gian chạy.
Chương trình C++ theo định nghĩa OOP truyền thống, kết thúc với các lớp được gọi (thông minh) - (cơ sở) - (con trỏ | tham chiếu), sử dụng cơ chế chuyển hướng làm khóa để giải quyết đa hình khi chạy.
Hiện đại C++ sử dụng đối tượng như có bản sao giá trị hoặc di chuyển ngữ nghĩa và có xu hướng giải quyết đa hình tại thời gian biên dịch với mẫu và thuật toán chung và các đặc điểm kiểu.
Hai điều không phải là một chống lại nhau, nhưng C++ cố ý hợp nhất cả hai, do đó giảm định nghĩa "đối tượng" một OOP truyền thống (thể hiện của một lớp được tham chiếu), là -in thực tế - cắt bỏ một nửa các tính năng và khả năng của C++.
Về lambdas, nó nghiêm ngặt cảm giác họ là biểu (không đối tượng bản thân) trở gõ ẩn danh đối tượng.
Vì vậy, nói rằng họ là đối tượng là không đúng: a+b
nó không phải tự nó là một đối tượng: nó sản xuất một đối tượng (kết quả của biểu thức).Điều này cũng cho [](){}
: nó không phải tự nó là một đối tượng: nó tạo ra một đối tượng, bạn thậm chí có thể lưu trữ, như trong
auto fn = [](){}; //create a lambda and assign to fn.
fn(); //just calls it
Loại fn là một cái gì đó giống như
class lambda_uniquename
{
public:
void operator()()
{}
};
Đối tượng, ở đây, không phải là lớp lambda
mà là biến số fn
.
'int x;' là 'x' một thể hiện của một lớp? – Pubby
@Pubby nhưng câu hỏi của tôi là: đối tượng là gì? Loại định nghĩa nào tồn tại cho từ này trong thế giới lập trình và những hậu quả trong định nghĩa C++ là gì? Đối với những gì tôi biết int là một loại từ std :: int, do đó, nó là một lớp, vì vậy x trong trường hợp này nó là một nhãn cho một đối tượng, nhưng tôi đã không xác định những gì một đối tượng thực sự là, được nêu ra. – user2269624
Không có lớp nào như 'std :: int'. –