C ++ dành cho nhà phát triển C #


24

Tôi biết C # khá tốt (tự học, thật đáng buồn) và cần thực hiện một số lập trình C ++ cho một ứng dụng Windows. Tôi đã có thể tìm thấy rất nhiều thông tin cho các nhà phát triển C ++ học C # nhưng không thể tìm thấy nhiều về việc học C ++ khi bạn đã biết C #. Có ai đi qua một danh sách tốt của những điều cơ bản?

MSDN có một so sánh nhưng nó không sâu sắc lắm.

Tôi có thể ghép nhiều nguồn nhưng tìm ra thứ gì đó ở ngoài đó - tôi không thể tìm thấy nó. Cảm ơn bạn đã giúp đỡ.


27
Tại sao "đáng buồn"? Đừng đặt mình xuống như thế. Tôi không biết nhà phát triển C # không tự học. Nhiều trong số đó là những nhà phát triển tuyệt vời .
Steven Evers

6
@SnOrfus - chủ yếu là vì giới hàn lâm trốn tránh nó vì những lý do chính trị giả phi lý.
Rei Miyasaka

5
Lời khuyên đầu tiên của tôi là đừng cố gắng học C ++ trong ngữ cảnh của C #. Bởi vì C # không phải là C ++ và C ++ không phải là C #. Đó có thể là một tuyên bố ngu ngốc để thực hiện nhưng C # làm cho khó thực hiện sai con trỏ và rất dễ làm sai trong C ++, ngay cả với các công cụ giúp thực hiện dễ dàng. Tôi sẽ thêm có nhiều điều mà hai ngôn ngữ chia sẻ chung. Về cơ bản, nó giống như nói rằng một quả táo và cam đều được trồng trên cây và có hạt và do đó chúng là quả.
Ramhound

2
@ReiMiyasaka, không giống như cách các nhà phát triển C # nhìn vào VB .NET.
Kyralessa

1
@Kyralessa Mà cũng không may. Tôi nghĩ đó không phải là một vấn đề chính trị nhiều vì nó là sự nhượng bộ đối với nhân khẩu học VB.NET - bởi vì hầu hết những người dùng C # sớm có nền tảng C / C ++. Trường tôi đã sử dụng VB.NET cho các khóa học mới bắt đầu. Họ dường như nghĩ rằng VB.NET là một món đồ chơi, và vì vậy không nên làm hỏng suy nghĩ của sinh viên như C #.
Rei Miyasaka

Câu trả lời:


10

Chuỗi này trên C ++ cho các nhà phát triển Java rất giống nhau và rất hữu ích, đặc biệt là bài đăng của Mark Byer:

Đọc những cuốn sách này:

Có lẽ điều quan trọng nhất cần ghi nhớ là hiểu sự khác biệt về kỹ thuật quản lý bộ nhớ giữa C # / Java và C ++ .

Một trong những giáo sư của tôi đến từ nền tảng Java và đã dạy một khóa học C ++ giới thiệu với suy nghĩ nó sẽ là bánh ngọt. Không có gì anh giải thích có ý nghĩa với bất cứ ai. Ông đã bị rò rỉ bộ nhớ ở khắp mọi nơi. Số học con trỏ của anh ấy thật khủng khiếp. Anh ấy không bao giờ đến phần OOP của giáo trình (cảm ơn chúa). Hầu như không có gì ông chứng minh sẽ biên soạn. Anh ta không hiểu rằng char[]cần một trọng điểm \0. Đừng kết thúc như anh ấy.


4
Đáng tiếc là không ai trong C ++ sử dụng char[]sau đó , phải không?
DeadMG

5
@DeadMG Tôi không thể thấy quan điểm của bạn. Chỉ vì char[]hiếm khi được sử dụng trong C ++ không có nghĩa là nó không được dạy hoặc không nên dạy. char[]Điều quan trọng cần phải biết là vì C ++ là siêu nhóm của C và điều bắt buộc là nó phải hiểu chính xác nếu nó được học cả.
Rei Miyasaka

7
Vâng - một thời gian rất, rất lâu sau khi họ thành thạo về mọi khía cạnh khác của ngôn ngữ. Tôi muốn dạy cho sinh viên mới các chuyên ngành mẫu một phần và SFINAE. Trong C ++, bạn sử dụng std::stringvà nếu bạn phải can thiệp với API C, thì đó là những gì c_str()dành cho. Không cần lập trình viên xử lý char[]hoặc chấm dứt NULL trong bất kỳ vấn đề nào. Việc xử lý chuỗi kiểu C hoàn toàn và hoàn toàn không được chấp nhận cho mọi mục đích sử dụng ngoại trừ việc xen kẽ với mã C cũ, được xử lý hoàn hảo c_str().
DeadMG

4
Không có gì gọi là dạy char[]đúng, bởi vì tất cả các cách sử dụng char[]đều sai. Giáo sư của bạn có thể đã hoàn toàn ổn nếu anh ấy dính vào C ++ thay vì C.
DeadMG

4
Bạn sẽ thấy mã C được sử dụng trong C ++ cho dù bạn viết C hay không, và do đó, nếu bạn đang học C ++, bạn cần học C. Như tôi đã nói, tôi không tha thứ cho nó, nhưng thực tế là vấn đề là trường thường dạy C và sau đó tack trên C ++ sau, bởi vì học sinh cần phải được dạy những thứ như hệ điều hành thiết kế - mà, trừ BeOS và hệ điều hành nghiên cứu nhất định, hoàn toàn yêu cầu C. cho rằng, bạn làm cần phải hiểu chuỗi C. Một lần nữa, lần thứ ba, nếu tôi có cách của mình, tôi sẽ không dạy C ++ cho sinh viên năm thứ nhất, và lần cuối cùng, điều đó hoàn toàn nằm ngoài quan điểm.
Rei Miyasaka

14

Thật không may, C ++ không cơ bản lắm, vì vậy tôi sẽ không hy vọng gì cho bạn. Ngoài ra, có rất ít bạn sẽ biết về C # thậm chí có thể chuyển từ xa sang C ++, vì vậy tôi sẽ không mong đợi bất kỳ tài liệu cụ thể nào tồn tại trên góc đó. Bạn sẽ cần học từ đầu.


3
Điều đó sẽ giải thích tại sao không có nhiều ngoài đó. Sau khi đọc C ++ một chút, có vẻ như bạn đúng - đó là một thế giới hoàn toàn khác. Cảm ơn bạn đã giúp đỡ.
Mark Williams

1
+1, sẽ có rất ít bạn biết về C # thậm chí có thể chuyển từ xa sang C ++ . Tôi đã học được điều này một cách khó khăn.
Người học việc

Như một điểm nhanh, tôi sẽ nói có rất nhiều C ++ cơ bản. Phân biệt các con trỏ / tham chiếu và các mẫu C ++ có thể khiến đầu bạn quay cuồng ngay từ đầu, nhưng khi nói đến nó vẫn có các lớp coutvà các cách đơn giản để đạt được các mục tiêu đơn giản
Kieren Johnstone

1
@KierenJohnstone: Bạn có thể có nghĩa là "những cách chậm và không an toàn để làm những việc" như "phân rã mảng-con trỏ" và những thứ như vậy.
DeadMG

12
Đẹp hoàn toàn không có ích trả lời.
dbracey

9

Không có sửa chữa dễ dàng cho điều này, C ++ không đặc biệt khó khăn, nhưng nó không dễ dàng cho người mới bắt đầu.

Tôi khuyên bạn nên đọc những điều cơ bản về lập trình C (để có được nền tảng của những thứ cấp thấp mà bạn sẽ tìm thấy), sau đó tìm hiểu STL, tiếp theo là các bài viết từ Scott Meyers. Đây là một để giúp bạn bắt đầu, vì nó cho thấy bạn nên viết C ++ hiện đại như thế nào, so với C-with-class.


2
+1: Tôi muốn thêm sách của Meyer (sê-ri C ++ / STL hiệu quả). Tôi đã có tất cả, và họ thật tuyệt vời.
Steven Evers

12
-1 cho reading up on C programming. Tôi nghĩ rằng điều này có hại nhiều hơn là tốt và đưa ra quan niệm rằng C và C ++ là những ngôn ngữ cần được nghiên cứu cùng nhau.
sebastiangeiger

2
@sebastiangeiger: bạn bỏ lỡ vấn đề là khi người ta phải làm việc với các ứng dụng C ++ trong thế giới thực hiện tại, bạn sẽ thường xuyên phải đối phó với các cấu trúc giống như C. Do đó +1, ít nhất là để loại bỏ downvote của bạn.
Doc Brown

