Chuyển đến phần nội dung

Lập trình C++0x: const: ý nghĩa của const trong khai báo function

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

    1. #1

      Ngày gia nhập
      09 2010
      Bài viết
      88

      Mặc định const: ý nghĩa của const trong khai báo function

      mình khai báo như sau:

      Code:

        #1        #2        #3        #4        #5
      //const int const *foo(const int const &i) const {
      const int const *foo(const int const *i) const { //EDIT
      //blah blah
      }

      Đã được chỉnh sửa lần cuối bởi quano1 : 05-08-2013 lúc

      05:17 PM

      .

    2. #2

      Ngày gia nhập
      07 2007
      Nơi ở
      TP HCM
      Bài viết
      66

      #5 chỉ ra rằng hàm foo sẽ không thay đổi member nào thuộc về class có hàm foo trừ phi member đó được đánh dấu mutable.

      #3 #4: (const int const &i) i là một tham chiếu hằng đến một hằng kiểu int. Tức là tham chiếu hằng này sẽ không bị thay đổi và biến kiểu int đang được tham chiếu tới cũng không thể bị thay đổi.

      #1 #2: const int const * là trả về một con trỏ hằng trỏ đến một hằng kiểu int. Tức là con trỏ hằng này sẽ không trỏ được tới biến khác và biến đang được trỏ tới cũng không thể bị thay đổi.

      ( #1 #2 ) và (#3 #4) tương đương nhau chỉ khác một bên là con trỏ một bên là tham chiếu. Về cách sử dụng thì con trỏ và tham chiếu cũng tương đương nhau. Con trỏ dùng dấu -> để gọi member, tham chiếu dùng . để gọi member.

      Note: tham chiếu == reference

      Hướng dẫn lập trình C++ cho người mới học

    3. #3

      Ngày gia nhập
      09 2010
      Bài viết
      88

      rất cảm ơn bạn. cho mình hỏi tiếp

      const int * Constant2
      declares that Constant2 is a variable pointer to a constant integer and

      int const * Constant2
      is an alternative syntax which does the same, whereas

      int * const Constant3
      declares that Constant3 is constant pointer to a variable integer and

      nếu đúng cho mình hỏi tiếp: tại sao lại phân ra quá nhiều kiểu khai báo trong khi không có gì khác nhau như vậy (ít nhất là #1 <=> #2 và #3 <=> #4)?

      p/s: mình nhầm, argument là 1 con trỏ chứ không phải tham chiếu

      Đã được chỉnh sửa lần cuối bởi quano1 : 05-08-2013 lúc

      05:16 PM

      .

    4. #4

      Ngày gia nhập
      07 2007
      Nơi ở
      TP HCM
      Bài viết
      66

      Bạn thấy #3 và #4 khác nhau chỗ nào? Thực ra const nó đựa dùng để chỉ ra phần tử phía bên trái của nó là hằng. Tuy nhiên nếu phía bên trái nó không có gì hết thì nó sẽ được hiểu là phía bên phải const là hằng.

      const int * Constant2; // phía bên trái const ko có gì, => int là hằng
      int const * Constant2; // phía bên trái const là int => int là hằng
      int * const Constant3; // phía bên trái const là * => pointer là hằng

      C++ Code:

      Select All | Show/Hide

      1.  

        #1        #2        #3        #4        #5

      2. const

        int

        const

        *

        foo

        (

        const

        int

        const

        &

        i

        )

        const

        {

      3. }

      4. // Trường hợp 1

      5. int

        const

        &

        i

        ;

        // phía bên trái const là int  => int là hằng

      6. // Trường hợp 2

      7. //#1           #2

      8. const

        int

        const

        &

        i

        ;

        // tính từ phải qua trái , const #2 chỉ ra int là hằng, vậy const #1?

      9. // dư const => tính lại

      10. // const #1 => int là hằng, const #2 => & là hằng.

      Hướng dẫn lập trình C++ cho người mới học

    5. #5

      Ngày gia nhập
      07 2011
      Bài viết
      474

      const int const *foo(const int const &i) const

      cách khai báo này là sai rồi \. Làm gì có const int const ??

    6. #6

      Ngày gia nhập
      04 2010
      Nơi ở
      Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
      Bài viết
      504

      Mặc định const: ý nghĩa của const trong khai báo function

      Xem bài viết chi tiết tại đây, có cả vấn đề các bạn đang thắc mắc.
      __http://diendan.congdongcviet.com/showthread.php?t=41764

      Kết bạn với tôi <3
      Skype: giautm
      Facebook:
      https://fb.com/giautm.duongntt
      Email:
      [email protected]

    7. #7

      Ngày gia nhập
      07 2007
      Nơi ở
      TP HCM
      Bài viết
      66

      @INTP: Đồng ý với bạn const int const aVariable; là ko đúng. Nhưng nó vẫn hợp lệ khi dùng với con trỏ và reference

      C++ Code:

      Select All | Show/Hide

      1. const

        int

        const

        &

        aReference

        ;

      2. // hoặc

      3. const

        int

        const

        *

        aPointer

        ;

      Tuy nhiên, cách viết sau có thể là ổn hơn

      C++ Code:

      Select All | Show/Hide

      1. int

        const

        *

        const

        aPointerToConst

        ;

      Hướng dẫn lập trình C++ cho người mới học

    8. #8

      Ngày gia nhập
      09 2010
      Bài viết
      88

      cảm ơn bạn đây đúng là bài mà mình tìm kiếm trong diễn đàn của mình
      cách đây 2 năm mình đã đọc được 1 lần nhưng h cần tìm lại search hoài không ra đành phải tạo topic

      edit:
      const type và type constnhư nhau
      dù là khai báo hàm hay khai báo biến

      và từ khóa const tính với khai báo bên trái gần nhất của nó, khi bên trái không có gì sẽ là bên phải (đau đầu)
      nghĩa là:
      int const *cpi <=> const int *cpi : con trỏ chỉ có thể trỏ tới 1 vùng nhớ kiểu const int
      int * const pci : con trỏ chỉ trỏ được 1 lần đầu tiên khi khai báo

      mấy kiến thức kiểu này không thể nhớ được = việc đọc sách 🙁

      Đã được chỉnh sửa lần cuối bởi quano1 : 05-08-2013 lúc

      11:09 PM

      .

    9. #9

      Ngày gia nhập
      07 2011
      Bài viết
      474

      Microsoft’s compiler toàn rape standard thì nhắc tới nó làm gì ở đây @.@ //nó chỉ được nhiều người thích vì bộ debug của nó trên cả tuyệt vời.

      1. int* ptr;
      *ptr = 1; //ok
      ++ptr; //ok

      2. const int* ptr; //hay int const* ptr;
      *ptr = 1; //không được, vì ptr là con trỏ trỏ tới hằng số, nên *ptr là hằng số, ko thể thay đổi được.
      ++ptr; //ok

      3. int* const ptr;
      *ptr = 1; //ok
      ++ptr; //không được, vì giá trị địa chỉ mà ptr chứa không thể thay đổi.

      4. const int* const ptr;
      *ptr = 1; //không được, vì ptr là con trỏ trỏ tới hằng số, nên *ptr là hằng số, ko thể thay đổi được.
      ++ptr; //không được, vì giá trị địa chỉ mà ptr chứa không thể thay đổi.

      nếu const int const* ptr; mà có nghĩa, thì int const* ptr; dịch là (2) hay (3) ??

      cách đọc trong C++ thì hình như là từ phải sang trái:
      int const * ptr;
      từ trái sang phải ta thấy có; ptr, *, const, int
      đọc là: ptr(ptr) là con trỏ(*) trỏ tới hằng(const) số nguyên(int).
      Thì hiểu là: ptr là con trỏ trỏ tới hằng số (nguyên) (pointer to constant, hay con trỏ ko thể thay đổi giá trị chứa trong địa chỉ mà nó trỏ tới được)

      int * const ptr;
      từ trái sang phải ta thấy có; ptr, const, *, int
      đọc là: ptr(ptr) là hằng (const) con trỏ(*) trỏ tới số nguyên(int).
      Thì hiểu là: ptr là hằng con trỏ (constant pointer, pointer ko thể thay đổi địa chỉ mà nó đang chứa được), trỏ tới số nguyên.

      //edit chục lần rồi ~.~

      Đã được chỉnh sửa lần cuối bởi INTP : 05-08-2013 lúc

      10:31 PM

      .

    10. #10

      Ngày gia nhập
      09 2010
      Bài viết
      88

      mình code trên linux
      mình thích c++ từ lâu rồi, nhưng vì nó quá khó và đòi hỏi luôn phải có kinh nghiệm nên đành phải làm web php để tạm sống đã
      bây giờ tạm ổn rồi thì lại đi tìm việc c++ để tiếp tục ước mơ
      ai có kinh nghiệm làm c++ cho mình hỏi, thông thường trong các dự án c++ người ta hay đòi hỏi phải như thế nào?
      kinh nghiệm ở đây là kinh nghiệm code để tránh bug nhiều nhất có thể, compile trên nhiều OS, dùng được nhiều opensource lib…?
      rất cảm ơn mọi người đã chia sẻ

    Lên trên