2013-04-11 29 views
5

Giúp tôi hiểu điều này, Nếu tôi xem xét tất cả các tiêu chuẩn C++, bao gồm C++ 11, đó là đúng khi nói rằng chỉ đối tượng mà tôi có thể đối phó với là một thể hiện của một lớp học?Trong C++ một "thể hiện lớp" là loại đối tượng duy nhất?

những gì về những người chơi khác như lambdas? một thể hiện của một POD được coi là một đối tượng?

Tôi biết rằng điều này nghe giống như một chi tiết nhỏ nhưng hầu hết thời gian tôi tìm thấy khái niệm từ các ngôn ngữ khác khó so sánh khi tôi có loại vấn đề này xác định đối tượng là gì và đặc biệt là trong ngôn ngữ OOP chức năng.

+0

'int x;' là 'x' một thể hiện của một lớp? – Pubby

+0

@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

+1

Không có lớp nào như 'std :: int'. –

Trả lời

8

Nếu tôi xem xét tất cả các tiêu chuẩn C++, bao gồm C++ 11, có thể nói rằng đối tượng duy nhất mà tôi có thể giải quyết là một thể hiện của một lớp?

Không, điều này là không chính xác.

Trong C++, thuật ngữ "đối tượng" dùng để chỉ một khu vực lưu trữ được đưa ra một cách giải thích riêng theo đặc tính (chẳng hạn như loại) được trao cho các đối tượng.

mỗi khoản 1.8/1 của C++ 11 Tiêu chuẩn:

Các cấu trúc trong một ++ chương trình C tạo, phá hủy, hãy tham khảo, truy cập và thao tác các đối tượng. Một đối tượng là một khu vực dung lượng lưu trữ. [Lưu ý: Một hàm không phải là một đối tượng, bất kể nó có chiếm không gian lưu trữ theo cách mà các đối tượng thực hiện hay không. —end note] Một đối tượng được tạo ra bởi một định nghĩa (3.1), bằng một biểu thức mới (5.3.4) hoặc bằng cách thực hiện (12.2) khi cần thiết. Các thuộc tính của đối tượng được xác định khi đối tượng được tạo. Một đối tượng có thể có một tên (khoản 3). Một đối tượng có thời lượng lưu trữ (3.7) ảnh hưởng đến tuổi thọ của nó (3.8). Một đối tượng có một loại (3.9). Các loại đối tượng hạn đề cập đến loại mà các đối tượng được tạo ra . Một số đối tượng có tính đa hình (10.3); việc triển khai tạo ra thông tin liên quan đến mỗi đối tượng như vậy mà có thể xác định loại đối tượng đó trong quá trình thực thi chương trình. Đối với đối tượng khác, việc giải thích của các giá trị tìm thấy trong đó được xác định bởi kiểu của biểu thức (khoản 5) sử dụng để truy cập chúng.

Vì vậy, về cơ bản, int là một đối tượng, một thể hiện của POD là một đối tượng và tất nhiên là một thể hiện của một loại lớp là một đối tượng. Trong OOP, thuật ngữ "đối tượng" thường có nghĩa là chỉ biểu thị thực thể thứ hai - nhưng trong C++ thì đây không phải là trường hợp.

còn những người chơi khác như lambdas thì sao?

Lambdas là đường thực sự cú pháp để xác định functors giấu tên (Đoạn 5.1.2/1):

biểu thức Lambda cung cấp một cách ngắn gọn để tạo các đối tượng chức năng đơn giản. [...]

Ngoài ra (theo Đoạn 5.1.2/2):

Việc đánh giá biểu thức lambda dẫn đến tạm thời giá trị (12.2). Tạm thời này được gọi là đóng đối tượng. [...] [Lưu ý: Một đóng đối tượng hoạt động giống như đối tượng hàm (20.8). - cuối note]

Do đó, lambdas là những biểu hiện mà kết quả trong việc tạo ra một đối tượng tạm thời thẩm định (do đó có, trong một nghĩa nào đó người ta có thể nói lambdas cũng các đối tượng, hay đúng hơn là họ mang một vật).

+0

Tôi không hiểu tại sao thực tế là _temporary_ nó rất quan trọng, nếu định nghĩa về việc giữ lại trạng thái, tại sao thực tế là tạm thời nó có liên quan, tôi có nghĩa là bất cứ điều gì trong mã C++ đều có tuổi thọ, một thời gian ngắn hơn cho dữ liệu nó có liên quan như vậy? vậy tại sao lambdas không phải là đối tượng? – user2269624

+0

@ user2269624: Tạm thời là một đối tượng. Đó là những gì chữ đậm được nhấn mạnh. Nhưng có, thực tế là các biểu thức lambda đánh giá các đối tượng được nói ngay cả sau trong cùng một đoạn, vì vậy tôi đoán tôi có thể loại bỏ sự nhấn mạnh –

2

trong C++ một đối tượng là một vùng lưu trữ với một kiểu liên

ví dụ một

khu vực int nhu cầu không nhất thiết phải tiếp giáp

làm ví dụ, với ảo nhiều phần thừa kế của một đối tượng có thể được (theo nghĩa, một số trường hợp tồn tại nơi mà nó phải được) lây lan xung quanh

2

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.

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