Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Thắc mắc về arrow (->), dot (.), double colon (::).

  1. #1
    Ngày gia nhập
    10 2021
    Bài viết
    3

    Mặc định Thắc mắc về arrow (->), dot (.), double colon (::).

    Em đang học OOP và đang thắc mắc về các sử dụng nó. Mong anh chị chỉ dẫn ạ, em cảm ơn nhiều.
    Code:
    #include <iostream>
    #include <string> 
    
    class phu_nu {
    public: 
    	phu_nu() {}
    	
    	phu_nu (const std::string &ht, int z) 
    		: hoten(ht), con_zin(z)
    	{}
    
    	std::string hoten; 
    
    private: 
    	bool con_zin; 
    }; 
    
    int main() {
    	phu_nu *yua_mikami = new phu_nu; 
    	phu_nu maria_ozawa; 
    
    	yua_mikami->hoten = "Yua Mikami"; 
    	maria_ozawa.hoten = "Maria Ozawa";
    
    	return 0; 
    }

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Bạn có thể hiểu đơn giản là:

    -> với đối tượng là con trỏ, muốn trỏ đến thành phần của nó (thuộc tính, method, hay phần tử)
    . với đối tượng khai báo thông thường muốn truy cập đến thành phần của nó.
    :: hiểu đơn giản là chỉ định đường dẫn tới thuộc tính, hoặc method, hoặc class cụ thể.

    Bạn theo cái mình nói rồi so sánh với code của bạn ở trên, từ từ rồi sẽ hiểu, cái này chỉ đơn giản là syntax mà thôi.
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

  3. #3
    Ngày gia nhập
    10 2021
    Bài viết
    3

    Em cảm ơn anh đã phản hồi. Nhưng liệu rằng có câu trả lời tại sao con trỏ phải là arrow -> mà không phải dot (.) không anh?

  4. #4
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    631

    Trích dẫn Nguyên bản được gửi bởi Miracle25 Xem bài viết
    Em cảm ơn anh đã phản hồi. Nhưng liệu rằng có câu trả lời tại sao con trỏ phải là arrow -> mà không phải dot (.) không anh?
    Mình nghĩ dùng ký hiệu . hay -> có lẽ để phân biệt giữa biến thường và biến con trỏ thôi.

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Trích dẫn Nguyên bản được gửi bởi Miracle25 Xem bài viết
    Em cảm ơn anh đã phản hồi. Nhưng liệu rằng có câu trả lời tại sao con trỏ phải là arrow -> mà không phải dot (.) không anh?
    Cái này là syntax (quy ước ngôn ngữ) để phân biệt mà thôi, cũng như tiếng Việt tại sao không gọi mày tao như tiếng Anh cho dễ mà phải là anh, em, ông, bà, ...
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    744

    Mặc định Thắc mắc về arrow (->), dot (.), double colon (::).

    Trích dẫn Nguyên bản được gửi bởi Miracle25 Xem bài viết
    Em cảm ơn anh đã phản hồi. Nhưng liệu rằng có câu trả lời tại sao con trỏ phải là arrow -> mà không phải dot (.) không anh?
    Hỏi hay lắm.

    Sau đây là một khai báo kiểu Doctor và hai biến, biến a là một Doctor và biến b là một con trỏ, trỏ đến một Doctor. Tất cả các đoạn mã nguồn dưới đây đều chưa được biên dịch thử. Xin lỗi các bạn vì sai sót nếu có.

    C Code:
    1. typedef struct _doctor
    2. {
    3.     char name[10];
    4.     int  age;
    5. } Doctor;
    6.  
    7. Doctor a, *b;

    Để truy nhập thành phần age, ta phải dùng cú pháp a.ageb->age. Vì sao không thể viết b.age? Hỏi rõ hơn, vì sao ngôn ngữ C/C++ không cho phép cú pháp dấu chấm để chọn thành phần của struct khi biến là một con trỏ?

    Lý do là hai biến ab có khai báo quá giống nhau, chỉ sai khác một dấu sao * mà thôi. Nếu cho phép cú pháp b.age (thay vì b->age) chỉ thêm hay bớt một dấu sao, tức một cú gõ phím, là một mã nguồn hợp lệ đã biến thành một mã nguồn hợp lệ với ngữ nghĩa hoàn toàn khác. Rất nguy hiểm.

    Nói rộng hơn, một số ngôn ngữ cho phép dấu chấm (và chỉ dấu chấm) cho cả hai trường hợp, nghĩa là a.ageb.age chứ không có b->age. Ví dụ, ngôn ngữ Ada. Hãy xem hai biến a, b được khai báo như thế nào trong ngôn ngữ này.

    Ada Code:
    1. type Doctor is record
    2.    name: String(0..8);
    3.    age:  Integer;
    4. end record;
    5.  
    6. type Doctor_access is access Doctor;
    7.  
    8. a: Doctor;
    9. b: Doctor_access;

    Biến a và biến b được khai báo trong hai câu khai báo khác nhau, có kiểu khác nhau. Không có cách nào dễ dàng để khai báo nhầm lẫn từ kiểu này sang kiểu kia được. Trong ngôn ngữ này, cú pháp b->age là không cần thiết.

    Ngành lập trình tuy mới mẻ nhưng cũng đã tích luỹ được vài chục năm kinh nghiệm để hình thành một số nguyên tắc an toàn trong thiết kế ngôn ngữ lập trình. Một trong những nguyên tắc ấy là một thay đổi nhỏ trên một mã nguồn hợp lệ phải làm nó trở thành bất hợp lệ. Ngôn ngữ không nên cho phép biến đổi một mã nguồn hợp lệ thành một mã nguồn hợp lệ khác một cách quá dễ dàng.
    Đã được chỉnh sửa lần cuối bởi Ada : 19-11-2021 lúc 11:56 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  7. #7
    Ngày gia nhập
    02 2016
    Bài viết
    334

    Muốn hiểu -> thì phải hiểu . trước:

    . là toán tử truy cập thuộc tính hay phương thức (hàm) của struct hay class.
    Ví dụ struct X là một dạng được khai báo với vài thuộc tính, trong đó có ttY
    A là một biến đợc khai báo với kiểu struct X
    A.ttY là ngữ pháp để truy cập thuộc tính ttY của A

    -> là toán tử truy cập phần tử (thuộc tính) của struct thông qua con trỏ vảo struct.
    Ví dụ struct X là một dạng được khai báo với vài thuộc tính, trong đó có ttY
    troA là một biến được khai báo với kiểu trỏ vào struct X
    Để truy cập được ttY của đối tượng mà troA đang trỏ vào, người ta phải dùng ngữ pháp sau
    (*troA).ttY : toán tử * truy cập struct đang được trỏ troA trỏ vào, từ đó toán tử . truy cập phần tử ttY
    Vì gõ dấu () hơi cực, để giản dị hoá, C đặt thêm toán tử ->
    Và ta có: troA->ttB tương đương với (*troA).ttB

    :: không hẳn là một toán tử. Nó là ký hiệu tiền tố để phân biệt phạm vi (scope) được định nghĩa của biến hoặc hàm.
    Điển hình hai hàm hayn được dùng trong C++ là cin và cout. Hai hàm này thuộc về phạm vi định nghĩa của std. Và vì vậy, khi dùng chúng ta phải dùng theo ngữ pháp:
    std::cin, std::cout
    (việc xác định phạm vi này có thể được đơn giản hoá với lệnh chỉ trình dịch "using namesspace std")

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn