Cho C ++ '11 được chấp thuận, điều này có thay đổi cách người mới bắt đầu học C ++ học ngôn ngữ không? [đóng cửa]


21

Tôi đã muốn học C ++ một thời gian và học AP Lập trình máy tính ở trường trung học (trở lại khi đó là C ++ chứ không phải Java). Tôi thích C và không tìm thấy thời gian để học C ++ hoặc tôi sẽ quay lại với C # nơi tôi làm việc hiệu quả hơn nhiều.

Câu hỏi của tôi là: cho rằng C ++ '11 đã được phê duyệt (mặc dù tôi biết không được thực hiện đầy đủ) điều này có thay đổi cách tôi nên tiếp cận việc học C ++ không? Tôi sở hữu C ++: Tài liệu tham khảo đầy đủ của Herb Schildt từ năm 1998. Tiêu chuẩn mới được phê duyệt có làm cho việc học từ những cuốn sách đó ít quan trọng hơn một số hướng dẫn / sách mới hơn bao gồm những điều từ tiêu chuẩn không? Có bất kỳ lợi ích từ việc học hỏi từ những cuốn sách cũ?


9
Ôi. Schildt. Tôi không thể nói về chất lượng của các tài liệu C ++ của anh ấy, nhưng các tài liệu C của anh ấy đã không đạt tiêu chuẩn trong một thời gian dài (ngay cả phiên bản mới nhất của C: TCR vẫn có một vài lỗi không hề nhỏ). Tôi khuyên bạn nên tìm kiếm một tác phẩm hiện tại của một tác giả khác.
John Bode

C ++ 11 đã không thay đổi những điều cơ bản của C ++, điều cần phải học để làm bất cứ điều gì được giới thiệu trong lần sửa đổi gần nhất và không tồn tại trong phiên bản C ++ trước đó.
Ramhound

11
Không bao giờ tin tưởng một cuốn sách của Herb Schildt. Thực sự, trong khi phần lớn các cuốn sách C ++ có những cuốn sách tồi (và tôi không đề cập đến các vấn đề về phong cách ở đây, nhưng lỗi thực tế và quảng bá các phong cách lập trình nổi tiếng dẫn đến mã lỗi), các cuốn sách của Schildt rất tệ, Tên của anh ấy đã trở thành một phần của một meme.
sbi

4
@Ramhound: Tôi không đồng ý. Nếu đó là sự thật, trước tiên chúng ta vẫn học quản lý tài nguyên thủ công và chỉ sau đó là những cách an toàn hơn để thực hiện tài nguyên động. Rất may, điều này là (từ từ) thay đổi. Các khả năng mới, ngay cả khi chúng "chỉ" trong thư viện, hãy gọi các thành ngữ mới. Nếu bạn bắt đầu với một ngôn ngữ, tại sao học các thành ngữ cũ trước, chỉ phải học chúng sau?
sbi

Câu trả lời:


16

Chắc chắn rồi. Ngày nay, ba điều thường có trong bài 2 sẽ di chuyển nhiều, muộn hơn nhiều:

  • chuỗi dưới dạng mảng char *, các phương thức strlen, strxxx, v.v.
  • mảng nói chung và số học con trỏ
  • xóa những gì bạn mới, xóa [] những gì bạn mới [] và thậm chí cả các hàm hủy

Những điều thường có trong bài 99 nên di chuyển nhiều, sớm hơn nhiều

  • các mẫu như những thứ để sử dụng (viết, không quá nhiều)
  • std :: chuỗi
  • std :: shared_ptr <>
  • std :: vector <>, iterators, các bộ sưu tập khác

Evey nguyên con trỏ nên ngay lập tức được đưa cho một trình bao bọc con trỏ thông minh (tôi sẽ bắt đầu với chia sẻ và xem xét duy nhất sau này vì nó yêu cầu giải thích các tham chiếu std :: move và rvalue). Làm điều này sẽ làm cho việc học C ++ cảm thấy rất giống như học Java hoặc C #, nơi bạn học thư viện cùng lúc với ngôn ngữ. Nó cũng sẽ lấy đi rất nhiều công việc bộ nhớ, và khiến mọi người bớt lo lắng về vấn đề gotchas.

Tôi cũng sẽ làm việc lambdas vào bức tranh lần đầu tiên chúng tôi muốn lặp lại qua một bộ sưu tập và làm một cái gì đó cho từng yếu tố.

Tuyên bố miễn trừ trách nhiệm: Tôi đang viết một khóa học C ++ cho Pluralsight ngay bây giờ và sử dụng phương pháp này. Mô-đun cuối cùng là "hiểu mã của người khác" và đó là nơi tôi sẽ đặt những thứ khó hiểu như chuỗi char *, quản lý bộ nhớ thủ công, số học con trỏ, v.v.

