Là C ++ hiện đại ngày càng trở nên thịnh hành? [đóng cửa]


132

Khi tôi mới học C ++ 6-7 năm trước, những gì tôi học được về cơ bản là "C với các lớp học". std::vectorchắc chắn là một chủ đề nâng cao, một cái gì đó bạn có thể tìm hiểu nếu bạn thực sự muốn. Và chắc chắn không có ai nói với tôi rằng các tàu khu trục có thể được khai thác để giúp quản lý bộ nhớ. Ngày nay, ở mọi nơi tôi nhìn thấy tôi đều thấy RAII và SFINAE và STL và Boost và, tốt, Modern C ++. Ngay cả những người mới bắt đầu với ngôn ngữ dường như được dạy những khái niệm này gần như từ ngày 1.

Câu hỏi của tôi là, điều này đơn giản là vì tôi chỉ thấy "tốt nhất", nghĩa là các câu hỏi ở đây trên SO và trên các trang lập trình khác có xu hướng thu hút người mới bắt đầu (gamedev.net), hoặc đây thực sự là đại diện của Cộng đồng C ++ nói chung?

C ++ hiện đại có thực sự trở thành mặc định? Thay vì là một điều thú vị mà các chuyên gia viết về, liệu nó có trở thành "cách thức của C ++" không? Hay tôi chỉ không thể thấy hàng ngàn người vẫn học "C với các lớp" và viết các mảng động của riêng họ thay vì sử dụng std::vectorvà quản lý bộ nhớ bằng cách gọi thủ công mới / xóa từ mã cấp cao nhất của họ?

Nhiều như tôi muốn tin, có vẻ khó tin nếu cộng đồng C ++ nói chung đã phát triển rất nhiều trong một vài năm về cơ bản. Kinh nghiệm và ấn tượng của bạn là gì?