5
@DocBrown Có thể, nhưng tôi hiện đang ở một trong những dự án cũ của C ++ và tôi có thể nói rằng những người tiền nhiệm của tôi chủ yếu chỉ là các lập trình viên C đã lưu các tệp nguồn của họ dưới dạng * .cpp. Tôi thấy rằng tôi đang sử dụng rất ít deletevà mảng C và những thứ khác không được khuyến khích trong C ++ so với trước đây, điều mà tôi cho là KHÔNG nghiên cứu rõ ràng C. C tương đối đơn giản, bạn có thể tìm ra khá nhanh những gì mã làm được.
sebastiangeiger

3
@gbjaanb: Không có gì, về STL đòi hỏi phải biết mallocfree. Một nhà phát triển C ++ tuyệt vời cuối cùng sẽ muốn biết về họ. Bắt đầu với họ là một điều hoàn toàn khác.
DeadMG

7

Tôi không chắc nếu bạn vẫn đang tìm kiếm tài liệu, tôi đã tìm thấy bài viết này một vài tháng trước. Đó không phải là một cuốn sách (chỉ có 53 trang). Phần giới thiệu đã nói lên tất cả:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithbloss.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

Và cũng có một bài cập nhật:

http://geekswithbloss.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Chúc bạn học vui vẻ :)


Mặc dù vậy, hãy cẩn thận khi sử dụng tài liệu này, nó hiển thị C ++ theo cách rất tập trung của Microsoft (nó cũng nói như vậy). Nó không phân biệt giữa các tính năng C ++ 03 và C ++ 11, và đôi khi thậm chí còn hiển thị các tiện ích mở rộng không chuẩn như là giải pháp ưa thích. Bạn sẽ kết thúc với mã không thể truy cập cao nếu bạn làm theo hướng dẫn đó.
Fabio Fracassi

4
  • Xem ra để quản lý bộ nhớ. Nhận ý tưởng rõ ràng về cách con trỏ và tham chiếu hoạt động trong C ++ trái ngược với C #. Ngoài ra, RAII, quản lý bộ nhớ thủ công và con trỏ thông minh cuối cùng.
  • Mẫu và thuốc generic trông giống nhau nhưng là những con thú khác nhau. Biết nội bộ về cách thức hoạt động của các mẫu.
  • Có một số khác biệt cú pháp nhỏ nhưng hấp dẫn. Học chúng.
  • Bạn đã quen với STL thay vì .net BCL. Bạn có thể sẽ bỏ lỡ một số bit tốt nếu nghiện LINQ.
  • Có một số khác biệt về thiết kế cơ bản giữa C ++ và C #. Vì vậy, bạn không thể chỉ đưa ra một ý tưởng. Bất cứ điều gì bạn xây dựng với C ++, bạn phải thiết kế từ đầu.
  • Chúc may mắn

1

Tôi nghĩ thật tốt khi bạn không tìm thấy quá nhiều hướng dẫn từ C # đến C ++. Họ có thể làm rối trí não của bạn. Nó rất giống với việc cố gắng học lái xe máy trước rồi sau đó chuyển sang xe đạp (không phải là một môn giải phẫu hoàn toàn phù hợp nhưng bạn có ý tưởng). Tốt hơn là bạn nên lấy một cuốn sách mới về C ++. Vì bạn đã quen thuộc với các khái niệm OOP, bạn có thể bỏ qua phần giới thiệu dài cho các khái niệm OOP (chúng có nghĩa là cho những người chuyển từ C sang C ++). Hoặc đi trực tiếp cho một cuốn sách tham khảo có nghĩa là cho cấp độ từ trung cấp đến trung cấp hoặc trung cấp.


1

Tôi khuyên bạn nên đi đến Rosetta Code và so sánh hai. Trong khi bạn ở đó, hãy giữ một liên kết các thành ngữ C ++ và cố gắng phát hiện ra chúng. Sau đó dành một chút thời gian cho lĩnh vực con trỏ / tham chiếu / bộ nhớ / hàm hủy. Sau đó tìm hiểu về bộ tiền xử lý - nó thực sự có thể là bạn của bạn khi nói đến việc che giấu những điều xấu xí, tôi hơi nhớ nó. Cuối cùng, STL.


1

