Làm thế nào tôi có thể học viết C ++ thành ngữ?


27

Tôi là một sinh viên khoa học máy tính, và kết quả là, tôi đã được dạy C ++ như một phiên bản tốt hơn của C với các lớp học. Tôi cuối cùng đã cố gắng phát minh lại bánh xe bất cứ khi nào cần một giải pháp cho một vấn đề phức tạp, chỉ sau đó, một số tính năng ngôn ngữ hoặc một số thói quen thư viện tiêu chuẩn có thể đã làm điều đó cho tôi.

Tôi là tất cả cảm thấy thoải mái với tôi char**(int*)(someVoidPointer)các thành ngữ, nhưng thời gian gần đây, sau khi thực hiện một (nhỏ) đóng góp cho một dự án mã nguồn mở, tôi cảm thấy đó không phải là cách người ta đáng lẽ phải suy nghĩ khi viết C ++. Nó khác nhiều so với C.

Xem xét rằng tôi biết lập trình hướng đối tượng khá tốt, và tôi ổn với đường cong học tập dốc, bạn sẽ gợi ý gì cho tôi để tôi có thể theo dõi C ++ khi tôi viết mã C ++?


7
Dựa trên ý kiến ​​của bạn, bạn biết cú pháp C ++ và đó là tất cả. Bạn không mã hóa trong C ++. Thẻ C ++ trên stackoverflow là một nơi tốt để bắt đầu, nó bao gồm một danh sách đọcCâu hỏi thường gặp . Cách thực sự duy nhất để học là viết mã và nhận người dùng có kinh nghiệm để bình luận. Bạn có thể đặt mã của bạn ở đây để xem xét. Một ví dụ điển hình
Martin York

1
Cùng với lời khuyên của @ LokiAstari (mà tôi đồng ý), tôi muốn nói rằng bạn bè của bạn là đúng, và làm việc theo cách của bạn thông qua Gia tốc C ++ có lẽ là một ý tưởng hay. Tôi nghi ngờ bạn sẽ thấy rằng bạn cần ít sự lướt qua hơn - nó dành cho những người ở vị trí của bạn, đã biết lập trình và chủ yếu cần học các thành ngữ của C ++ hiện đại.
Jerry Coffin

vâng, thực sự tôi đã hoàn thành hai chương đầu tiên, nhưng những thứ ở đó chủ yếu là những gì tôi đã biết - tôi hiểu rằng một tác giả sẽ không đến và viết một cuốn sách cho tôi , mặc dù vậy :) @LokiAstari cảm ơn vì nhận xét siêu hạng :)
yati sagade

3
@yatisagade Đừng mong đợi một cuốn sách dạy cho bạn tâm lý ngôn ngữ trong một vài chương. Nó có thể cực kỳ nhàm chán, vì bạn đã biết cú pháp rồi, nhưng bạn nên cam kết sẽ trải qua một vài cuốn sách C ++, đọc mọi thứ và thực hiện từng bài tập khi bạn là người mới bắt đầu học ngôn ngữ. Được dạy sai cách có nghĩa là bạn phải tăng gấp đôi nỗ lực của mình, vì bạn cần quên đi những sai trái và học các quyền (hoặc một cái gì đó tương tự).
yannis

1
Tôi hoàn toàn thoải mái với [...] - (int) (someVoidPulum) Bạn đã từng gỡ lỗi bản dựng 64 bit trước đây chưa?
Ed S.

Câu trả lời:


12

Dựa trên ý kiến ​​của bạn, bạn biết cú pháp C ++.
Bạn không mã hóa trong C ++ nhưng những gì thường được coi là C với các lớp.

Thẻ C ++ trên stackoverflow là một nơi tốt để bắt đầu, nó bao gồm một danh sách đọcCâu hỏi thường gặp .

Cách thực sự duy nhất để học là viết mã và nhận người dùng có kinh nghiệm để bình luận. Bạn có thể đặt mã của bạn ở đây để xem xét. Một ví dụ tốt

Tôi hoàn toàn thoải mái với "char *" của tôi

