Tôi nên biết gì về C ++? [đóng cửa]


8

Gần đây tôi đã bắt đầu học C ++ và tôi rất thích nó.

Tôi thường đọc viết mã xấu trong C ++ dễ hơn so với hầu hết các ngôn ngữ và nó sâu hơn rất nhiều so với những gì nó có vẻ.

Vì muốn tránh viết mã xấu, tôi đã tự hỏi chính xác mình không nên làm gì và nên làm gì để viết mã tốt trong C ++.


1
Những cuốn sách C ++ nào bạn đã đọc, hoặc đang đọc?
Fred Nurk

Chưa có. Tôi cũng đang tìm những cuốn sách hay, nhưng tôi đã tìm thấy quá nhiều trong số đó và bây giờ tôi không biết bắt đầu từ đâu ( stackoverflow.com/questions/388242/ trên )
DistantEcho

Đừng nhầm lẫn với sách, tôi sẽ giới thiệu hoặc của Robert Lafore ( amazon.com/Object-Orients-Programming-4th-Robert-Lafore/dp/iêu ) hoặc C ++ Premier ( amazon.com/dp/0201721481/?tag= stackoverfl08-20 ) vì bạn sẽ tiến bộ bằng cách viết thêm mã, chính bạn sẽ đến để biết những gì bạn nên tránh. Vì bạn không biết nhiều về C ++, tôi không nghĩ bạn sẽ có thể hiểu (Thực tế) những gì đang được khuyên nên tránh trong các câu trả lời ở đây.
Kiểm lâm

3
Khi công cụ duy nhất trong hộp công cụ của bạn là C ++, mọi thứ trông giống như ngón tay cái ....
CurtisHx

Câu trả lời:


21

Những cạm bẫy

Có rất nhiều cạm bẫy trong C ++, nếu bạn không biết chúng, bạn sẽ tạo mã rất không ổn định, với hàng tấn rò rỉ bộ nhớ và tràn bộ đệm. So với các ngôn ngữ hiện đại hơn với bộ sưu tập rác, bạn phải tự giải phóng tất cả bộ nhớ. Ngoài ra, mã là rất thấp. Không có gì ngăn cản bạn ghi đè mã chương trình của riêng bạn (đã bị khai thác bởi nhiều bản hack IE).

Vì vậy, điều tiếp theo bạn phải học là các thực tiễn lập trình giúp giảm thiểu những rủi ro này, ví dụ như sử dụng các con trỏ thông minh để xử lý các đối tượng giải phóng, gói các mảng byte trong các lớp xử lý dữ liệu, v.v.

Tôi có thể giới thiệu sách của Scott Meyers "C ++ hiệu quả" và "C ++ hiệu quả hơn".

Những cuốn sách đó về cơ bản đã dạy tôi vẻ đẹp của C ++. Lưu ý rằng đây không phải là sách dành cho người mới bắt đầu. Họ cho rằng bạn đã quen thuộc với ngôn ngữ này.


4
"Đã tăng tốc C ++" của Koenig và Moo là một cuốn sách hay cho các lập trình viên C ++ mới, vì nó đã giới thiệu các mẫu và các lớp bằng cách hiển thị các ví dụ sử dụng trước, sau đó thiết kế và tạo. Tôi thấy dễ hiểu hơn tại sao sử dụng chúng với cách tiếp cận đó.
Larry Coleman

Tôi đã bắt đầu đọc C ++ hiệu quả và nó thực sự giúp ích rất nhiều. Cảm ơn bạn !
DistantEcho

2
" Không có gì ngăn cản bạn ghi đè mã chương trình của riêng bạn " Huh? Gì? Đây không phải là lỗi của ngôn ngữ - thực sự, trong hầu hết các hệ điều hành, điều này thực sự không thể thực hiện được trừ khi bạn chủ động thực hiện các bước để biến nó thành có thể. Và các chương trình được viết kém có khả năng khai thác bất kể ngôn ngữ họ viết là gì. Vâng, C ++ ở cấp độ thấp và, vâng, nó có những sai sót, nhưng chúng ta đừng quá khích với những điều vô nghĩa như thế.
Nik Bougalis

@NikBougalis HĐH ngăn chặn nó - trong trường hợp HĐH ngăn chặn nó - nhưng C / C ++, theo thiết kế, cung cấp cho bạn một phương pháp để thực hiện nó, trong trường hợp HĐH không ngăn chặn nó; trong khi nhiều ngôn ngữ khác thì không. Vì vậy, nó không thực sự vô nghĩa khi mô tả vấn đề này là một vấn đề ngôn ngữ - nhưng tôi đồng ý rằng quan điểm ban đầu là quá cường điệu.
greggo