Vì vậy, khoảng một năm trước tôi đã ở cùng một chiếc thuyền với bạn: tự học c # dev, người cảm thấy cần phải học C ++. Cấp, tôi dừng lại và bắt đầu nhiều lần. Trong nỗ lực thứ ba của tôi, cuối cùng tôi đã vượt qua nó.

Điều bắt buộc phải hiểu là, về mặt phương pháp của C ++ và C #, bạn có thể sẽ dành nhiều thời gian để hiểu phương thức thao tác dữ liệu thông qua con trỏ và tham chiếu thực sự có nghĩa là gì, cũng như khi nào và làm thế nào để sử dụng chúng trong hoàn cảnh.

Điều thú vị về C ++ là phần lớn việc phân bổ ngăn xếp đối tượng khá đơn giản và bạn nên phân bổ các đối tượng theo cách này nếu chương trình của bạn sẽ đáp ứng các yêu cầu được chỉ định theo phương pháp này. Mặt khác, bạn dựa vào con trỏ để có tốc độ, hiệu quả và dọn dẹp nhanh chóng. Tôi khuyên bạn nên đọc điều này: http://www.parashift.com/c++-faq-lite/ vì nó sẽ cung cấp cho bạn rất nhiều hiểu biết về kỹ thuật về cách thức hoạt động của C ++ dưới mui xe.

Tôi sẽ cho bạn một ví dụ:

Trong C ++ tồn tại triển khai hàm tạo này được gọi là "danh sách khởi tạo", khác với khởi tạo các thành viên lớp trong phần thân của hàm tạo. Tại sao? Bởi vì trừ khi kiểu được khởi tạo là nguyên thủy, trình biên dịch sẽ thực sự tạo nhiều và không cần thiết bản sao bản sao của đối tượng được tạo khi được phân bổ trong phần thân của ctor. Điều này có khả năng làm giảm hiệu suất, tùy thuộc vào trình biên dịch cũng như các yêu cầu mở rộng của ứng dụng.

Biết đại biểu là gì? Chà, trong C ++, nó được biết đến như là một con trỏ hàm . Ngôn ngữ này ban đầu khá khó để thành thạo, nhưng nếu bạn muốn trở nên tuyệt vời ... thì chắc chắn là bắt buộc.

C # rất dễ ... rất dễ.


C # Đại biểu và con trỏ hàm c khá khác nhau. Một đại biểu gần với một functor trong C ++ hơn là một con trỏ hàm.
CodeInChaos

-2

Tin tôi đi, Chọn một cuốn sách hay về C ++ (còn nhiều nữa, chỉ cần tìm kiếm) và bắt đầu học ...


1
BTW, học một số C trước (con trỏ, mảng, cấu trúc) sẽ tốt
Muhammad Hewedy

7
Học C trước C ++ sẽ đưa bạn trở lại thời kỳ đồ đá. Ngày nay, chúng ta rất hiếm khi sử dụng mảng và con trỏ trong C ++. Ngôn ngữ đã phát triển ra khỏi chúng từ lâu.
dòng chảy

7
@Muhammad: Mọi người khác thích tốc độ, an toàn, dễ bảo trì.
DeadMG

3
@DPD: Chà, nhiều lập trình viên C ++ chuyên nghiệp, bao gồm cả Bjarne Stroustrup (người phát minh ra ngôn ngữ), không đồng ý với bạn. Cuốn sách mới nhất của ông dạy sử dụng các đối tượng và mẫu ngay từ đầu, trong khi các mảng và con trỏ không được nói đến trước Chương 17 (trang 500 và một cái gì đó).
dòng chảy

2
@DeadMG. Có thể, nhưng bạn không thể hoàn nguyên tiến hóa C-> C ++. Nếu bạn ghét phần C của C ++, hãy tìm Java hoặc C #. Cá nhân, tôi thấy rằng việc tập trung vào con trỏ và mảng trong C trước khi đến C ++ đã giúp tôi rất nhiều trong sự nghiệp. Chắc chắn, bạn có thể mã toàn bộ ứng dụng mà không cần chúng nhưng nếu bạn muốn những lợi ích của đa hình, bạn cần biết con trỏ. Có bao nhiêu mẫu GoF quan trọng có thể được thực hiện mà không có con trỏ? Điều đó không giống với những người bạn của tôi đã tránh những phần "khó" khi học C. Hầu hết họ đều cảm thấy khó hiểu về đa hình.
DPD
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.