Ngừng sử dụng chúng, chuyển sang std :: string.

và thành ngữ (int) (someVoidPulum).

Ngừng sử dụng chúng (ngoài giao diện với mã C). Sử dụng khái niệm functor cung cấp một số lợi thế (bao gồm ý tưởng về trạng thái đóng gói).

Nhưng gần đây, sau khi đóng góp (nhỏ) cho một dự án OSS, tôi cảm thấy đó không phải là cách bạn nghĩ trong C ++. Nó khác nhiều, mặc dù C có vị trí riêng của nó.

Vâng. C và C ++ đã chuyển hướng như ngôn ngữ. Mặc dù bạn có thể sử dụng thực tế cùng một cú pháp, những gì được coi là mã C tốt thường không được coi là mã C ++ tốt (hoặc ngược lại).

Một số người bạn đã đề xuất Tăng tốc C ++, nhưng một lần nữa tôi biết các loại là gì, và các lớp là gì và quá tải là gì.

Bạn có những điều cơ bản xuống.

Làm thế nào một lập trình viên C ++ (bị cắt xén), người có thể phát ra âm thanh với các khái niệm OO có thể viết các chương trình thành ngữ trong ngôn ngữ.

Với rất nhiều công việc :-)


Đây không phải là cách duy nhất. Bạn có thể học được rất nhiều từ những cuốn sách hay.
Dima

1
@Dima: Hoàn toàn đúng. Bạn có thể học được rất nhiều từ sách. Nhưng không có gì đánh bại kinh nghiệm và sử dụng ngôn ngữ trong sự tức giận, thất bại khi thử lại thất bại một lần nữa và tìm ra cách tốt nhất để làm điều đó. Tôi cho rằng bạn có thể học tiếng Pháp từ một cuốn sách nhưng tôi nghi ngờ người Pháp sẽ coi bạn là người thông thạo.
Martin York

6
IMHO, cách học hiệu quả nhất là bắt đầu với những cuốn sách, học cách đúng đắn để làm mọi thứ, thử nó trong thực tế và sau đó nhờ ai đó phê bình mã của bạn.
Dima

@Dima: Tôi không có tranh luận với điều đó.
Martin York

12

Cuốn sách C ++ hiệu quả dạy một số điều thú vị và sẽ mang lại cho bạn đánh giá cao các tính năng của C ++. Ngoài ra còn có STL hiệu quả - Tôi chưa đọc nó nhưng tôi chắc chắn rằng nó sẽ là một cuốn sách tuyệt vời nếu bạn không quen thuộc với STD.

Điều quan trọng cần học là bạn nên sử dụng ngôn ngữ và không phát minh lại bánh xe liên tục . Bạn đã học cách tạo ra chúng, vì vậy hãy làm cho nó dễ dàng với chính bạn (và những người khác!) Và sử dụng các công cụ cho tất cả tiềm năng của chúng.

Là một lưu ý phụ, bạn sẽ gặp rất nhiều người yêu cầu STD được sử dụng. Điều này cũng tệ như suy nghĩ khi chỉ sử dụng char*- đôi khi nó không phải là công cụ chính xác và có rất nhiều công cụ khác. Theo nghĩa tương tự, đừng nản lòng khi tạo các lớp container của riêng bạn - nếu bạn sẽ sử dụng char*nơi tốt nhất để thực hiện thì nó được bọc an toàn trong một lớp.


Tôi biết về loạt bài hiệu quả, (chưa đọc chúng) - Nhưng tôi đoán chúng là những vấn đề thực tiễn tốt nhất, phải không?
yati sagade

3
@yati sagade: không, những cuốn sách đó chính xác là những gì bạn cần để đi từ "C với các lớp" đến C ++ đầy đủ.
Dima

Tôi thấy - thực sự tôi đã có c ++ hiệu quả bởi Meyers xếp hàng sau Gia tốc C ++.
yati sagade

