Có đúng không khi nói rằng một biến là một thể hiện của kiểu dữ liệu?


9

(có thể thay đổi giá trị của nó trong suốt chương trình)

Hay là 'ví dụ của một cái gì đó' liên quan chặt chẽ đến các lớp và các đối tượng? Nếu vậy, bạn sẽ định nghĩa khái niệm 'biến' như thế nào khi nói đến C ++?


C # và Java khác với C ++ theo hai cách thú vị. Đầu tiên, họ cố gắng hợp nhất các kiểu nguyên thủy với các kiểu đối tượng (và struct) (để bạn có thể nói về một thể hiện của int), trong khi C ++ thì không. Thứ hai, trong C # và Java, các biến của các loại đối tượng được tham chiếu ngầm đến các thể hiện (của các lớp) trong heap và chúng ta không nói về các con trỏ tới các đối tượng, trong khi trong C ++, như câu trả lời của @ coredump, các biến cục bộ của các loại đối tượng là các ràng buộc với các thể hiện trên ngăn xếp và chúng tôi phân biệt rõ ràng giữa các đối tượng và các con trỏ tới các đối tượng.
Erik Eidt

Câu trả lời:


8

Theo như tôi biết, nó là đúng với các giá trị gọi của loại nguyên thủy trường hợp của loại hình đó (xem ví dụ "C Loại Hệ thống ++" , từ thủ công Visual Studio, nhưng tôi vẫn đang tìm kiếm một nguồn khác), mặc dù tôi tin rằng thuật ngữ này là Chủ yếu được sử dụng khi thảo luận về các đối tượng. Một đối tượng là một thể hiện của lớp C nếu nó được xây dựng từ một hàm tạo được định nghĩa trong lớp C hoặc một trong các lớp con của nó.

Một biến trong C ++ không phải là một khái niệm thời gian chạy. Nó tồn tại bên trong trình biên dịch của bạn dưới dạng liên kết từ vựng giữa tên của biến và vị trí trừu tượng (có thể thay đổi nếu không phải là const). Khi một chương trình được biên dịch, các biến không còn ở đó nữa. Thay vào đó, dữ liệu được đọc và ghi vào sổ đăng ký, bộ nhớ, v.v.


2
" Các giá trị của các kiểu nguyên thủy thường không được coi là các thể hiện của kiểu đó; nó được dành riêng cho các đối tượng và các lớp. " Điều đó không đúng chút nào. Không ở đâu trong tiêu chuẩn là các giá trị của các kiểu nguyên thủy không được coi là đối tượng. Định nghĩa của một biến cũng không thay đổi theo bất kỳ cách nào tùy thuộc vào việc nó là lớp do người dùng định nghĩa hay kiểu nguyên thủy.
Nicol Bolas

@NicolBolas Tôi chưa bao giờ nghe ai nói đến các số nguyên là các trường hợp của một thứ gì đó trong ngữ cảnh của C ++ và tôi khá chắc chắn rằng họ không nói gì về các tiêu chuẩn ngay cả khi tiêu chuẩn không đề cập rõ ràng về điều đó. Nếu không, họ là những gì? Tôi cũng không thấy câu trả lời này tuyên bố rằng định nghĩa của một biến thay đổi giữa các kiểu và đối tượng nguyên thủy; có vẻ như (afaik chính xác) tuyên bố rằng "các trường hợp" đơn giản là không liên quan gì đến định nghĩa của một biến.
Ixrec

2
@Ixrec: " Nếu không, chúng là trường hợp nào? " Loại int. Tiêu chuẩn C ++ không tạo ra sự khác biệt giữa các loại nguyên thủy và các loại không nguyên thủy khi nói về những gì khai báo biến. Vì vậy, T t;tuyên bố một đối tượng của loại T, bất kể loại nào Txảy ra.
Nicol Bolas

1
@Ixrec: Lưu ý rằng literals là một loại khác nhau của điều. Văn học là một loại giá trị. Nhưng bạn không thể tạo ra các biến số theo nghĩa đen, vì vậy đó là một cuộc thảo luận khác.
Nicol Bolas

5

Hay là 'ví dụ của một cái gì đó' liên quan chặt chẽ đến các lớp và các đối tượng? Nếu vậy, bạn sẽ định nghĩa khái niệm 'biến' như thế nào khi nói đến C ++?

Nói một cách chính xác nhất có thể cho C ++

  • Một biến là một tên (trong mã) cho một vị trí trong bộ nhớ được xác định khi chạy.
  • Một ví dụ là một đối tượngnằm trong bộ nhớ khi chạy.