(từ chối trách nhiệm: Một người không quen thuộc với C ++ có thể hiểu sai tiêu đề khi hỏi liệu C ++ có được phổ biến so với các ngôn ngữ khác hay không. Đó không phải là câu hỏi của tôi. Thiết kế C ++ hiện đại: Các mẫu thiết kế và lập trình chung được áp dụng "và tôi chỉ quan tâm đến điều này so với" C ++ cũ ". Vì vậy, không cần phải nói với tôi rằng thời gian của C ++ đã qua và tất cả chúng ta nên sử dụng Python;))


2
Thật không may, tôi nghĩ rằng sẽ còn lâu nữa, toàn bộ cộng đồng C ++ sẽ đủ tiến bộ để nhận ra cách sử dụng thư viện chuẩn và tăng cường cùng với các bổ sung C ++ 0x sắp tới một cách hiệu quả chứ đừng nói đến việc thực hiện mã bằng các phương pháp tương tự. Tuy nhiên, tôi nghĩ C ++ 0x mang lại rất nhiều hy vọng để tăng mức độ phổ biến của C ++. Rất nhiều bất tiện cú pháp hàng ngày đã được cải thiện. Tôi đã luôn nghĩ về những điều này là nhỏ nhặt, nhưng với những người bên ngoài nhìn vào ngôn ngữ, đây là một nguồn khiếu nại phổ biến.
stinky472

15
Trong trường hợp của tôi, bất cứ khi nào tôi gặp một chuyên gia hiểu các kỹ thuật C ++ hiện đại như RAII và an toàn ngoại lệ (không nhất thiết phải nói đến cuốn sách của Alexandrescu) hoặc thậm chí các khái niệm cơ bản nhất như trình lặp và thuật toán chung, tôi tìm thấy thêm mười người không hiểu. Ít nhất là khi nói đến các chuyên gia, rất nhiều người trong số họ đã bị cuốn vào thời hạn cuối cùng để học bất cứ điều gì đã biết, vì vậy ngay cả các chuyên gia C ++ tự xưng thường có rất nhiều điều để học. Tôi sợ rằng mình cũng trở thành một trong những người có C ++ 0x: có rất nhiều thứ tôi sẽ phải học và điều chỉnh cho điều đó và tôi có thời hạn để đáp ứng.
stinky472

Câu trả lời:


76

Đây là cách tôi nghĩ rằng mọi thứ đã phát triển.

Thế hệ lập trình viên C ++ đầu tiên là lập trình viên C, trên thực tế họ sử dụng C ++ như C với các lớp. Thêm vào đó, STL chưa được đặt ra, vì vậy đó chính là C ++.

Khi STL ra đời, những thứ tiên tiến đó, nhưng hầu hết mọi người viết sách, tập hợp các chương trình giảng dạy và các lớp giảng dạy đã học C trước, sau đó là công cụ C ++ bổ sung, vì vậy thế hệ thứ hai đã học từ quan điểm đó. Như một câu trả lời khác đã lưu ý, nếu bạn thoải mái viết thường xuyên cho các vòng lặp, việc thay đổi sử dụng std::for_eachsẽ không mua cho bạn nhiều ngoại trừ cảm giác mờ nhạt ấm áp rằng bạn đang làm mọi thứ theo cách "hiện đại".

Bây giờ, chúng tôi có những người hướng dẫn và người viết sách đã sử dụng toàn bộ C ++ và nhận hướng dẫn của họ từ quan điểm đó, chẳng hạn như sách tăng tốc C ++ của Koenig & Moo và sách giáo khoa mới của Stroustrup. Vì vậy, chúng ta không học char*sau đó std::strings.

Đó là một bài học thú vị về việc phải mất bao lâu để thay thế các phương pháp "di sản", đặc biệt là khi chúng có hồ sơ theo dõi hiệu quả.


13
Đúng. Nó rất thông minh để làm cho C ++ tương thích ngược với C vì cơ sở mã hóa C được cài đặt rất lớn. Rất giống với chiến lược thành công của MS là luôn duy trì khả năng tương thích ngược với DOS. (Xem blog tuyệt vời của Raymond Chen về độ dài thường xuyên đau đớn mà họ đã truy cập ...)
j_random_hacker

2
Rất tiếc, đã có một chút tiếp tuyến ở đó ... Nói rằng tôi nghĩ bạn đúng về "sự phân chia thế hệ" giữa những người chuyển từ C (nhưng vẫn giữ suy nghĩ theo kiểu C) và những người có "hương vị đầu tiên "Đã hậu STL C ++.
j_random_hacker

57

Hoàn toàn đồng ý. Đối với tôi nếu bạn không lập trình C ++ theo kiểu "Modern C ++" như bạn thuật ngữ, thì không có điểm nào sử dụng C ++! Bạn cũng có thể chỉ sử dụng C. "Modern C ++" nên là cách duy nhất C ++ được lập trình theo ý kiến ​​của tôi và tôi hy vọng rằng tất cả những ai sử dụng C ++ và đã lập trình theo kiểu "Hiện đại" này sẽ đồng ý với tôi. Trên thực tế, tôi luôn bị sốc hoàn toàn khi nghe về một lập trình viên C ++, người không biết gì về những thứ như auto_ptr hoặc ptr_vector. Theo như tôi quan tâm, những ý tưởng đó là cơ bản và cơ bản cho C ++, và vì vậy tôi không thể tưởng tượng nó theo bất kỳ cách nào khác.


4
+1; Tôi đã sớm chọn phong cách "c ++ hiện đại" bởi vì đó là cách tự nhiên để làm điều đó (nếu bạn không nghĩ về C với các lớp học).
Adam Hawes

21
"Chỉ cần sử dụng C?" C là mạnh mẽ chết tiệt.
Clark Gaebel

4
Các robot chắc chắn sẽ không lập trình trong C ++, chúng không đủ ngu ngốc và sẽ đóng băng khi cố gắng biên dịch nó.
Matt Joiner

6
@ClarkGaebel Chà, nếu C mạnh, thì C ++ cũng được thừa kế từ C mà không gặp vấn đề gì :)
legends2k

4
@rxantos, bạn nói rằng giống như chúng ta không có nhiều tùy chọn phong phú để đánh giá hiệu suất, ví dụ như xem đầu ra lắp ráp, bộ hẹn giờ, màn hình RAM và nhiều thứ khác. C ++ không khác với C về vấn đề đó. Nếu nghi ngờ, hồ sơ. Bất cứ điều gì khác chỉ là tin đồn.
gạch dưới

25

Trong thời của Windows 3.1, C là tiêu chuẩn. Khi C ++ tấn công thị trường nhà phát triển và sau đó trở thành tiêu chuẩn ANSI, đó là độ hot mới. Nó phổ biến từ viết tắt OOP và một số mẫu thiết kế cơ bản sử dụng đa hình.

Giờ đây, với sự chấp nhận lớn hơn đối với các nền tảng được quản lý theo rào cản thấp, như C # /. NET, có ít lý do hơn để sử dụng C ++. Rất nhiều cơ sở của nhà phát triển sẽ có một sự lựa chọn và hãy trung thực: C ++ là một con gấu để học hỏi cho người mới. Với C #, bạn có thể chạy với nó.

Điều đó thực sự chỉ còn lại các nền tảng CẦN C ++ và các nhà truyền giáo C ++ khó tính tiếp tục thực hành nghệ thuật. Đây là cộng đồng cần và muốn tất cả các lớp trừu tượng được coi là "Modern C ++".

Vì vậy, có, tôi tin rằng "Modern C ++", như bạn nói, đang trở nên phổ biến hơn. Mặc dù, nó phổ biến với một đối tượng khác hơn là đã sử dụng nó trong quá khứ.


Nào các bạn, câu trả lời này làm cho một số điểm tốt. C ++ không hoàn hảo, tất cả chúng ta đều biết rằng, chính Bjarne phàn nàn rằng nó quá lớn và quá khó để học. Mặc dù tôi không đồng ý về lý do tại sao Modern C ++ xuất hiện dần dần - IMHO chỉ mất một thời gian dài để một ngôn ngữ lớn như vậy có thể "ầm ầm tiến lên".
j_random_hacker

4
Vì vậy, bạn đang nói rằng các nhà phát triển trung bình hơn đã hướng đến C # và như vậy, trong khi những người khó tính hơn mắc kẹt hơn với C ++? (Không phải là không có người C # /. NET thực sự thông minh, nhưng có rất nhiều người kém thông minh.) Tạo ra một ý nghĩa nhất định.
David Thornley

3
Tôi nghĩ đó là một điểm hợp lệ. Tất nhiên điều đó không đúng với tất cả mọi người, nhưng ở một mức độ lớn, tôi đồng ý, hầu hết những người có lựa chọn đã sử dụng C # hoặc Java hoặc các ngôn ngữ khác.
jalf

3
Các trường hợp sử dụng: Tôi muốn một máy khách windows thực hiện CRUD trên db của tôi. Sử dụng C # /. NET hoặc C ++ / MFC? Tôi muốn có một ứng dụng web ... Sử dụng C # / ASP.NET hoặc C ++ / ISAPI? Tôi muốn một bản sao "Nybble" đơn giản bằng DirectX C # /. NET hoặc C ++ / MFC / WTL? Tôi muốn một bản demo chiến thắng tại Hội đồng09 ... chắc chắn là C ++ (so với C #).
spoulson

8
Tôi không biết đó là vấn đề của nhiều lớp trừu tượng hơn hay khó chết hơn. Tôi nghi ngờ rằng chỉ có các loại trừu tượng có sẵn thông qua các mẫu không có sẵn trong Java hoặc C #, vì vậy những người thích hoặc cần chúng ở lại với C ++.
Kragen Javier Sitaker

16

Tôi là một trong số những người đã học cách làm việc với STL và nghe nhiều về RAII và thực hành lập trình C ++ tốt từ ngày 1. Có vẻ như một số cuốn sách được khuyên dùng nhất để học C ++ ngày nay (như Gia tốc C ++ và sê-ri C ++ hiệu quả ) tập trung vào việc sử dụng các công cụ STL thay vì triển khai công cụ của riêng bạn và cũng đưa ra nhiều "quy tắc" để lập trình hiệu quả (hoặc "hiện đại").

Nhưng nói chuyện với bạn bè tôi cũng lưu ý rằng một số công ty vẫn làm việc với "C with Classes" chứ không phải "Modern C ++". Có thể văn hóa được đề xuất bởi các tác giả và người dùng của "Modern C ++" sẽ thắng thế một ngày nào đó :)


Nơi tôi làm việc, chúng tôi vẫn sử dụng C với các lớp học, có lẽ bởi vì có rất nhiều đồng hồ cũ đã ở đó một thời gian. Họ có vẻ rất cảnh giác với ngay cả STL, chứ đừng nói đến BOOST.
aneccodeal

12

Tôi nghĩ rằng bạn vừa có một trải nghiệm tồi tệ bắt đầu.

Bạn cần có cho mình những cuốn sách C ++ hiệu quả của Scott Meyers . Tôi bắt đầu sử dụng C ++ trong cơn giận dữ vào năm 1999, trưởng nhóm của tôi đã cho tôi ngồi và đọc C ++ hiệu quả và C ++ hiệu quả hơn trước khi tôi được phép kiểm tra BẤT K code mã nào.

Hầu hết lời khuyên của anh ấy là về dòng chữ "Đừng sử dụng tính năng này , nhưng nếu bạn phải, hãy ghi nhớ điều này "

Nếu bạn làm theo lời khuyên của anh ấy, bạn sẽ viết C ++ tốt hoặc "Hiện đại".

Anh ấy cũng có một cuốn sách về STL, nhưng tôi chưa đọc.


Tôi nên đề cập rằng đây chỉ là điểm khởi đầu của tôi. Hôm nay, tôi rất thoải mái với STL, boost, RAII và mọi thứ khác. Tôi chỉ đơn giản là tự hỏi làm thế nào phổ biến kinh nghiệm ban đầu của tôi là.
jalf

9

Trong các công việc C ++ của mình, tôi đã tìm thấy các tính năng hiện đại ngày càng được sử dụng và nhiều người hỏi tôi về chúng trong các cuộc phỏng vấn và phỏng vấn qua điện thoại. Theo như tôi có thể nói, họ đang bắt kịp.

Tôi đã học C ++ ban đầu giống như C với Classes; mặc dù ngôn ngữ đã tiến xa hơn thế, những cuốn sách tôi đọc và những người tôi làm việc cùng đã bị mắc kẹt trong "C ++ cũ". RAII một cái gì đó mọi người sẽ nghĩ về, thay vì tự động làm, và tôi nhớ đọc một số bài viết đầu tiên về các vấn đề an toàn ngoại lệ.

Như đã chỉ ra, bây giờ có sách mới. Nhiều trong số những cái cũ vẫn còn có liên quan, nhưng dường như chúng ngày càng đầy lý giải tại sao rõ ràng ý tưởng xấu là xấu. (Tương tự như vậy, thật khó để độc giả hiện đại hiểu được những ý tưởng của Freud mang tính cách mạng về tâm trí vô thức như thế nào, vì giờ đây nó là trí tuệ thông thường.)

Stroustrup vừa ra mắt với một cuốn sách giáo khoa, Lập trình: Nguyên tắc và Thực hành Sử dụng C ++ . Tôi đã mua nó bởi vì tôi chưa học được những thứ hay từ một cuốn sách của Stroustrup, nhưng đã không vượt qua được vài chương đầu tiên. Cho đến nay, tất cả những gì tôi có thể nói là tôi tán thành cách anh ấy bắt đầu, và ít nhất đó là một giới thiệu tốt về cách sử dụng C ++.


Ngay cả các phiên bản đầu tiên của STL cũng không an toàn.
Kragen Javier Sitaker

2
Vào thời điểm đó, không ai thực sự biết cách viết mã an toàn ngoại lệ. Điều đó đã được thực hiện trong những năm sau khi công bố tiêu chuẩn. Tôi nhớ một số bài viết trong Báo cáo C ++.
David Thornley

7

Trong khi thực hiện dự án mà tôi hiện đang tham gia, có rất nhiều mã C ++ đã phát triển trong một khoảng thời gian đáng kể (hơn 10 năm nay). Sự tiến hóa mà bạn nói đến có thể thấy rõ ở đó: mã cũ hơn thường là "C với các lớp" - các con trỏ thô, (bao gồm các thông số tùy chỉnh để quản lý các điều khiển, v.v.), các hàm lớp và các mẫu lớp được khái quát hóa, v.v. Hầu hết các kỹ thuật mã hóa "C với các lớp" truyền thống, chẳng hạn như các con trỏ chưa đóng gói thô với quản lý trọn đời thủ công, rất được tán thành trong các đánh giá mã ngày nay. Đánh giá bằng cách này, có vẻ như quan sát của bạn là chính xác.char* chuỗi và sử dụng các hàm C liên quan, mảng, v.v. mã mới hơn sử dụng con trỏ thông minh ATL và như vậy để quản lý tài nguyên, nhưng vẫn dính vào các vòng lặp được mã hóa bằng tay hầu hết thời gian và iterator là một cảnh hiếm thấy; và cái mới nhất chứa đầy các thùng chứa STL, thuật toán,shared_ptr

Sự phát triển gần đây nhất dường như là một mốt nhất thời cho C ++ 0x lambdas - có một mặt tích cực ở chỗ nó cũng nghiêng sự cân bằng trong việc sử dụng các thuật toán tiêu chuẩn trên các vòng lặp được mã hóa bằng tay, vì bây giờ bạn có thể có tất cả mã của mình với thuật toán là tốt.


6

Tôi sẽ không nói rằng std :: vector đủ điều kiện là "hiện đại" ngày nay. Nó thực sự là cơ bản.

Nói chung, ấn tượng của tôi là mọi người đã đạt được một số kinh nghiệm với phong cách C ++ hiện đại và tỉnh táo lên một chút. Chỉ cần lấy một ví dụ đơn giản, STL for_each rất thú vị nhưng trong thực tế, nó không thêm nhiều giá trị khủng khiếp vào một vòng lặp C đơn giản. Khó gỡ lỗi hơn và đôi khi không cung cấp hiệu suất tốt nhất. Ngoài ra, các cấu trúc để lập trình chức năng trong STL hiện tại nhìn chung rất cồng kềnh, đặc biệt nếu bạn có kinh nghiệm từ một ngôn ngữ chức năng thực sự như ML.


1
Tại sao bạn nói vector không đủ điều kiện là hiện đại? nó vẫn là trạng thái của nghệ thuật cho nhiều trường hợp sử dụng, mặc dù nó là cơ bản. nhưng tôi nghĩ một cái gì đó cơ bản không có nghĩa là nó không hiện đại. thay vì ngược lại, nếu bất cứ điều gì. nhưng tôi nghĩ rằng tôi đồng ý với đoạn thứ hai của bạn :)
Johannes Schaub - litb

4
nhưng tôi nghĩ điều này là do một số ppl cố gắng sử dụng for_each và bạn bè về cơ bản cho tất cả mọi thứ, ngay cả đối với những thứ như vòng lặp đơn giản sẽ ngắn gọn hơn - làm đầy một vòng lặp 2 dòng lên đến 10 dòng. Tôi hy vọng sẽ có nhiều người sử dụng for_each và bạn bè hơn khi lambda sẽ có sẵn trong C ++ 1x mặc dù
Johannes Schaub - litb

7
vector là cơ bản là chính xác điểm. Nó không phải lúc nào cũng cơ bản. Một lần, nó thường được xem là một thứ siêu phức tạp (nó sử dụng TEMPLATE) và không hiệu quả (nó không phải là một mảng thô). Một cái gì đó mà các chuyên gia có thể giảng về, nhưng nhiều người không tin tưởng.
jalf

2
Có lẽ bởi vì std :: for_each hiếm khi là thứ bạn cần so với nói ... std :: Transform? Sử dụng thuật toán giúp bạn thoát khỏi một lỗi rất phổ biến: tình trạng vòng lặp không chính xác.
Edouard A.

vectơ <bool> chắc chắn không cơ bản ...
Kugel

6

Theo kinh nghiệm của tôi (Đại học Tây Ban Nha), thật không may, tiêu chuẩn là không xem xét ngôn ngữ trong chính nó. Họ sử dụng các ngôn ngữ dễ nhất để dạy lập trình (ví dụ Java), vì nó được cho là dễ dàng cho giáo viên và học sinh, và sau đó họ sử dụng C cho các lớp OS và như vậy.

C ++ được giới thiệu rất nhẹ (ở mọi mức độ tại bất kỳ khóa học nào), chỉ để cung cấp C với các lớp. Họ không được tăng hoặc thậm chí STL. Tôi nghĩ rằng theo kịp tất cả các đặc điểm và cách suy nghĩ của C ++ là tốn kém cho cả giáo viên và học sinh. Có bao nhiêu lập trình viên C ++ ở đây biết đủ tất cả các thư viện Boost để sử dụng chúng để đưa ra giải pháp tốt hơn hoặc thiết kế nó? Người ta phải có hứng thú với việc theo kịp tất cả các thư viện và thành ngữ mới.

Tuy nhiên, như tôi đã nói, dường như việc lập trình nói chung (và ngôn ngữ lập trình nói riêng) không quá nghiêm trọng, vì dường như đó là một sự phân công tạm thời khi họ bắt đầu một công việc, sau đó quên cách lập trình khi họ đi lên cây doanh nghiệp. Nhiều doanh nghiệp ở đây, và chính Đại học, có cảm giác rằng lập trình có thể được thực hiện bởi bất kỳ ai.

Nếu bạn theo triết lý này, thì đối với hầu hết mọi người tôi biết, C ++ sẽ luôn là "C với các lớp".

Trân trọng,


Hầu hết những thứ đó rất phổ biến trong Khoa học Máy tính, và về tổng thể, tôi không nghĩ đó là một điều xấu. (Không tập trung vào ngôn ngữ, nghĩa là. Các ngôn ngữ được dạy rõ ràng vẫn nên được dạy đúng cách).
jalf

+1: "(Không tập trung vào ngôn ngữ, nghĩa là. Các ngôn ngữ mà aRE đã dạy rõ ràng vẫn nên được dạy đúng cách")
Jared Updike

6

Theo kinh nghiệm của tôi, nó phụ thuộc rất nhiều vào độ tuổi của sản phẩm / dự án phần mềm. Hầu hết các dự án mới mà tôi biết đều sử dụng C ++ hiện đại (RAII, STL, Boost). Tuy nhiên, có nhiều dự án C ++ đã hơn 10 năm tuổi và bạn không thấy C ++ hiện đại ở đó.

Ngoài ra, hãy nhớ rằng một số triển khai STL phổ biến nhất đã bị phá vỡ khá nhiều cho đến khoảng 5 năm trước (MSVC <7.0 và GNU <3.00)


4

Tôi nghĩ rào cản lớn nhất tôi gặp phải là hỗ trợ toolchain, đặc biệt là các dự án đa nền tảng. Cho đến một vài năm trước, người ta thường thấy các ghi chú xây dựng nói rằng "nền tảng x cần STLport để hoạt động vì trình biên dịch của họ đã bị hỏng". Ngay cả bây giờ, tôi thấy các vấn đề với những người đang cố gắng sử dụng nhiều phụ thuộc của bên thứ ba gắn liền với các phiên bản BOOST khác nhau. Điều này làm cho việc liên kết là không thể, có nghĩa là bạn phải quay lại và xây dựng lại deps của bạn từ đầu.

Bây giờ mọi người đã ngừng sử dụng MSVC ++ 6, mớ hỗn độn STLport đang ở phía sau chúng ta. Nhưng ngay khi TR1 ra khỏi cửa, chúng tôi sẽ quay lại "phiên bản nào của môi trường hỗ trợ và làm cho đúng" và một lần nữa điều này sẽ làm chậm việc áp dụng.

Tôi làm việc trong một dự án bắt đầu từ C (không phải C ++) vào năm 1992. Triển khai các thực tiễn hiện đại trên cơ sở mã di sản là không thể. Tương tự như vậy, tôi làm việc trên một dự án khác gần với ngôn ngữ C ++ hơn.


3

Nhiều đội tôi đã tham gia và nghe nói về việc xem xét vấn đề lớn "chúng ta có đang sử dụng ngoại lệ không?" câu hỏi Đây là mã cho "chúng ta có đang sử dụng C ++ hiện đại không?"

Khi bạn không sử dụng ngoại lệ, bạn không được sử dụng toàn bộ sức mạnh của ngôn ngữ và thư viện của ngôn ngữ đó.

Nhưng nhiều cơ sở mã cũ không có ngoại lệ và được cho là rất khó để ngoại lệ cho một cơ sở mã không mong đợi chúng hoặc vào một nhóm không biết cách sử dụng chúng, vì vậy câu trả lời trong những trường hợp như vậy là thường là 'không.'

Theo kinh nghiệm của tôi, C ++ hiện đại cần một người đam mê nó trong nhóm, người không thể chịu được bất cứ điều gì ít hơn, để thúc đẩy nó. Nó cũng cần phải vượt qua sự phản đối của những người muốn nó giống như mã kế thừa.

Mặc dù tôi không nghĩ rằng các cơ sở mã C ++ cũ sẽ biến mất rất nhanh, tôi tin rằng có nhiều người đam mê trên thế giới hơn so với năm năm trước. Họ phải đối mặt với trận chiến khó khăn tương tự mà họ phải đối mặt năm năm trước, nhưng họ có nhiều khả năng tìm thấy những linh hồn tốt bụng.


3

Trước khi trả lời một câu hỏi như vậy, bạn phải đồng ý về "Hiện đại" là gì. Điều này không có khả năng xảy ra, vì "Hiện đại" là một từ được định nghĩa kém và có nghĩa là những thứ khác nhau cho những người khác nhau. Tiêu đề của cuốn sách của Alexandrescu (Thiết kế C ++ hiện đại) cũng không thực sự hữu ích, vì phần lớn nó là một cuốn sách về Siêu dữ liệu mẫu, là một lĩnh vực cụ thể của C ++ nhưng không có nghĩa là duy nhất.

Đối với tôi, "Modern C ++"! = "Lập trình siêu mẫu". Tôi có thể nói các tính năng của C ++ trên đầu C sẽ thuộc các loại sau:

  • Các lớp học (Người xây dựng, Người phá hủy, RAII, Đúc động và RTTI)
  • Ngoại lệ
  • Người giới thiệu
  • Cấu trúc dữ liệu và thuật toán trong thư viện chuẩn (STL)
  • iostreams
  • Các lớp đơn giản và các mẫu hàm
  • Lập trình siêu mẫu

Không ai trong số này đặc biệt hiện đại, vì tất cả chúng đã có khoảng gần 10 năm trở lên. Hầu hết các tính năng này đều hữu ích và sẽ cho phép bạn có năng suất cao hơn C thẳng cho nhiều trường hợp sử dụng. Một lập trình viên giỏi nên và sẽ sử dụng tất cả chúng trong một dự án có quy mô khá, nhưng một trong những điều này không giống như những điều khác:

Siêu lập trình mẫu.

Câu trả lời ngắn cho siêu lập trình mẫu chỉ là nói không. Thật không may cho một số người, nó đồng nghĩa với "Lập trình C ++ hiện đại", do cuốn sách, nhưng cuối cùng nó tạo ra nhiều vấn đề hơn nó giải quyết. Trừ khi C ++ phát triển các cơ chế lập trình chung tốt hơn như phản chiếu, nó sẽ không phù hợp với lập trình chung và các ngôn ngữ cấp cao hơn như Python sẽ phù hợp hơn cho các trường hợp sử dụng đó. Vì lý do đó và nhiều lý do khác, hãy xem C ++ FQA


6
Lập trình siêu dữ liệu mẫu IMHO gần như không bao giờ cần thiết cho lập trình ứng dụng , nơi nó chỉ phục vụ để cung cấp các mức độ có thể không cần thiết với chi phí dễ đọc và các lỗi khó hiểu. Nhưng OTOH nó cực kỳ hữu ích cho các chuyên gia khi xây dựng thư viện (a la Boost), trong đó tính tổng quát được thêm vào rất hữu ích và các cơ chế (xấu xí, khó hiểu, khó hiểu) có thể bị ẩn khỏi tầm nhìn.
j_random_hacker

3
Bạn có thể sử dụng siêu lập trình mẫu đó một cách trang nhã, nếu được thực hiện trong chừng mực, đặc biệt là trong các thư viện. Nhưng tất cả quá thường xuyên tôi đã thấy mọi người đi quá xa trên con đường siêu lập trình mẫu và kết quả là các chương trình của họ bị ảnh hưởng. Tôi không chống lại siêu lập trình, thực tế tôi là một người ủng hộ mạnh mẽ cho nó, chỉ là các cơ sở của C ++ cho nó khá thô sơ.
Anton I. Sipos

2

Cuốn sách tốt nhất để học C ++. "Gia tốc C ++" của Koenig & Moo, dạy những gì bạn mô tả là C ++ hiện đại, vì vậy tôi đoán hầu hết mọi người ngày nay đang sử dụng nó. Đối với những người trong chúng ta đã sử dụng C ++ trong một thời gian dài (kể từ giữa những năm 80 trong trường hợp của tôi), C ++ hiện đại là một cứu cánh tuyệt vời từ các nhiệm vụ tẻ nhạt của việc viết các mảng, chuỗi, bảng băm của riêng chúng tôi (lặp lại quảng cáo).


1
Không có nghĩa là hoại tử, nhưng tôi chỉ mua cuốn sách dựa trên khuyến nghị này. Chúng ta sẽ phải xem!
Andrew Weir

2

Tôi đã xem C ++ Jobs trên thực tế và các thư viện "hiện đại" ngày càng được sử dụng nhiều hơn trong các mô tả công việc, MFC là một thư viện c ++ "kiểu cũ" ít được sử dụng.


1

Việc chuẩn hóa ngôn ngữ vào cuối những năm 1990 là bước đầu tiên, nó cho phép các nhà sản xuất trình biên dịch tập trung vào bộ tính năng "tiêu chuẩn", cũng cho phép ngôn ngữ sửa một số cạnh thô, xuất hiện quá trình chuẩn hóa.

Điều này đến lượt nó cho phép phát triển các khung dựa trên các tính năng tiêu chuẩn của ngôn ngữ và không dựa trên các tính năng được cung cấp bởi một trình biên dịch cụ thể. Thư viện Boost đáng chú ý về vấn đề này. Ngoài ra, điều này cho phép phát triển mới dựa trên công việc trước đó, do đó đưa ra các giải pháp khả thi cho các vấn đề phức tạp hơn.

Một thay đổi đáng chú ý ở đây là cách các khung công tác trước đây dựa trên khái niệm các lớp cơ sở và các lớp dẫn xuất (một tính năng thời gian chạy). Nhưng hiện nay, hầu hết các tính năng nâng cao thường dựa rất nhiều vào các mẫu "đệ quy" (tính năng biên dịch thời gian).

STL có những ưu và nhược điểm nhưng nó vẫn vượt qua thử thách của thời gian, nếu bạn muốn thứ gì đó hoạt động và đơn giản thì STL chắc chắn có thứ gì đó giúp bạn bắt đầu. Không có điểm nào trong việc phát minh lại bánh xe (trừ khi vì lý do mô phạm).

Phần cứng máy tính cũng đã có những bước nhảy vọt từ những năm 1990, sau đó bộ nhớ và CPU không còn là một hạn chế đối với trình biên dịch. Vì vậy, hầu hết các tối ưu hóa lý thuyết từ sách là có thể.

Các bước tiếp theo của ngôn ngữ là sự hỗ trợ của lập trình đa lõi, là một phần của nỗ lực tiêu chuẩn 0x.


1

Có và không. Chắc chắn đối với các dự án mới, nó ngày càng phổ biến. Tuy nhiên, vẫn còn những rào cản đối với việc áp dụng là thiết thực, không mang tính chính trị, mà những người khác chưa đề cập. Có rất nhiều thư viện C ++ thương mại sử dụng ABI từ các trình biên dịch cổ xưa không hỗ trợ đúng các tính năng được thấy trong Modern C ++ và rất nhiều công ty dựa vào các thư viện này. Sun Studio trên Solaris chẳng hạn không thể hoạt động với Boost mà không sử dụng STLport, nhưng bất kỳ thư viện thương mại bên thứ 3 nào bạn muốn sử dụng đều yêu cầu phiên bản STL của Sun. Câu chuyện tương tự với GCC 2.95 và Redhat Enterprise Linux.


-3

Thật đáng tiếc khi có ít nỗ lực để làm cho c ++ ổn định hơn. Hệ thống cảnh báo được đưa ra, nhưng nó không phát triển nhiều. Thậm chí còn dễ dàng tự bắn vào chân mình hơn so với 10 năm trước. Không biết tại sao, nhưng c ++ vẫn là ngôn ngữ yêu thích của tôi. :)


Tôi sẽ đề nghị đọc một vài cuốn sách trong chủ đề này trước khi đưa ra tuyên bố về "nỗ lực nhỏ" đang được đưa vào ổn định C ++ và "thậm chí còn dễ dàng tự bắn vào chân mình hơn so với 10 năm trước."
Patrick Niedzielski

Chắc chắn, thư viện std cung cấp một số ổn định về phân bổ bộ nhớ và thao tác chuỗi. Thật không may, bên trong nó sử dụng các quy ước mã hóa kỳ lạ như vậy, mà bạn sẽ nghĩ rằng nó được viết bởi người ngoài hành tinh hoặc một cái gì đó. :)
AareP

2
Vì thư viện chuẩn là một đặc tả, đổ lỗi cho nhà cung cấp trình biên dịch của bạn đã sử dụng các quy ước mã hóa nội bộ lạ. Và bên cạnh đó, các quy ước mã hóa lạ = / = không ổn định hoặc dễ dàng hơn để tự bắn vào chân mình. Hầu hết các quy ước mã hóa (ít nhất là về thư viện MSVC và có lẽ về những người khác nữa) được thiết kế để không can thiệp vào bạn, vì vậy bạn có thể làm những điều ngu ngốc và thư viện không cần phải quan tâm. Nếu bạn viết mã bên ngoài thông số C ++, đó là một điều khác biệt.
Patrick Niedzielski

Lưu ý rằng việc triển khai STL điển hình (đặc biệt nếu được gói cùng với trình biên dịch cụ thể) không phải sử dụng Standard C ++ để tự thực hiện. Nó rất có thể sử dụng kiến ​​thức cụ thể triển khai bên trong chính nó, để cung cấp mã của bạn các đảm bảo được Tiêu chuẩn hứa hẹn. Mã riêng của bạn, tuy nhiên, chỉ nên tuân theo những gì Tiêu chuẩn đảm bảo. Bạn không thể tìm hiểu các đảm bảo Tiêu chuẩn bằng cách kiểm tra việc triển khai C ++ hoặc STL cụ thể.
Tanzania87

Câu trả lời này đã được viết cách đây một thập kỷ. Vào thời điểm đó, thật đáng kinh ngạc là đã có bao nhiêu nỗ lực để làm cho c ++ ổn định hơn . Đó là một trong những lý do chính khiến c ++ 0x mất quá nhiều thời gian để được phát hành dưới dạng c ++ 11.
David Hammen
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.