1
@Dima "Mục đích của cuốn sách này là chỉ cho bạn cách sử dụng C ++ hiệu quả. Tôi giả sử bạn đã biết C ++ như một ngôn ngữ và bạn có một số kinh nghiệm trong việc sử dụng nó. Những gì tôi cung cấp ở đây là hướng dẫn sử dụng ngôn ngữ để phần mềm của bạn có thể hiểu được, có thể bảo trì, di động, có thể mở rộng, hiệu quả và có khả năng hoạt động như bạn mong đợi. "- C ++ hiệu quả. Nó cũng bao gồm một số "gotchas" làm cho nó thú vị để đọc.
Pubby

1
@Dima: Cẩn thận đây. Phiên bản thứ 2 nhắm đến các lập trình viên C ++ mới đến từ C. Phiên bản thứ 3 (mới nhất) nhắm đến các lập trình viên đến từ các ngôn ngữ như Java, C #, v.v.
sbi

6

Tôi có thể đề nghị BUILD gần đây được đưa ra bởi Herb Sutter. Người được gọi là " Viết mã C ++ hiện đại: cách thức C ++ phát triển qua nhiều năm ":

Nhiều người nghĩ về C ++ giống như ngôn ngữ họ từng trải ở trường đại học hoặc giống như C C với các lớp học, nhưng ngôn ngữ C ++ đã phát triển rộng rãi trong những năm qua. Trong phần này, chúng tôi sẽ đề cập đến cách bạn có thể sử dụng C ++ để viết các ứng dụng sáng tạo, biểu cảm và đẹp mắt, cung cấp các ứng dụng hiệu suất và hiệu suất. Tham gia với chúng tôi để xem tiêu chuẩn C ++ 0x mới hoàn thành có thể làm cho việc viết C ++ hiệu quả như nhiều ngôn ngữ khác.

Bài thuyết trình không tệ, không quá dài, có một số gợi ý hay về các tính năng mới trong tiêu chuẩn mới nhất sẽ cung cấp cho bạn một vài gợi ý về việc cập nhật kiểu C / C ++ cũ của bạn.

Ngoài ra, bạn cần học STL - nó không phức tạp và có rất nhiều sách, ví dụ, STL hiệu quả, hoặc chỉ cần google cho các hướng dẫn STL để giúp bạn đi.


+1 Cảm ơn. Đó là tuyệt vời. Tôi rất vui khi hỏi câu hỏi này. Rất nhiều liên kết tuyệt vời :)
yati sagade

4

Tôi đã đọc Gia tốc C ++ của Andrew Koenig và Barbara Moo để giúp tôi dạy C ++, sau khi làm việc với C ++ được gần một thập kỷ. (Trên thực tế, tôi đã bắt đầu mày mò lập trình meta mẫu vào thời điểm đó.) Tôi vẫn thấy đó là một sự mặc khải, mặc dù tôi không nghĩ rằng nó đã dạy cho tôi bất kỳ sự thật mới nào về ngôn ngữ. 1

Mặc dù vậy, điều nó dạy tôi là nhìn và sử dụng C ++ như một ngôn ngữ cấp cao. Không để tinker với con trỏ thô và deletevà sử dụng thư viện tiêu chuẩn bất cứ nơi nào có thể.

Tôi có cảm giác rằng đây chính xác là những gì bạn đang theo đuổi.

1 Không phải là không còn gì để dạy tôi hồi đó (thậm chí còn rất nhiều, một thập kỷ sau), nhưng chỉ có rất nhiều kiến ​​thức bạn có thể vắt vào một cuốn sách giới thiệu 250 trang.


1

Trước khi trả lời - một lưu ý: C ++ thành ngữ là mục tiêu di động. Khi ngôn ngữ thay đổi, thành ngữ của nó cũng vậy. Trên thực tế, một số tính năng ngôn ngữ nhằm cho phép chúng tôi loại bỏ mã thành ngữ có thể được đơn giản hóa hoặc cải thiện với một số hỗ trợ từ chính ngôn ngữ hoặc ít nhất là thư viện chuẩn. Vì vậy, hãy nhớ rằng bất kỳ nguồn nào chỉ có thể thông báo cho bạn về những gì là thành ngữ tại thời điểm viết .