Chỉ để được rõ ràng:

  • Không phải tất cả các khu vực của bộ nhớ đều chứa các đối tượng. Ví dụ: một số vùng bộ nhớ có thể chứa các giá trị 'rác'.
  • Không phải tất cả các đối tượng lưu trữ bộ nhớ sẽ được đặt tên trong mã. Các đối tượng có thể nằm trong các vùng bộ nhớ không được đặt tên, chẳng hạn như một vị trí trong một mảng hoặc ở đâu đó trên Heap được tham chiếu bởi một con trỏ.
  • Khi một vùng bộ nhớ chứa rác, thường là do không có đối tượng nào bị vô hiệu hóa tại vị trí đó hoặc do một số đối tượng hiện có trước đó đã bị phá hủy.

1
POD là các đối tượng trong C ++. Không phải tất cả các vùng của bộ nhớ đều là đối tượng, nhưng POD không chỉ là vùng của bộ nhớ.
Nicol Bolas

1
Tôi thứ hai NicolBolas: POD là đối tượng. Tuy nhiên, bạn có một điểm khi bạn nói về một malloc()bộ đệm mới , nhưng chưa được khởi tạo: đó là vùng nhớ chưa phải là một đối tượng. Tương tự như vậy, một đối tượng đã bị phá hủy rõ ràng: Đó là vùng nhớ không còn là đối tượng nữa.
cmaster - phục hồi monica

@NicolBolas bình luận công bằng, tôi đã thay đổi cách diễn đạt đó một chút
Ben Cottrell

1

Chà, "chính xác" nghĩa là gì?

Nếu chúng ta muốn cực kỳ nghiêm ngặt về nó, chúng ta cần phân biệt giữa:

  • Các cú pháp bên: biểu thức (tĩnh) các loại
  • Phía ngữ nghĩa : các đối tượng là các thể hiện của các lớp

Vì vậy, sau đó một biến số là một biểu thức mà Haiti sẽ một loại. Giá trị của nó đối với đối tượng mà nó đề cập đến là một thể hiện của một số lớp. Và lưu ý rằng kiểu của biến và lớp của đối tượng nói chung không giống nhau. Kiểu tĩnh của biến đặt giới hạn trên của các lớp thời gian chạy của đối tượng, để các lớp phải là một kiểu con của lớp tương ứng với loại.

Bạn có muốn lặp lại câu nói lớn đó mọi lúc không? Quái gì không. Làm thế nào nghiêm ngặt so với lỏng lẻo chúng tôi muốn nói chuyện phụ thuộc vào bối cảnh. Vì vậy, thường thì thực sự không có vấn đề gì khi nói rằng "biến là một thể hiện của loại này." Điều đang xảy ra ở đó thực sự là chúng ta đang sử dụng biến và kiểu ẩn dụ để chỉ đối tượng và siêu lớp của lớp thời gian chạy của nó.


1

Trừ khi bạn muốn dành cả đời mình cho sự thuần khiết và ngụy biện ... vâng.

Mỗi khi bạn giữ một thứ gì đó được xác định duy nhất một cách sử dụng để giả mạo những thứ khác có thể nhận dạng duy nhất mà bạn đang thực hiện.

  • Một dự án khởi tạo thành các sản phẩm
  • Một nguồn khởi tạo thành các tệp thực thi
  • Một mẫu khởi tạo thành các loại.
  • Một kiểu khởi tạo thành các biến.

Một số trong những khởi tạo đó có thể có tên chính xác hơn, nhưng nói chung điều này hoạt động.


0

Nhiều người dành "ví dụ" cho các thể hiện của các lớp. Nếu bạn làm điều đó thì trong C ++, một biến có thể là một thể hiện của một lớp, một tham chiếu đến một thể hiện, một con trỏ tới một thể hiện hoặc một kiểu nguyên thủy (bạn có thể tính các cấu trúc là các lớp trong ngữ cảnh đó, chúng gần như hoàn toàn giống nhau). Trong Java hoặc Objective-C, các biến sẽ không bao giờ là các thể hiện mà có thể là các tham chiếu đến các cá thể.

Quên: Trong một thời gian ngắn, một con trỏ C ++ có thể là một con trỏ tới bộ nhớ thô, ví dụ "this" trước khi hàm tạo bắt đầu thực thi. Bạn có thể không gọi * đây là một ví dụ tại thời điểm này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.