5
@greggo thật là vô nghĩa - người ta cũng có thể phàn nàn rằng một cốc cà phê không bảo vệ bạn khỏi việc vô tình đổ muối vào cà phê của bạn. Thực tế là thế này: C và C ++ không biết gì về chương trình của bạn hoặc hệ thống mà nó đang chạy. Ngôn ngữ không thể giải quyết mối quan tâm "zomg! Chương trình của tôi đã bị ghi đè" mà không cần chúng tôi thay đổi về cơ bản các giả định cơ bản mà ngôn ngữ được xây dựng.
Nik Bougalis

20

Thành ngữ

C ++ hỗ trợ rất nhiều tính năng. Tương tự như vậy, người ta có thể dễ dàng sử dụng nó theo nhiều cách hoặc phong cách khác nhau. Thật không may, nó không phù hợp với nhiều người trong số họ - và do đó trở nên tẻ nhạt, dễ bị lỗi hoặc chậm nếu theo cách đó.

Hoặc diễn đạt khác nhau, mà không thực sự biết những gì bạn làm, thật dễ dàng sử dụng C ++ theo cách sai (điều này sẽ hỗ trợ tốt hơn nhiều trong các ngôn ngữ khác). Do đó, việc học đơn giản bằng cách làm có thể dẫn đến một hướng sai - vì vậy đọc những cuốn sách hay có lẽ quan trọng hơn so với các ngôn ngữ khác (xem bài đăng này về cùng một chủ đề).

Ví dụ, Java là một ngôn ngữ hướng đối tượng. Bạn không thể lập trình nó khác nhau nhiều. Trong C ++, tuy nhiên, bạn có thể . Bạn có thể sử dụng nó giống như bạn làm trong C hoặc Java - và không có cách nào là C ++ vượt trội, vì vậy bạn nên ở lại với C hoặc Java trong những trường hợp này.

Do đó, bạn thực sự cần phải biết phong cách và thành ngữ phù hợp để có được C ++ ngay từ đầu. Thật không may, lúc đầu chúng có thể khá phức tạp, nhưng đây là một số - từ đơn giản đến nâng cao.

  • Sử dụng const
  • Đừng lo lắng về vi-tối ưu hóa (nên tôi inlinemột chức năng, << hoặc *vv?)
  • Không sử dụng con trỏ thô hoặc mảng bất cứ khi nào có thể (đặc biệt void*). Sử dụng tài liệu tham khảo hoặc con trỏ thông minh
  • Viết mã chung = Hiểu mẫu
  • Hiểu các tiêu đề / tệp mã / bộ xử lý trước (nhưng tránh các macro)
  • Sử dụng STL (và hiểu các khái niệm cơ bản)!
  • Sử dụng tăng
  • Nhận tâm trí của bạn xung quanh vòng đời và phạm vi của đối tượng - Quản lý RAII
  • Không viết mã hướng đối tượng (nghĩa là rất nhiều đa hình thời gian chạy, kế thừa) ở vị trí đầu tiên - có nhiều ngôn ngữ OO tốt hơn ngoài kia
  • Sử dụng các đối tượng thay thế
  • Thích đa hình tĩnh
  • Sử dụng các hàm thời gian biên dịch

Cảm ơn lời khuyên. Tôi không thực sự hiểu lý do tại sao tôi nên tránh viết mã hướng đối tượng; hoặc bạn có nghĩa là một số phần của OOP cụ thể?
DistantEcho

1
OOP không chỉ có nghĩa là lập trình với các đối tượng, nó bao hàm các mẫu thiết kế nhất định, đa hình thời gian chạy thông qua kế thừa, phân cấp lớp ... C ++ không thực sự tuyệt vời trong việc thể hiện những điều này - bạn cần con trỏ (thông minh) và thường quản lý bộ nhớ rõ ràng cho đa hình thời gian chạy, nó tương đối chậm và đầy cạm bẫy (bao giờ quên một kẻ hủy diệt ảo?). Bạn thường có những cách rõ ràng hơn để diễn đạt tương tự với các đối tượng thuần túy và ví dụ như lập trình chung / đa hình tĩnh.
Dario

2
@Niphra: không phải là không sử dụng OOP, mà là không kiềm chế bản thân với OOP. C ++ cung cấp nhiều mô hình và các chương trình C ++ tốt sử dụng hầu hết, nếu không phải tất cả, trong số đó.
Matthieu M.