Đã nói rằng, bạn sẽ làm tốt để kiểm tra:

Trang web codereview.SX

Mạng StackExchange có một trang web có tên codereview.stackexchange.com . Nếu bạn đã viết một đoạn mã C ++ - một lớp, một phần của thư viện, một thứ không quá lớn - bạn có thể đăng nó ở đó và yêu cầu cộng đồng xem xét nó. Lưu ý rằng mã phải được biên dịch và có chức năng cơ bản - trang web đó không phải để gỡ lỗi.

Ngoài ra, bạn có thể tìm kiếm một số mã C ++ ở đó, liên quan đến những gì bạn đang làm việc và xem những gì người đánh giá nhấn mạnh. Bạn thậm chí có thể thử xem lại mã đã đăng mà không đăng câu trả lời, sau đó đọc những gì người khác nghĩ về nó.

Thuyết trình video hội nghị C ++

Có một số hội nghị dành cho nhà phát triển tập trung vào C ++ được tổ chức hàng năm:

và những cái đó thậm chí không phải là những cái duy nhất ... dù sao đi nữa, mỗi bài đăng này đều có video của nhiều / tất cả các bài thuyết trình. Những điều này sẽ dạy cho bạn rất nhiều , bao gồm một số mã hóa thành ngữ và nguyên tắc mà bạn có thể quyết định những gì nên hoặc không nên là thành ngữ.

Đôi khi, bạn thậm chí có thể có được các sàn trượt của loa.


0

Vâng, các dự án nguồn mở là một khởi đầu rất tốt. Đừng mong trở thành một lập trình viên chuyên nghiệp dựa trên các lớp đại học của bạn, họ không có ý định đó (như tôi đã viết trong câu trả lời của mình ở đây ).

Bạn dường như nhận thức được cú pháp, đó là tốt. Bây giờ hãy đi và đọc mã của người khác và đóng góp của riêng bạn để đánh giá ngang hàng. Bạn sẽ học được rất nhiều từ việc đọc mã và cố gắng hiểu nó, gỡ lỗi và sửa nó, và tất nhiên - thêm vào đó tuân thủ các quy ước mã hóa đã có sẵn.

Sách chuyên nghiệp cũng là một ý tưởng rất hay, như đã đề cập, và duyệt qua các câu hỏi và câu trả lời trên StackOverflow sẽ dạy cho bạn rất nhiều (nó chắc chắn dạy cho tôi rất nhiều, và tôi coi mình là một chuyên gia C ++).


-1

Đọc nhiều mã C ++ tốt có lẽ sẽ giúp ích. Bạn phải xem mã để bắt đầu cảm nhận về nó. Sau đó, một lần nữa, hầu hết các mã C ++ là sai.


"Hầu hết các mã C ++ là sai" - bạn có thể làm rõ? Tôi đã thấy rằng hầu hết các dự án OSS thực sự duy trì các tiêu chuẩn chất lượng cao.
yati sagade

1
Các dự án, vâng, nhưng googling về cách làm công cụ khá thường xuyên dẫn đến các ví dụ xấu.
Coder

1
@yati: Kinh nghiệm của tôi về các dự án OSS thì ngược lại.
sbi

@sbi có thể - Tôi đã tham gia vào dự án Mozilla và Google Chrome (thực tế không liên quan ở đây, nhưng loại học tập). Tìm thấy kỷ luật của họ xuất sắc!
yati sagade

@yatisagade: Ít nhất, hầu hết mã C ++ tồn tại được viết khi ngôn ngữ có các tính năng cần thiết để viết mã tốt; và hầu hết phần còn lại được viết phải sử dụng các thư viện được viết để làm việc với mã cũ hơn, do đó, mã mới hơn này phải được điều chỉnh theo chúng ở một mức độ nào đó. Và tất cả điều này là bất kể các lập trình viên có đầu tư thời gian và công sức cần thiết cho việc thiết kế và triển khai hợp lý hay không ...
einpoklum - phục hồi Monica
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.