2015-01-18 13 views
10

Trước khi có ai hỏi, vâng, đây là một phần của bài tập về nhà, và có, tôi đã làm rất nhiều Googling trước khi hỏi. Tôi đã dành cả giờ tìm kiếm mạnh mẽ trên Google với nhiều, nhiều từ khóa khác nhau, nhưng không thể tìm thấy bất kỳ thứ gì.Từ khóa 'lớp' trong định nghĩa biến trong C++

Vì vậy, ở đây đi câu hỏi:

gì giá trị trung bình định nghĩa biến sau đây: class MyClass* myClass;?

Tôi đã thử mã đó với một cái gì đó như class MyClass* myClass = new MyClass(); và thấy rằng nó chỉ đơn giản là tạo một con trỏ đến một phiên bản mới của MyClass.

Vì vậy, lợi thế của việc sử dụng tiền tố class là gì? Liệu nó có bất kỳ sự khác biệt?

Có ai đó có liên kết đến một số tài nguyên về nó không? Tôi chỉ đơn giản là không thể tìm thấy bất cứ điều gì (nó thực sự, thực sự khó để tìm thấy những thứ khác hơn là "định nghĩa lớp"!).

Cảm ơn rất nhiều!

+0

Bạn có thể đưa ra một số bối cảnh về nơi bạn nhìn thấy điều này không? Nó là một biến thành viên trong một lớp học? Dường như với tôi như nó có thể là một tuyên bố về phía trước kết hợp với tuyên bố biến. – Borgleader

+0

Bạn hầu như không bao giờ cần đến nó. Một trường hợp tối nghĩa là khi tên lớp bị ẩn bởi một biến hoặc hàm: 'class MyClass {}; int MyClass; MyClass * myClass = NULL; '(sẽ không biên dịch, nhưng bạn có thể thêm từ khóa' class' để chỉ một tên khác được ẩn). –

Trả lời

13

Trình chỉ định loại công phu là tên loại đứng trước từ khóa, cấu trúc, enum hoặc từ khóa công đoàn.

class identifier 
struct identifier 
enum identifier 
union identifier 

Trình chỉ định loại phức tạp được sử dụng để nhấn mạnh hoặc để lộ tên kiểu bị ẩn bởi khai báo có cùng tên trong cùng một phạm vi.

source

+0

Plus 1 để đề cập đến các loại thông số kỹ thuật phức tạp – namezero

6

Thực ra, tùy chọn sử dụng class trong khi tạo đối tượng lớp học. Trong ngôn ngữ C, bắt buộc phải sử dụng struct trước tên struct để tạo biến của nó. Như C++ là superset của C. Chỉ có một sự khác biệt giữa struct và class trong C++, và đó là access modifier.

Để giữ tương thích ngược, nó được cho phép.

Vì vậy,

class MyClass* myClass = new MyClass(); 

Và,

MyClass* myClass = new MyClass(); 

Cả hai đều giống nhau.

+2

C++ là * gần như * một superset của C. Ngoài ra, câu trả lời của bạn ban đầu được gọi C trong quá khứ; C vẫn tồn tại và các quy tắc trong khu vực này không thay đổi. –

1

Từ "tuyên bố nội tuyến về phía trước" cần được đề cập ở đây!

Tuyên bố chuyển tiếp chỉ đơn giản là cách để thông báo cho trình biên dịch về tên loại trước khi được xác định thực sự. Bạn luôn tìm thấy các tệp này trong các tệp tiêu đề.

// MyStruct.h 
class MyClass; 

struct MyStuct { 
    MyClass* m_myClass; 
    void foo(); 
} 

// MyStruct.cpp 
#inlude "MyClass.h" 
void MyStruct::foo() { m_myClass->SomeFunc(); } 

Lưu ý rằng tệp tiêu đề chỉ khai báo MyClass làm nhận dạng lớp và không biết nó thực sự là gì cho đến khi được xác định qua #include trong tệp cpp. Đây là tuyên bố về phía trước.

tuyên bố nội tuyến về phía trước thực sự giống nhau, nhưng bạn chỉ cần làm tất cả trên một dòng. Đây là cùng một mã chính xác đạt được điều tương tự.

// MyStruct.h 
struct MyStuct { 
    class MyClass* m_myClass; 
    void foo(); 
} 

// MyStruct.cpp 
#inlude "MyClass.h" 
void MyStruct::foo() { m_myClass->SomeFunc(); } 

Tôi cảm thấy như hầu hết các lập trình viên đều thích phương pháp khai báo chuẩn chuẩn (ít thường xuyên gõ thường). Đó là lý do tại sao nó có thể gây nhầm lẫn khi vấp ngã khi phiên bản nội tuyến được sử dụng ít hơn.

Tôi thấy nhiều câu trả lời ở đây gọi nó là từ khóa tùy chọn, nhưng trong ngữ cảnh trên của khai báo nội tuyến, nó không phải là tùy chọn và sẽ dẫn đến lỗi biên dịch do thiếu thông số loại.

+0

Tiêu chuẩn C++ không sử dụng thuật ngữ "khai báo chuyển tiếp" hoặc "khai báo chuyển tiếp nội tuyến". Các thuật ngữ tiêu chuẩn là "khai báo" và "trình phân loại kiểu được xây dựng", như đã đề cập ở đâu đó trên chủ đề này. Ngoài ra, có thể bạn đã đọc sai câu trả lời khác có nội dung "Thực tế là không bắt buộc phải sử dụng' lớp' ** trong khi tạo đối tượng ** của lớp "- để tạo đối tượng, loại phải hoàn thành và thực sự là tùy chọn để sử dụng 'class' cho rằng kiểu đó đã hoàn thành rồi. –

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