Cập nhật: một vài người đã hỏi tại sao sự tồn tại của C ++ 0x lại truyền cảm hứng cho việc dạy những điều có thể được dạy với C ++ 03. Tôi nghĩ đó là một số điều:

  • con trỏ thực sự thông minh, thân thiện với bộ sưu tập, loại bỏ nhu cầu về những thứ như "một mảng con trỏ nhân viên" khiến chúng ta luôn rơi vào mới / xóa, số học con trỏ, v.v.
  • tự động lấy đi nỗi đau của khai báo lặp
  • lambdas làm cho việc giảng dạy một cái gì đó một người bình thường sẽ làm
  • thậm chí một cái gì đó tầm thường như phân tích cú pháp sẽ >>loại bỏ chính xác gotcha sẽ có khi khai báo một số mẫu của mẫu
  • và v.v.

Theo cách tôi thấy, có những điều chúng ta có thể đã thay đổi về cách chúng ta dạy C ++ một thời gian trước đây, nhưng một số người trong chúng ta đã giữ lại vì chúng ta vẫn cần cách học cũ để dự phòng hoặc bởi vì việc dạy nó chỉ liên quan rất nhiều của kiến ​​thức phức tạp.


3
Tại sao bạn cảm thấy rằng quản lý bộ nhớ thủ công nên được dạy sau này? Tôi nghĩ rằng điều quan trọng là phải biết và nó mang lại nhiều sự đánh giá cao khi học con trỏ thông minh. Tôi đã phải học quản lý bộ nhớ (và mảng char) trong C và nó khiến tôi đánh giá cao RAII và std :: chuỗi nhiều hơn tôi nghĩ nếu tôi không phải làm điều đó.
Jetti

1
Ví dụ của bạn chủ yếu áp dụng cho C ++ 98 so với C ++ chuẩn, không phải C ++ 03 so với C ++ 11. Tôi cho rằng lambda đã cho, std::for_each()sẽ phổ biến hơn nhiều so với trước đây, autosẽ rất quan trọng và cú pháp khai báo hàm mới (kết hợp với decltype) sẽ được sử dụng khá nhiều trong mã mẫu. Đó là những điều không có cuốn sách C ++ hiện tại dạy. Nhưng, vâng, nói chung tôi đồng ý với bạn ( +1). Khi tôi bắt đầu cung cấp các khóa học C ++, tôi đã bắt đầu với Tăng tốc C ++ và mặc dù khóa học của tôi bắt đầu đi chệch hướng ngày càng nhiều so với nó, nó vẫn đúng với nguyên tắc cơ bản.
sbi

3
@Jetti: Tôi hiếm khi làm quản lý tài nguyên thủ công và nếu tôi làm vậy, thì đó là để thực hiện các lớp RAII. Tôi làm, tuy nhiên, sử dụng nhiều trong số các lớp. Theo đó, việc sử dụng công cụ RAII có vẻ quan trọng hơn việc xử lý các nguồn tài nguyên thô và do đó nên được dạy sớm hơn, với sự nhấn mạnh hơn.
sbi

1
@sbi: Tôi phải đồng ý với bạn ở đó - hầu hết các ví dụ này có vẻ như Modern C ++ 101 từ năm 2006, không có gì mới về C ++ 11.
DeadMG

2
@Jetti: Bước quan trọng nhất để làm chủ C ++ là học tất cả các cách mà bạn có thể tránh việc quản lý bộ nhớ thủ công. Đó là điều hoàn toàn nên được dạy "sau này", một khi bạn đã học được cách bạn có thể đi qua quản lý bộ nhớ "tự động".
jalf

9

Khá nhiều, vâng. Một thực tế đơn giản là trong C ++ 98 và 03, nhiều thực tiễn tốt về cơ bản không thể sử dụng được do chất lượng hỗ trợ ngôn ngữ kém cho ví dụ lập trình chức năng. Bây giờ lambdas tồn tại và hoạt động, mọi người có xu hướng chấp nhận các giao diện chức năng tốt hơn rất nhiều so với trước đây và lập trình chung thậm chí còn mạnh hơn trước.

Vào năm 1998, mọi người chỉ mới bắt đầu khám phá cách viết mã nhanh, an toàn, chất lượng cao bằng C ++ và rất nhiều mã là "C là Classes". Trong C ++ 11, các thành ngữ rất khác nhau như sao chép và hoán đổi và Quy tắc ba (bây giờ là Năm) được biết đến và định nghĩa, và rất nhiều loại quản lý tài nguyên đã trở thành Tiêu chuẩn, giống như shared_ptrunique_ptrcác Tiêu chuẩn trước đó chỉ đơn giản là bỏ chúng như lỗ hổng.

Bạn có thể xem câu hỏi này để biết danh sách tài liệu tham khảo tuyệt vời trên C ++.