3
Không ai trong số này là thành ngữ. Lời khuyên OOP là đáng nghi ngờ nhất và dường như dựa vào nỗi sợ hơn là bất kỳ lý do kỹ thuật.
Edward Strange

"bao giờ quên một kẻ hủy diệt ảo". Có - quan trọng để bật cảnh báo trình biên dịch. Một số khác: 'hàm trả về một giá trị có thể không thực sự trả về một giá trị' - trong trường hợp giá trị được trả về yêu cầu một hàm tạo. kaboom. IMHO cảnh báo nên được bật theo mặc định.
greggo

13

Sức mạnh của C ++ là nó là một ngôn ngữ tuyệt vời. Hạn chế của C ++ là nó là một ngôn ngữ tuyệt vời. Nó có thể là cả kinh ngạc và khủng khiếp cùng một lúc.

Nếu bạn muốn học nó - và không có lý do gì bạn không nên - bạn sẽ cần học tốt nó. Bạn sẽ cần phải đọc rất nhiều . Có một vài cuốn sách sẽ giúp bạn trên con đường của mình: C ++ tăng tốc sẽ giúp bạn bắt đầu, đặc biệt nếu bạn làm bài tập. C ++ hiệu quả, STL hiệu quả, C ++ đặc biệt và chuỗi tiếp tục của họ là một trong những game hay nhất trong các gợi ý về kích cỡ khớp cắn về cách cải thiện cách làm việc của bạn.


4

Tôi nghĩ rằng một điều sẽ giúp dọc theo con đường mã tốt của bạn là kinh nghiệm . Hiện tại, hãy tập trung vào ngôn ngữ và đừng quá lo lắng về "thực hành mã hóa tốt nhất" cho đến khi bạn cảm thấy đủ thoải mái với nó để bắt đầu tìm cách cải thiện việc sử dụng của mình. Bạn sẽ học cách nhận ra điều gì tốt và điều gì xấu. Một khi bạn có ngôn ngữ xuống, sau đó bạn có thể nhìn lại và nghĩ "ok, tôi nên thực hiện điều này khác đi" hoặc "điều này có vẻ lộn xộn, làm thế nào tôi có thể cải thiện nó?"

Tôi nghĩ về nó như thế này : Nếu bạn học một ngôn ngữ nói mới, bạn không đi thẳng vào và học mọi quy tắc ngữ pháp duy nhất trước khi bạn bắt đầu học những từ đơn giản hoặc cách nói "trạm xe buýt ở đâu?". Lập trình (IMO) giống như ngôn ngữ thứ hai (hoặc thứ ba, thứ tư, v.v.). Đối xử với nó như bạn sẽ làm bất kỳ ngôn ngữ khác và học bằng cách làm. Phần còn lại sẽ đến với thời gian.


1

Tôi thường đọc viết mã xấu trong C ++ dễ hơn so với hầu hết các ngôn ngữ và nó sâu hơn rất nhiều so với những gì nó có vẻ

Làm rõ: trong C ++, việc viết mã xấu không chủ ý dễ dàng hơn so với các ngôn ngữ khác. Bạn có thể viết mã xấu bằng bất kỳ ngôn ngữ nào nhưng trong C ++, bạn đặt ra ý định tốt nhất nhưng thường kết thúc ở đâu đó bất ngờ vì C ++ - sau khi bạn chuyển từ "người mới" sang nói "người mới bắt đầu nâng cao", bạn sẽ có ấn tượng sai rằng C ++ dễ dàng hơn hơn thực tế là như vậy Nhưng C ++ đang phát triển và tất cả các thư viện mẫu mới giúp cuộc sống của bạn dễ dàng hơn (và an toàn hơn).


2
Điều này cũng phụ thuộc vào cách bạn học C ++. Nếu bạn bắt đầu học nó như một C nâng cao, bạn có nhiều khả năng gặp rắc rối ở giai đoạn đó hơn là bạn chỉ học nó như C ++.
David Thornley

Thời gian cho các Stroustrup quote bắt buộc: "C làm cho nó dễ dàng để bắn mình trong bàn chân; C ++ làm cho nó khó khăn hơn, nhưng khi bạn làm điều đó thổi toàn bộ chân của bạn off"
Mawg nói Khôi phục Monica

-1

Hai điều:

  1. Quản lý bộ nhớ hoạt động như thế nào khi sử dụng C ++?
  2. Con trỏ ảnh hưởng đến Quản lý bộ nhớ trong C ++ như thế nào?

1
C ++ của nó không chỉ là bộ nhớ ...
Nazgob
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.