1
Thật ra tôi sẽ bắt đầu kết thúc "C với các lớp" sớm hơn vài năm so với năm 1998, nhưng nói chung bạn chắc chắn đúng, và tôi sẽ không mặc cả hơn nửa thập kỷ. +1từ tôi.
sbi

4

Tôi không biết cuốn sách cụ thể mà bạn đề cập. Nhưng nói chung, bạn có thể nói rằng tất cả những điều cơ bản về cú pháp C ++, kiểu dữ liệu và OOP vẫn đúng. Điều tương tự cũng sẽ xảy ra đối với các thư viện STL được đề cập trong hầu hết các sách dành cho người mới bắt đầu.

Mặc dù một cuốn sách cũ từ năm 1998 có thể đã bỏ lỡ một vài cập nhật và phát triển theo phong cách lập trình C ++, nhưng nó đã tích lũy trong cộng đồng trong những năm qua. Tôi sẽ tìm kiếm một chút tài nguyên cập nhật hơn một chút. Có quá nhiều hướng dẫn và tài liệu trực tuyến miễn phí sẽ cung cấp cho bạn một khởi đầu tốt. Một số trong số họ thậm chí có thể đề cập đến C ++ 0x.

C ++ 0x chắc chắn sẽ thay đổi rất nhiều về cách các lập trình viên nhìn thấy và sử dụng ngôn ngữ trong tương lai. Nhưng điều này sẽ ảnh hưởng đến các dự án phức tạp hơn, nơi các tính năng mới bắt đầu có ý nghĩa. Đối với người mới bắt đầu, điều này không quan trọng và bạn có thể tập trung vào việc làm quen với các khái niệm hiện có, điều đó đã đủ để học. Ví dụ, hầu hết các cuốn sách dành cho người mới bắt đầu không đi sâu vào các mẫu, vì vậy các mẫu mới nhất không phải là những gì bạn cần biết bây giờ.

Có thể có một cái nhìn vào một danh sách các thay đổi . Ít nhất một vài khái niệm như phạm vi dựa trên các vòng lặp rất có thể sẽ xuất hiện trong các hướng dẫn mới ngay cả đối với người mới bắt đầu. Vì vậy, nó là giá trị để có một cái nhìn.


Cảm ơn! Bạn có tình cờ biết bất kỳ tài nguyên phong nha trực tuyến hoặc sách?
Jetti

2
Không, trang web cplusplus thường được đề cập như một tài nguyên không bao giờ nên được giới thiệu cho bất cứ ai mà bạn muốn thực sự viết mã tốt.
DeadMG

@DeadMG Bạn có trang web thay thế không?
TheLQ

@TheLQ: Bạn sẽ nhận được nhiều hơn với tham chiếu MSDN, hoặc cprogramming.com.
DeadMG

@Jetti: Tôi không biết bất kỳ tài liệu nào để sử dụng C ++ 11 để dạy C ++. Tất cả mọi thứ tôi đã thấy đều dạy C ++ 11 trên C ++ 03. Để tìm hiểu sau, hãy xem stackoverflow.com/questions/388242/ .
sbi

3

Tất nhiên, liên quan đến bất kỳ thứ gì liên quan đến công nghệ, việc cập nhật các vật liệu mới nhất luôn là một bước đi thông minh, tuy nhiên, những thay đổi được giới thiệu trong C ++ 11 được thiết kế để không làm rung chuyển con thuyền. Nếu bạn chưa quen với C ++ (hoặc lập trình nói chung), đây không phải là điều tôi lo lắng.

Ngoài ra, nếu bạn là một lập trình viên chuyên nghiệp, bạn có thể đặt cược rằng bạn sẽ làm việc với mã của người khác trong tương lai, vì vậy luôn có giá trị trong cách hiểu mọi thứ hoạt động, ngay cả khi đó là một kỹ thuật mất giá trong thực tế.


Cảm ơn phản hồi của bạn, tôi đoán rằng ít nhất nó sẽ giúp tôi xem mã cũ khi sử dụng tài nguyên cũ.
Jetti

Làm thế nào lambda, autovà thực thi chức năng không đồng bộ có thể làm bất cứ điều gì ngoài "đá thuyền"?
sbi

1
Tôi cho rằng có sự khác biệt giữa việc giới thiệu các công cụ mới và sự thay đổi lớn trong triết lý thiết kế (ví dụ như chúng ta đang thấy với PHP)
leo

1
@leo: Tôi không đồng ý. Sự ra đời của STL, con trỏ thông minh và cơ sở mẫu phong phú đã thay đổi hoàn toàn triết lý thiết kế chủ đạo của C ++. Gần như mọi thư viện boost đều hoàn toàn khác với thư viện C ++ trung bình của thập niên 90.
sbi
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.