Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Một phương thức là một thủ tục hoặc chức năng trong OOPs Concepts. Trong khi đó, một chức năng là một nhóm mã có thể tái sử dụng có thể được sử dụng ở bất kỳ đâu trong chương trình. Điều này giúp giảm nhu cầu viết đi viết lại cùng một mã. Nó giúp các lập trình viên viết mã mô-đun

Giả sử bạn muốn lắp ráp PC của riêng mình, bạn đến cửa hàng phần cứng và chọn bo mạch chủ, bộ xử lý, một số RAM, đĩa cứng, vỏ bọc, nguồn điện và lắp chúng lại với nhau. Bạn bật nguồn, và PC chạy. Bạn không cần lo lắng bo mạch chủ là bo mạch 4 lớp hay 6 lớp, ổ cứng có 4 hay 6 tấm; . Bạn chỉ cần đặt các thành phần phần cứng lại với nhau và mong muốn máy chạy. Tất nhiên, bạn phải đảm bảo rằng bạn có đúng giao diện, tôi. e. , bạn chọn đĩa cứng IDE thay vì đĩa cứng SCSI, nếu bo mạch chủ của bạn chỉ hỗ trợ IDE; . Tuy nhiên, không khó để thiết lập máy từ các thành phần phần cứng

Tương tự, một chiếc ô tô được lắp ráp từ các bộ phận và linh kiện, chẳng hạn như khung gầm, cửa, động cơ, bánh xe, phanh và hộp số. Các thành phần có thể tái sử dụng, e. g. , một bánh xe có thể sử dụng cho nhiều xe ô tô (cùng thông số kỹ thuật)

Phần cứng, chẳng hạn như máy tính và ô tô, được lắp ráp từ các bộ phận, là các bộ phận có thể tái sử dụng

Làm thế nào về phần mềm? . Không giống như phần cứng, rất khó để "lắp ráp" một ứng dụng từ các thành phần phần mềm. Kể từ khi máy tính ra đời cách đây 60 năm, chúng tôi đã viết hàng tấn chương trình. Tuy nhiên, đối với mỗi ứng dụng mới, chúng tôi phải phát minh lại các bánh xe và viết chương trình từ đầu

Tại sao lại phát minh ra các bánh xe?

Ngôn ngữ hướng thủ tục truyền thống

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Chúng ta có thể làm điều này bằng ngôn ngữ lập trình hướng thủ tục truyền thống như C, Fortran, Cobol hoặc Pascal không?

Các ngôn ngữ định hướng thủ tục truyền thống (chẳng hạn như C và Pascal) có một số nhược điểm đáng chú ý trong việc tạo các thành phần phần mềm có thể tái sử dụng

  1. Các chương trình được tạo thành từ các chức năng. Các chức năng thường không thể tái sử dụng. Rất khó để sao chép một hàm từ một chương trình và sử dụng lại trong một chương trình khác vì hàm đó có khả năng tham chiếu đến các tiêu đề, biến toàn cục và các hàm khác. Nói cách khác, các chức năng không được đóng gói tốt như một đơn vị có thể tái sử dụng độc lập
  2. Các ngôn ngữ thủ tục không phù hợp với mức độ trừu tượng cao để giải quyết các vấn đề trong cuộc sống thực. Ví dụ: các chương trình C sử dụng các cấu trúc như if-else, for-loop, mảng, hàm, con trỏ, là những vấn đề thực tế ở mức độ thấp và khó trừu tượng hóa, chẳng hạn như hệ thống Quản lý quan hệ khách hàng (CRM) hoặc trò chơi bóng đá trên máy tính. (Hãy tưởng tượng sử dụng các mã lắp ráp, một loại mã cấp rất thấp, để viết một trò chơi bóng đá trên máy tính. C tốt hơn nhưng không tốt hơn nhiều. )

Tóm lại, các ngôn ngữ thủ tục truyền thống tách cấu trúc dữ liệu và thuật toán của các thực thể phần mềm

Vào đầu những năm 1970, Bộ Quốc phòng Hoa Kỳ (DoD) đã ủy quyền cho một lực lượng đặc nhiệm điều tra lý do tại sao ngân sách CNTT của họ luôn nằm ngoài tầm kiểm soát; . Những phát hiện là

  1. 80% ngân sách dành cho phần mềm (trong khi 20% còn lại dành cho phần cứng)
  2. Hơn 80% ngân sách phần mềm dành cho bảo trì (chỉ 20% còn lại dành cho phát triển phần mềm mới)
  3. Các thành phần phần cứng có thể được áp dụng cho các sản phẩm khác nhau và tính toàn vẹn của chúng thường không ảnh hưởng đến các sản phẩm khác. (Phần cứng có thể chia sẻ và tái sử dụng. Lỗi phần cứng được cách ly. )
  4. Các quy trình phần mềm thường không thể chia sẻ và không thể sử dụng lại. Lỗi phần mềm có thể ảnh hưởng đến các chương trình khác đang chạy trong máy tính

Lực lượng đặc nhiệm được đề xuất để làm cho phần mềm hoạt động giống như ĐỐI TƯỢNG phần cứng. Sau đó, DoD thay thế hơn 450 ngôn ngữ máy tính, sau đó được sử dụng để xây dựng các hệ thống DoD, bằng một ngôn ngữ hướng đối tượng có tên là Ada

Ngôn ngữ lập trình hướng đối tượng

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Các ngôn ngữ lập trình hướng đối tượng (OOP) được thiết kế để khắc phục những vấn đề này

  1. Đơn vị cơ bản của OOP là một lớp, gói gọn cả thuộc tính tĩnh và hành vi động trong một "hộp" và chỉ định giao diện chung để sử dụng các hộp này. Vì lớp được đóng gói tốt (so với chức năng) nên việc sử dụng lại các lớp này dễ dàng hơn. Nói cách khác, OOP kết hợp các cấu trúc dữ liệu và thuật toán của một thực thể phần mềm trong cùng một hộp
  2. Các ngôn ngữ OOP cho phép mức độ trừu tượng cao hơn để giải quyết các vấn đề thực tế. Ngôn ngữ thủ tục truyền thống (chẳng hạn như C và Pascal) buộc bạn phải suy nghĩ về cấu trúc của máy tính (e. g. bit bộ nhớ và byte, mảng, quyết định, vòng lặp) thay vì suy nghĩ về vấn đề mà bạn đang cố gắng giải quyết. Các ngôn ngữ OOP (chẳng hạn như Java, C++, C#) cho phép bạn suy nghĩ trong không gian vấn đề và sử dụng các đối tượng phần mềm để biểu diễn và trừu tượng hóa các thực thể của không gian vấn đề để giải quyết vấn đề

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Ví dụ: giả sử bạn muốn viết một trò chơi bóng đá trên máy tính (mà tôi coi là một ứng dụng phức tạp). Khá khó để mô hình hóa trò chơi bằng các ngôn ngữ hướng thủ tục. Nhưng sử dụng các ngôn ngữ OOP, bạn có thể dễ dàng mô hình hóa chương trình theo những “vật thật” xuất hiện trong các trận bóng

  • Người chơi. các thuộc tính bao gồm tên, số, vị trí trong trường, v.v.;
  • Trái bóng
  • Tài liệu tham khảo
  • Đồng ruộng
  • Sự tiếp kiến
  • Thời tiết

Quan trọng nhất, một số lớp này (chẳng hạn như

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
0 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
1) có thể được sử dụng lại trong một ứng dụng khác, chẳng hạn như. g. , trò chơi bóng rổ trên máy tính, ít hoặc không sửa đổi

Lợi ích của OOP

Các ngôn ngữ hướng thủ tục tập trung vào các thủ tục, với chức năng là đơn vị cơ bản. Trước tiên, bạn cần tìm ra tất cả các chức năng và sau đó nghĩ về cách biểu diễn dữ liệu

Các ngôn ngữ hướng đối tượng tập trung vào các thành phần mà người dùng cảm nhận được, với các đối tượng là đơn vị cơ bản. Bạn tìm ra tất cả các đối tượng bằng cách đặt tất cả dữ liệu và hoạt động mô tả tương tác của người dùng với dữ liệu

Công nghệ hướng đối tượng có nhiều lợi ích

  • Dễ dàng thiết kế phần mềm như bạn có thể nghĩ trong không gian vấn đề hơn là các bit và byte của máy. Bạn đang xử lý các khái niệm và trừu tượng cấp cao. Dễ thiết kế dẫn đến phát triển phần mềm hiệu quả hơn
  • Dễ bảo trì phần mềm. phần mềm hướng đối tượng dễ hiểu hơn, do đó dễ kiểm tra, gỡ lỗi và bảo trì hơn
  • phần mềm tái sử dụng. bạn không cần phải tiếp tục phát minh lại các bánh xe và viết lại các chức năng tương tự cho các tình huống khác nhau. Cách nhanh nhất và an toàn nhất để phát triển một ứng dụng mới là sử dụng lại các mã hiện có - các mã đã được kiểm tra và chứng minh đầy đủ

Khái niệm cơ bản về OOP

Các lớp và trường hợp

Lớp. Một lớp là một định nghĩa của các đối tượng cùng loại. Nói cách khác, một lớp là một kế hoạch chi tiết, khuôn mẫu hoặc nguyên mẫu xác định và mô tả các thuộc tính tĩnh và hành vi động chung cho tất cả các đối tượng cùng loại

Ví dụ. Một thể hiện là một hiện thực của một mục cụ thể của một lớp. Nói cách khác, một thể hiện là sự khởi tạo của một lớp. Tất cả các thể hiện của một lớp đều có các thuộc tính giống nhau, như được mô tả trong định nghĩa lớp. Ví dụ: bạn có thể định nghĩa một lớp có tên là "

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
2" và tạo ba thể hiện của lớp "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
2" cho "_______04", "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
5" và "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
6"

Thuật ngữ "đối tượng" thường dùng để chỉ ví dụ. Nhưng nó thường được sử dụng khá lỏng lẻo, có thể đề cập đến một lớp hoặc một thể hiện

Một Lớp là Hộp 3 Ngăn đóng gói Dữ liệu và Chức năng

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Có thể hình dung một lớp học như một chiếc hộp ba ngăn, như hình minh họa

  1. Tên lớp (hoặc định danh). xác định lớp
  2. Thành viên dữ liệu hoặc biến (hoặc thuộc tính, trạng thái, trường). chứa các thuộc tính tĩnh của lớp
  3. Chức năng thành viên (hoặc phương pháp, hành vi, hoạt động). chứa các hoạt động năng động của lớp

Nói cách khác, một lớp đóng gói các thuộc tính tĩnh (dữ liệu) và các hành vi động (các thao tác hoạt động trên dữ liệu) trong một hộp.

thành viên lớp. Các thành viên dữ liệu và các hàm thành viên được gọi chung là các thành viên lớp

Hình dưới đây cho thấy một vài ví dụ về các lớp

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Hình dưới đây cho thấy hai trường hợp của lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
2, được xác định là "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
8" và "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
9"

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Sơ đồ sơ đồ lớp và ngôn ngữ mô hình hóa thống nhất (UML). Các sơ đồ lớp trên được vẽ theo các ký hiệu UML. Một lớp được biểu diễn dưới dạng hộp 3 ngăn, lần lượt chứa tên, dữ liệu thành viên (biến) và hàm thành viên. tên lớp được in đậm và tập trung. Một thể hiện (đối tượng) cũng được biểu diễn dưới dạng hộp 3 ngăn, với tên thể hiện là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
00 và được gạch dưới

Bản tóm tắt ngắn gọn
  1. Một lớp là một thực thể phần mềm trừu tượng, khép kín, có thể tái sử dụng do lập trình viên định nghĩa, bắt chước một thứ trong thế giới thực
  2. Một lớp là một hộp 3 ngăn chứa tên, dữ liệu thành viên (biến) và các hàm thành viên
  3. Một lớp đóng gói các cấu trúc dữ liệu (trong các thành viên dữ liệu) và các thuật toán (các hàm thành viên). Các giá trị của các thành viên dữ liệu cấu thành trạng thái của nó. Các chức năng thành viên cấu thành hành vi của nó
  4. Một thể hiện là một khởi tạo (hoặc hiện thực hóa) một mục cụ thể của một lớp

Định nghĩa lớp

Trong C++, chúng ta sử dụng từ khóa

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
01 để định nghĩa một lớp. Có hai phần trong khai báo lớp.
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03, sẽ giải thích sau. Ví dụ như,

Quy ước đặt tên lớp. Một tên lớp sẽ là một danh từ hoặc một cụm danh từ được tạo thành từ nhiều từ. Tất cả các từ sẽ được viết hoa đầu tiên (trường hợp lạc đà). Sử dụng một danh từ số ít cho tên lớp. Chọn một tên lớp có ý nghĩa và tự mô tả. Ví dụ: ________ 104, ________ 105, _____ 106,

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
07 và ________ 108

Tạo thể hiện của một lớp

Để tạo một thể hiện của một lớp, bạn phải

  1. Khai báo một định danh thể hiện (tên) của một lớp cụ thể
  2. Gọi một hàm tạo để xây dựng thể hiện (i. e. , phân bổ bộ nhớ cho phiên bản và khởi tạo các biến)

Ví dụ, giả sử rằng chúng ta có một lớp tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, chúng ta có thể tạo các thể hiện của
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 như sau

Ngoài ra, bạn có thể gọi hàm tạo một cách rõ ràng bằng cú pháp sau

chấm (. ) Nhà điều hành

Để tham chiếu một thành viên của một đối tượng (thành viên dữ liệu hoặc hàm thành viên), bạn phải

  1. Trước tiên hãy xác định phiên bản mà bạn quan tâm, sau đó
  2. Sử dụng toán tử dấu chấm (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    11) để chỉ thành viên, ở dạng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    12

Ví dụ, giả sử rằng chúng ta có một lớp tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, với hai thành viên dữ liệu (
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15) và hai hàm (
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
16 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
17). Chúng tôi đã tạo ba phiên bản của lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, cụ thể là,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
19,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
00 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
01. Để gọi hàm
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
17, trước tiên bạn phải xác định đối tượng quan tâm,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
00 nói, sau đó sử dụng toán tử dấu chấm, ở dạng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
04, để gọi hàm
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
17 của đối tượng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
00

Ví dụ,

Gọi

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
17 mà không xác định thực thể là vô nghĩa, vì bán kính không xác định (có thể có nhiều thực thể của
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 - mỗi thực thể duy trì bán kính riêng của nó)

Nói chung, giả sử có một lớp tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 với một thành viên dữ liệu tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
00 và một hàm thành viên tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
01. Một thể hiện có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 được xây dựng cho
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09. Bạn sử dụng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
04 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
05

Thành viên dữ liệu (Biến)

Thành viên dữ liệu (biến) có tên (hoặc mã định danh) và loại; . Một thành viên dữ liệu cũng có thể là một thể hiện của một lớp nào đó (sẽ được thảo luận sau)

Quy ước đặt tên thành viên dữ liệu. Tên thành viên dữ liệu sẽ là một danh từ hoặc một cụm danh từ được tạo thành từ nhiều từ. Từ đầu tiên được viết thường và các từ còn lại được viết hoa chữ cái đầu (camel-case), e. g. ,

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
06,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
07,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
08,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
00. Hãy lưu ý rằng tên biến bắt đầu bằng chữ thường, trong khi tên lớp bắt đầu bằng chữ hoa

Chức năng thành viên

Một chức năng thành viên (như được mô tả trong chương trước)

  1. nhận thông số từ người gọi,
  2. thực hiện các hoạt động được xác định trong thân hàm và
  3. trả về một phần kết quả (hoặc void) cho người gọi

Quy ước đặt tên hàm thành viên. Tên hàm phải là một động từ hoặc một cụm động từ được tạo thành từ nhiều từ. Từ đầu tiên viết thường và các từ còn lại viết hoa chữ cái đầu (camel-case). Ví dụ:

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
16,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02

Lưu ý rằng tên thành viên dữ liệu là một danh từ (biểu thị một thuộc tính tĩnh), trong khi tên hàm là một động từ (biểu thị một hành động). Họ có cùng một quy ước đặt tên. Tuy nhiên, bạn có thể dễ dàng phân biệt chúng từ ngữ cảnh. Các hàm nhận đối số trong dấu ngoặc đơn (có thể là đối số không với dấu ngoặc đơn trống), nhưng biến thì không. Trong văn bản này, các chức năng được biểu thị bằng một cặp dấu ngoặc đơn, e. g. ,

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
17 cho rõ ràng

Đặt chúng lại với nhau. Một ví dụ OOP

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Một lớp có tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 sẽ được định nghĩa như minh họa trong sơ đồ lớp. Nó chứa hai thành viên dữ liệu.
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 (loại
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
07) và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15 (loại
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09); .
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
16,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
101 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
17

Sau đó, ba phiên bản của

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 được gọi là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
19,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
00 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
01 sẽ được xây dựng với các thành viên dữ liệu tương ứng của chúng, như thể hiện trong sơ đồ phiên bản

Trong ví dụ này, chúng tôi sẽ giữ tất cả các mã trong một tệp nguồn duy nhất có tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
107

CircleAIO. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
8

Để biên dịch và chạy chương trình (với GNU GCC trong Windows)

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
1

nhà xây dựng

Hàm tạo là một hàm đặc biệt có tên hàm trùng với tên lớp. Trong lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 ở trên, chúng tôi định nghĩa một hàm tạo như sau

Một hàm tạo được sử dụng để xây dựng và khởi tạo tất cả các thành viên dữ liệu. Để tạo một thể hiện mới của một lớp, bạn cần khai báo tên của thể hiện và gọi hàm tạo. Ví dụ,

Hàm tạo khác với hàm thông thường ở các khía cạnh sau

  • Tên của hàm tạo giống như tên lớp
  • Constructor không có kiểu trả về (hoặc ngầm định trả về
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    109). Do đó, không có câu lệnh
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    110 nào được phép bên trong phần thân của hàm tạo
  • Trình xây dựng chỉ có thể được gọi một lần để khởi tạo thể hiện được xây dựng. Bạn không thể gọi hàm tạo sau đó trong chương trình của mình
  • Constructor không được kế thừa (sẽ giải thích sau)

Đối số mặc định cho hàm

Trong C++, bạn có thể chỉ định giá trị mặc định cho các đối số theo sau của hàm (bao gồm hàm tạo) trong tiêu đề hàm. Ví dụ,

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
3

"công khai" vs. Công cụ sửa đổi kiểm soát truy cập "riêng tư"

Công cụ sửa đổi kiểm soát truy cập có thể được sử dụng để kiểm soát khả năng hiển thị của thành viên dữ liệu hoặc chức năng thành viên trong một lớp. Chúng tôi bắt đầu với hai công cụ sửa đổi kiểm soát truy cập sau đây

  1. Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    111. Thành viên (dữ liệu hoặc chức năng) có thể truy cập và có sẵn cho tất cả trong hệ thống
  2. Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    112. Thành viên (dữ liệu hoặc chức năng) chỉ có thể truy cập và khả dụng trong lớp này

Ví dụ: trong định nghĩa

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 ở trên, thành viên dữ liệu
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 được khai báo là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02. Kết quả là,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 có thể truy cập bên trong lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, nhưng KHÔNG thể truy cập bên ngoài lớp. Nói cách khác, bạn không thể sử dụng "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
118" để chỉ
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 của
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
19 trong
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121. Hãy thử chèn câu lệnh "______6122" vào
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121 và quan sát thông báo lỗi

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
7

Hãy thử di chuyển

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 đến phần
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03 và chạy lại câu lệnh

Mặt khác, hàm

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
16 được khai báo
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03 trong lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09. Do đó, nó có thể được gọi trong
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121

Ký hiệu UML. Trong ký hiệu UML, các thành viên

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03 được biểu thị bằng "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
131", trong khi các thành viên
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 có "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
133" trong sơ đồ lớp

Ẩn thông tin và đóng gói

Một lớp đóng gói các thuộc tính tĩnh và các hành vi động vào một "chiếc hộp 3 ngăn". Khi một lớp được xác định, bạn có thể niêm phong "hộp" và đặt "hộp" lên giá để người khác sử dụng và tái sử dụng. Bất cứ ai cũng có thể nhặt "hộp" và sử dụng nó trong ứng dụng của họ. Điều này không thể thực hiện được trong ngôn ngữ định hướng thủ tục truyền thống như C, vì các thuộc tính tĩnh (hoặc biến) nằm rải rác trên toàn bộ chương trình và tệp tiêu đề. Bạn không thể "cắt" một phần của chương trình C, cắm vào một chương trình khác và mong chương trình chạy mà không có nhiều thay đổi

Thành viên dữ liệu của một lớp thường được ẩn từ bên ngoài, với công cụ sửa đổi kiểm soát truy cập

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02. Quyền truy cập vào các thành viên dữ liệu riêng tư được cung cấp thông qua các chức năng của người đánh giá
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03, e. g. ,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
16 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
101

Điều này tuân theo nguyên tắc che giấu thông tin. Nghĩa là, các đối tượng giao tiếp với nhau bằng các giao diện được xác định rõ (các hàm công khai). Các đối tượng không được phép biết chi tiết thực hiện của người khác. Các chi tiết triển khai được ẩn hoặc gói gọn trong lớp. Ẩn thông tin tạo điều kiện sử dụng lại lớp

quy tắc ngón tay cái. Không tạo bất kỳ thành viên dữ liệu nào

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03, trừ khi bạn có lý do chính đáng

Getters và Setters

Để cho phép người khác đọc giá trị của thành viên dữ liệu

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
140, bạn sẽ cung cấp hàm get (hoặc hàm getter hoặc hàm truy cập) có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
141. Một getter không cần hiển thị dữ liệu ở định dạng thô. Nó có thể xử lý dữ liệu và giới hạn chế độ xem dữ liệu mà những người khác sẽ thấy. Getters sẽ không sửa đổi thành viên dữ liệu

Để cho phép các lớp khác sửa đổi giá trị của thành viên dữ liệu

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
140, bạn sẽ cung cấp một hàm set (hoặc hàm setter hoặc mutator) có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
144. Một trình thiết lập có thể cung cấp xác thực dữ liệu (chẳng hạn như kiểm tra phạm vi) và chuyển đổi dữ liệu thô thành biểu diễn bên trong

Ví dụ, trong lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 của chúng ta, các thành viên dữ liệu
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15 được khai báo là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02. Điều đó có nghĩa là, chúng chỉ khả dụng trong lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 và không hiển thị bên ngoài lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 - bao gồm cả
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121. Bạn không thể truy cập trực tiếp các thành viên dữ liệu
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15 từ
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121 - thông qua nói
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
118 hoặc
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
157. Lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 cung cấp hai hàm truy cập công khai, cụ thể là,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
16 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
101. Các hàm này được khai báo
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03.
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121 có thể gọi các hàm truy cập công khai này để truy xuất
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15 của một đối tượng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, thông qua nói
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
166 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
167

Không có cách nào bạn có thể thay đổi

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 hoặc
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15 của một đối tượng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, sau khi nó được xây dựng trong
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121. Bạn không thể đưa ra các câu lệnh như
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
172 để thay đổi
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 của thể hiện
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
19, vì
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 được khai báo là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 trong lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 và không hiển thị đối với người khác bao gồm
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121

Nếu người thiết kế của lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 cho phép thay đổi
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15 sau khi đối tượng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 được xây dựng, anh ta phải cung cấp trình thiết lập thích hợp, e. g. ,

Với việc triển khai ẩn thông tin đúng cách, người thiết kế lớp có toàn quyền kiểm soát những gì người dùng của lớp có thể và không thể làm

Từ khóa "cái này"

Bạn có thể sử dụng từ khóa "

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
183" để chỉ trường hợp này bên trong định nghĩa lớp

Một trong những cách sử dụng chính của từ khóa

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
183 là giải quyết sự mơ hồ giữa tên của thành viên dữ liệu và tham số chức năng. Ví dụ,

Trong các mã trên, có hai định danh được gọi là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 - một thành viên dữ liệu và tham số chức năng. Điều này gây ra xung đột đặt tên. Để giải quyết xung đột đặt tên, bạn có thể đặt tên cho tham số chức năng là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
186 thay vì
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14. Tuy nhiên,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14 gần đúng và có ý nghĩa hơn trong ngữ cảnh này. Bạn có thể sử dụng từ khóa
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
183 để giải quyết xung đột đặt tên này. "______6190" đề cập đến thành viên dữ liệu;

"

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
183" thực sự là một con trỏ tới đối tượng này. Tôi sẽ giải thích về con trỏ và ý nghĩa của toán tử "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
193" sau

Ngoài ra, bạn có thể sử dụng tiền tố (chẳng hạn như

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
194) hoặc hậu tố (chẳng hạn như
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
195) để đặt tên cho các thành viên dữ liệu nhằm tránh sự cố về tên. Ví dụ,

Trình biên dịch C++ đặt tên nội bộ cho các thành viên dữ liệu của chúng bắt đầu bằng dấu gạch dưới ở đầu (

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
196) và các biến cục bộ có 2 dấu gạch dưới ở đầu (e. g. ,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
197). Do đó, tránh đặt tên bắt đầu bằng dấu gạch dưới trong chương trình của bạn

Hàm thành viên "const"

Hàm thành viên

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
198, được xác định bởi từ khóa
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
198 ở cuối tiêu đề của hàm thành viên, không thể sửa đổi bất kỳ thành viên dữ liệu nào của đối tượng này. Ví dụ,

Quy ước cho Getters/Setters và Constructor

Các hàm tạo, getter và setter cho thành viên dữ liệu

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
140 thuộc loại
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
302 trong lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
303 có các quy ước sau

Đối với một biến

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
304
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
140, getter sẽ được đặt tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
306, thay vì
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
141, như sau

Nhà xây dựng mặc định

Hàm tạo mặc định là hàm tạo không có tham số hoặc có giá trị mặc định cho tất cả các tham số. Ví dụ: hàm tạo của

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 ở trên có thể được dùng làm hàm tạo mặc định với tất cả các tham số mặc định

Nếu C++, nếu bạn không cung cấp BẤT KỲ hàm tạo nào, trình biên dịch sẽ tự động cung cấp một hàm tạo mặc định mà không làm gì cả. Đó là,

Trình biên dịch sẽ không cung cấp hàm tạo mặc định nếu bạn xác định (các) hàm tạo bất kỳ. Nếu tất cả các hàm tạo mà bạn đã xác định đều yêu cầu đối số, thì việc gọi hàm tạo mặc định không có đối số sẽ dẫn đến lỗi. Điều này là để cho phép người thiết kế lớp không thể tạo một thể hiện chưa được khởi tạo, bằng cách KHÔNG cung cấp một hàm tạo mặc định rõ ràng

Danh sách khởi tạo thành viên của nhà xây dựng

Thay vì khởi tạo các thành viên dữ liệu riêng tư bên trong phần thân của hàm tạo, như sau

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}

Chúng ta có thể sử dụng một cú pháp thay thế được gọi là danh sách khởi tạo thành viên như sau

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
0

Danh sách khởi tạo thành viên được đặt sau tiêu đề của hàm tạo, được phân tách bằng dấu hai chấm (

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
309). Mỗi bộ khởi tạo có dạng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
310. Đối với loại cơ bản, nó tương đương với
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
311. Đối với đối tượng, hàm tạo sẽ được gọi để xây dựng đối tượng. Phần thân của hàm tạo (trống trong trường hợp này) sẽ được chạy sau khi hoàn thành danh sách bộ khởi tạo thành viên

Nên sử dụng danh sách trình khởi tạo thành viên để khởi tạo tất cả các thành viên dữ liệu, vì nó thường hiệu quả hơn so với thực hiện phép gán bên trong phần thân của hàm tạo

* Kẻ hủy diệt

Hàm hủy, tương tự như hàm tạo, là một hàm đặc biệt có cùng tên với tên lớp, với tiền tố

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
312, e. g. ,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
313. Hàm hủy được gọi ngầm khi một đối tượng bị hủy

Nếu bạn không xác định hàm hủy, trình biên dịch sẽ cung cấp một giá trị mặc định, không có tác dụng gì

Ghi chú nâng cao
  • Nếu lớp của bạn chứa thành viên dữ liệu được cấp phát động (thông qua toán tử
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    314 hoặc
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    315), bạn cần giải phóng bộ nhớ thông qua
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    316 hoặc
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    317

* Sao chép Trình xây dựng

Trình xây dựng bản sao xây dựng một đối tượng mới bằng cách sao chép một đối tượng hiện có cùng loại. Nói cách khác, một hàm tạo bản sao nhận một đối số, là một đối tượng của cùng một lớp

Nếu bạn không định nghĩa một hàm tạo sao chép, trình biên dịch sẽ cung cấp một mặc định để sao chép tất cả các thành viên dữ liệu của đối tượng đã cho. Ví dụ,

Trình tạo bản sao đặc biệt quan trọng. Khi một đối tượng được truyền vào một hàm theo giá trị, hàm tạo sao chép sẽ được sử dụng để tạo một bản sao của đối số

Ghi chú nâng cao
  • Truyền theo giá trị cho đối tượng có nghĩa là gọi hàm tạo bản sao. Để tránh chi phí tạo bản sao, tốt hơn hết là chuyển qua tham chiếu đến-
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    198, điều này sẽ không có tác dụng phụ trong việc sửa đổi đối tượng của người gọi
  • Trình tạo bản sao có chữ ký sau
  • Trình tạo bản sao mặc định thực hiện sao chép bóng. Nó không sao chép các thành viên dữ liệu được cấp phát động được tạo thông qua toán tử
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    314 hoặc
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    315

* Sao chép toán tử gán (=)

Trình biên dịch cũng cung cấp một toán tử gán mặc định (

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
321), có thể được sử dụng để gán một đối tượng cho một đối tượng khác của cùng một lớp thông qua bản sao thành viên. Ví dụ, sử dụng lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 được định nghĩa trước đó,

Ghi chú nâng cao
  • Bạn có thể quá tải toán tử gán để ghi đè mặc định
  • Hàm tạo sao chép, thay vì toán tử gán sao chép, được sử dụng trong khai báo
  • Toán tử gán bản sao mặc định thực hiện sao chép bóng. Nó không sao chép các thành viên dữ liệu được cấp phát động được tạo thông qua toán tử
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    314 hoặc
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    315
  • Toán tử gán bản sao có chữ ký sau
  • Toán tử gán sao chép khác với hàm tạo sao chép ở chỗ nó phải giải phóng nội dung được cấp phát động của đích và ngăn chặn việc tự gán. Toán tử gán sẽ trả về một tham chiếu của đối tượng này để cho phép hoạt động xâu chuỗi (chẳng hạn như
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    325)
  • Hàm tạo mặc định, hàm hủy mặc định, hàm tạo sao chép mặc định, toán tử gán sao chép mặc định được gọi là hàm thành viên đặc biệt, trong đó trình biên dịch sẽ tự động tạo bản sao nếu chúng được sử dụng trong chương trình và không được định nghĩa rõ ràng.

Tách tiêu đề và thực hiện

Để công nghệ phần mềm tốt hơn, nên lưu giữ phần khai báo và triển khai lớp trong 2 tệp riêng biệt. khai báo là tệp tiêu đề "

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
326"; . Điều này được gọi là tách giao diện chung (khai báo tiêu đề) và việc thực hiện. Giao diện được xác định bởi nhà thiết kế, việc triển khai có thể được cung cấp bởi những người khác. Trong khi giao diện được cố định, các nhà cung cấp khác nhau có thể cung cấp các triển khai khác nhau. Hơn nữa, chỉ những tệp tiêu đề được hiển thị cho người dùng, việc triển khai có thể được cung cấp trong tệp đối tượng "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
328" (hoặc trong thư viện). Mã nguồn không cần cung cấp cho người dùng

Tôi sẽ minh họa bằng các ví dụ sau

Thí dụ. Lớp học vòng tròn

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Thay vì đặt tất cả các mã trong một tệp. Chúng tôi sẽ "tách giao diện và triển khai" bằng cách đặt mã vào 3 tệp

  1. Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    329. định nghĩa giao diện chung của lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    09
  2. Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    331. cung cấp việc triển khai lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    09
  3. Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    333. Chương trình lái thử cho hạng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    09
Vòng tròn. h - Tiêu đề
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
1

Ghi chú chương trình

  • Tệp tiêu đề chứa các câu lệnh khai báo cho trình biên dịch biết về tên và kiểu cũng như nguyên mẫu hàm mà không có chi tiết triển khai
  • C++98/03 KHÔNG cho phép bạn gán giá trị ban đầu cho thành viên dữ liệu (ngoại trừ thành viên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    198
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    336). Các thành viên ngày sẽ được khởi tạo thông qua hàm tạo. Ví dụ: ______30C++11 cho phép khởi tạo các thành viên dữ liệu trong lớp
  • Bạn có thể cung cấp giá trị mặc định cho các đối số của hàm trong tiêu đề. Ví dụ, ______40
  • Tiêu đề chứa nguyên mẫu hàm, tên tham số bị trình biên dịch bỏ qua, nhưng tốt để dùng làm tài liệu. Ví dụ: bạn có thể bỏ tên tham số trong nguyên mẫu như sau

Các tệp tiêu đề sẽ chứa các hằng số, nguyên mẫu hàm, khai báo lớp/cấu trúc

Vòng tròn. cpp - Thực hiện
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
0

Ghi chú chương trình

  • Tệp triển khai cung cấp định nghĩa của các hàm, được bỏ qua phần khai báo trong tệp tiêu đề
  • #include "Vòng tròn. h"
    Trình biên dịch tìm kiếm các tiêu đề trong dấu ngoặc kép (chẳng hạn như
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    337) trong thư mục hiện tại trước, sau đó đến các thư mục bao gồm của hệ thống. Đối với tiêu đề trong dấu ngoặc nhọn (chẳng hạn như
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    338), trình biên dịch KHÔNG tìm kiếm thư mục hiện tại mà chỉ tìm kiếm các thư mục bao gồm của hệ thống. Do đó, hãy sử dụng dấu ngoặc kép cho các tiêu đề do người dùng xác định.
  • Vòng kết nối. Circle(double r, string c) {
    Bạn cần bao gồm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    339 (được gọi là toán tử phân giải phạm vi lớp) trước tên của tất cả các thành viên, để thông báo cho trình biên dịch rằng thành viên này thuộc về một .
    (Phạm vi lớp. Các tên được định nghĩa bên trong một lớp có cái gọi là phạm vi lớp. Chúng chỉ hiển thị trong lớp. Do đó, bạn có thể sử dụng cùng một tên trong hai lớp khác nhau. Để sử dụng những tên này bên ngoài lớp, cần có toán tử phân giải phạm vi lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    339. )
  • Bạn KHÔNG THỂ đặt các đối số mặc định trong quá trình triển khai (chúng sẽ được đặt trong tiêu đề). Ví dụ, ______610
Biên soạn lớp Circle

Bạn có thể biên dịch

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
331 thành một tệp đối tượng có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
342, thông qua tùy chọn
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
343 (chỉ biên dịch) trong GNU GCC

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
11

Để sử dụng lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, người dùng cần có
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
329 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
342. Anh ấy không cần
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
331. Nói cách khác, bạn không cần cung cấp mã nguồn của mình mà chỉ cung cấp các khai báo công khai và mã đối tượng.

TestCircle. cpp - Trình điều khiển thử nghiệm

Hãy viết chương trình thử nghiệm sử dụng lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09 đã tạo

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
12
Biên dịch chương trình thử nghiệm

Để biên dịch

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
333 với mã đối tượng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
342 (và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
329)

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
13

Bạn cũng có thể biên dịch

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
333 với mã nguồn
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
331 (và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
329)

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
14
Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Hãy viết một lớp có tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
355, mô hình hóa một thể hiện thời gian cụ thể với các giá trị giờ, phút và giây, như thể hiện trong sơ đồ lớp.

Lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
355 chứa các thành viên sau

  • Ba thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    02.
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    358 (0-23),
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    359 (0-59) và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    360 (0-59), với giá trị mặc định là 0
  • Hàm tạo
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    362, khởi tạo các thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    358,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    359 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    360 với các giá trị do người gọi cung cấp
  • Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03 getters và setters cho các thành viên dữ liệu riêng tư.
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    367,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    368,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    369,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    370,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    371 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    372
  • Hàm thành viên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    374 để đặt các giá trị của ,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    359 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    360 do người gọi cung cấp
  • Hàm thành viên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    378 để in phiên bản
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    355 này ở định dạng "
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    380", không điền, e. g. ,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    381
  • Một hàm thành viên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    383, làm tăng trường hợp này thêm một giây.
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    383 của
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    385 sẽ là
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    386

Hãy viết mã cho lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
355, với tiêu đề và phần triển khai được tách thành hai tệp.
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
388 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
389

Tiêu đề - Thời gian. h
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15
Thời gian mổ xẻ. h

#ifndef TIME_H
#define TIME_H
.
#endif
Để ngăn một tệp tiêu đề được thêm nhiều lần vào một tệp nguồn (điều này có thể dẫn đến lỗi biên dịch nếu một thực thể được khai báo hai lần, e. g. ,

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
390), chúng tôi gói mã tiêu đề trong một cặp chỉ thị tiền xử lý
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
391 (nếu không xác định) và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
392. Các mã trong khối if sẽ chỉ được đưa vào nếu mã định danh
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
393 chưa được xác định. Điều này đúng với lần đưa vào đầu tiên, cũng xác định mã định danh
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
393 (chỉ thị đầu tiên trong phần thân của khối if). Không thể đưa vào tiếp theo, vì
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
393 đã được xác định trong lần đưa vào đầu tiên. Theo quy ước, sử dụng mã định danh
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
396 (hoặc
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
397) cho tiêu đề
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
398.

Giờ học {
riêng tư.
.
công khai.
.
};
Tiêu đề

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
388 chứa khai báo lớp cho lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
355. Nó được chia thành hai phần.
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03. Các thành viên
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 (dữ liệu hoặc hàm) chỉ có thể được truy cập bởi các thành viên của lớp này, trong khi tất cả các thành viên của
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03 đều có thể nhìn thấy (chẳng hạn như hàm
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
121 nằm ngoài lớp). Khai báo lớp phải được kết thúc bằng dấu chấm phẩy.

riêng tư.
   int giờ;
int phút;
   int giây;
công khai.
.
Chúng tôi khai báo 3 thành viên dữ liệu riêng tư có tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
358,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
359 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
360. Trong C++98/C++03, bạn KHÔNG được phép khởi tạo thành viên dữ liệu trong khai báo lớp (ngoại trừ thành viên dữ liệu
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
198
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
336
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
711). Ví dụ: cài đặt
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
712 gây ra lỗi biên dịch. Thay vào đó, các thành viên dữ liệu sẽ được khởi tạo trong hàm tạo (sẽ được hiển thị sau). C++ 11 mới hơn cho phép khởi tạo các thành viên dữ liệu.

Chỉ các nguyên mẫu hàm thành viên được liệt kê trong khai báo lớp. Nguyên mẫu hàm bao gồm kiểu trả về, tên hàm và kiểu tham số

Time(int h = 0, int m = 0, int s = 0);
khai báo cái gọi là hàm tạo. Hàm tạo là một hàm đặc biệt có cùng tên với lớp. Hàm tạo không có kiểu trả về hoặc hoàn toàn trả về

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
109. Không có câu lệnh
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
110 nào được phép bên trong phần thân của hàm tạo. Một hàm tạo chỉ có thể được sử dụng trong quá trình khai báo cá thể để khởi tạo các thành viên dữ liệu của cá thể. Nó không thể được gọi sau đó.

Trong các nguyên mẫu hàm của tiêu đề, chúng ta có thể đặt giá trị mặc định của các tham số của hàm cho bất kỳ thành viên hàm nào bằng cách sử dụng "

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
715". Trong trường hợp này, hàm tạo này có thể được gọi với 0 đến 3 đối số, các đối số theo sau bị bỏ qua sẽ được đặt thành giá trị mặc định của chúng, e. g. ,

Các mã định danh

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
716,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
717 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
718 không cần thiết trong nguyên mẫu hàm - bạn chỉ cần chỉ định loại tham số. Nhưng chúng đóng vai trò là tài liệu phù hợp và được khuyến nghị mạnh mẽ

int getHour() const;
void setHour(int h);
int getHour() const;
void setHour(int h);
int getHour() const;
void setHour(int h);
declare the so-called getter and setter for the private data member

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
358,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
359 and
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
360. Since the data members are
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 and are not accessible outside the class,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
03 getters and setters are often provided to read and modify the
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 data members. By convention, a getter receives nothing (
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
109) from the caller and returns a value of the type of the data member; a setter receives a value of the type of the data member and returns
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
109. Setters may validate the input before setting the value of the data member.
Chúng ta khai báo hằng hàm getter bằng cách đặt từ khóa
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
198 sau danh sách tham số của hàm. Hàm thành viên
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
198 không thể sửa đổi bất kỳ thành viên dữ liệu nào của đối tượng này. Getter không cần sửa đổi bất kỳ thành viên dữ liệu nào.

void setTime(int h, int m, int s);
khai báo một hàm thành viên công khai để đặt

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
358,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
359 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
360 của phiên bản này trong một lần gọi.

void print() const;
khai báo một hàm thành viên công khai để in phiên bản này ở định dạng

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
732, không điền, e. g. ,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
733. Hàm
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
378 trả về
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
109.

void nextSecond();
khai báo một hàm thành viên công khai để tăng phiên bản này thêm một giây. Ví dụ:

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
385 trở thành
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
386. Hàm
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
383 trả về
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
109.

Thời gian thực hiện. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
16
Thời gian mổ xẻ. cpp

Tệp triển khai

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
389 chứa các định nghĩa của thành viên (trong khi tệp tiêu đề chứa các khai báo), cụ thể là các hàm thành viên

Tất cả các định danh của thành viên trong quá trình triển khai được đặt trước tên lớp và toán tử phân giải phạm vi (

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
741), e. g. ,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
742 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
743, để trình biên dịch có thể biết rằng các mã định danh này thuộc về một lớp cụ thể, trong trường hợp này là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
355

Thời gian. Thời gian(int h, int m, int s) {
   giờ = h;
   phút = m;
   giây = s . C++ KHÔNG khởi tạo kiểu cơ bản (e. g. ,

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
711,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
07) thành viên dữ liệu. Nó cũng KHÔNG đưa ra thông báo lỗi nếu bạn sử dụng thành viên dữ liệu trước khi nó được khởi tạo. Do đó, chúng tôi khuyên bạn nên khởi tạo tất cả các thành viên dữ liệu trong hàm tạo để phiên bản được xây dựng hoàn tất, thay vì dựa vào người dùng để đặt giá trị của các thành viên dữ liệu sau khi xây dựng.
}
In the constructor, we initialize the
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02 data members
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
358,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
359 and
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
360 based on the inputs provided by the caller. C++ does NOT initialize fundamental-type (e.g.,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
711,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
07) data members. It also does NOT issue an error message if you use an data member before it is initialized. Hence, It is strongly recommended to initialize all the data members in the constructor, so that the constructed instance is complete, instead of relying on the user to set the values of the data members after construction.

Các giá trị mặc định của các tham số được chỉ định trong khai báo lớp (trong tiêu đề), KHÔNG phải trong định nghĩa hàm. Đặt một giá trị mặc định trong định nghĩa hàm (e. g. ,

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
751) gây ra lỗi biên dịch

Hãy lưu ý rằng chúng tôi chưa bao gồm xác thực đầu vào (e. g. , giờ sẽ nằm trong khoảng từ 0 đến 23) trong hàm tạo (và bộ cài đặt). Chúng ta sẽ làm điều đó trong ví dụ sau

int Thời gian. getHour() const {
   return hour;
}
trình lấy công khai cho thành viên dữ liệu riêng tư

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
358 chỉ cần trả về giá trị của .

Thời gian vô hiệu. setHour(int h) {
   hour = h;
}
trình thiết lập công khai cho thành viên dữ liệu riêng tư

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
358 đặt thành viên dữ liệu . Một lần nữa, không có xác thực đầu vào cho h (phải nằm trong khoảng từ 0 đến 23).

Phần còn lại của các định nghĩa chức năng là tự giải thích

Con trỏ "này"

Thay vì đặt tên cho các tham số của hàm là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
716,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
717 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
718, chúng tôi muốn đặt tên cho các tham số là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
358,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
359 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
360 sẽ có ý nghĩa hơn về mặt ngữ nghĩa. Tuy nhiên, những tên này gặp sự cố với tên của các thành viên dữ liệu riêng tư. C++ cung cấp một từ khóa
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
183 (là một con trỏ tới trường hợp này - sẽ được thảo luận sau) để phân biệt giữa các thành viên dữ liệu và các tham số chức năng.
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
764,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
765 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
766 đề cập đến các thành viên dữ liệu; . Chúng ta có thể viết lại constructor và setter như sau

Danh sách khởi tạo thành viên

C++ cung cấp một cú pháp thay thế để khởi tạo các thành viên dữ liệu trong hàm khởi tạo được gọi là danh sách khởi tạo thành viên. Ví dụ,

Danh sách bộ khởi tạo thành viên được đặt sau danh sách tham số chức năng, được phân tách bằng dấu hai chấm, ở dạng

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
770. Đối với các thành viên dữ liệu kiểu cơ bản (e. g. ,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
711,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
07),
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
773 giống như
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
774. Đối với các thành viên dữ liệu đối tượng (sẽ được thảo luận sau), hàm tạo bản sao sẽ được gọi. Thân hàm sẽ được thực thi sau danh sách bộ khởi tạo thành viên, danh sách này trống trong trường hợp này

Các thành viên dữ liệu trong danh sách khởi tạo được khởi tạo theo thứ tự khai báo của chúng trong khai báo lớp, không phải thứ tự trong danh sách khởi tạo

Lái Xe Thử Nghiệm - Thời Gian Kiểm Tra. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
17
Thời gian kiểm tra mổ xẻ. cpp

Trình điều khiển thử nghiệm kiểm tra hàm tạo (có và không có giá trị mặc định) và tất cả các chức năng thành viên chung. Rõ ràng, không có xác thực đầu vào nào được thực hiện, như được phản ánh trong ví dụ

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
775

Tập thể dục

Thêm các hàm thành viên

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
776,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
777,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
778,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
779,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
780 vào lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
355

Biên dịch chương trình

Bạn có thể compile tất cả các file nguồn lại với nhau để được file thực thi như sau

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
18

Ngoài ra, bạn có thể biên dịch

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
389 thành tệp đối tượng
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
783, sau đó trình điều khiển thử nghiệm với tệp đối tượng. Bằng cách này, bạn chỉ phân phối tệp đối tượng và tệp tiêu đề chứ không phải tệp nguồn

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
19

Thí dụ. lớp điểm

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
784, như thể hiện trong sơ đồ lớp, mô hình các điểm 2D với tọa độ x và y

Trong sơ đồ lớp, "

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
133" biểu thị thành viên
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02; . "______8789" chỉ định giá trị mặc định của thành viên dữ liệu

Lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
784 chứa các nội dung sau

  • Các thành viên dữ liệu riêng tư
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    791 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    792 (thuộc loại
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    711), với giá trị mặc định là 0
  • Hàm tạo, getters và setters cho thành viên dữ liệu riêng tư
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    791 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    792
  • Một hàm setXY() để đặt cả hai tọa độ
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    791 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    792 của một
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    784
  • Một hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    799 trả về
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    00. Bạn có thể sử dụng hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    01 tích hợp trong
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    338 để tính căn bậc hai
  • Một hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03 trả về
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    04. Bạn có thể sử dụng hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    05 tích hợp trong
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    338 để tính toán độ dốc theo đơn vị radian
  • Hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    378 in ra "
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    08" của trường hợp này
Điểm. h - Tiêu đề
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
1
Điểm. cpp - Thực hiện
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
31
Điểm kiểm tra. cpp - Trình điều khiển thử nghiệm
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
1

Thí dụ. Lớp tài khoản

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Một lớp có tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
09, mô hình hóa một tài khoản ngân hàng, được thiết kế như trong sơ đồ lớp. Nó chứa

  • Hai thành viên dữ liệu riêng tư.
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    10 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    711) và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    12 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    07), duy trì số dư tài khoản vãng lai
  • Hàm công khai
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    14 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    15, lần lượt cộng hoặc trừ số tiền đã cho khỏi số dư. Hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    15 sẽ in ra "số tiền đã rút vượt quá số dư hiện tại. " nếu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    17 nhiều hơn
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    12
  • Một chức năng công cộng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    378, sẽ in "A/C no. xxx Số dư=xxx" (e. g. , A / C No. 991234 Số dư=$88. 88), với
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    12 được làm tròn đến hai chữ số thập phân
Tệp tiêu đề - Tài khoản. h
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
33
Hồ sơ thực hiện - Tài khoản. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
34
Trình điều khiển thử nghiệm - TestAccount. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
3

Thí dụ. Lớp bóng

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Một lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
0 mô hình một quả bóng đang chuyển động, được thiết kế như trong sơ đồ lớp, bao gồm các thành viên sau

  • Bốn thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    02
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    791,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    792,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    25 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    26 để duy trì vị trí và tốc độ của quả bóng
  • Một hàm tạo và các getters và setters công khai cho các thành viên dữ liệu riêng tư
  • Hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    27, đặt vị trí của quả bóng và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    28 để đặt tốc độ của quả bóng
  • Hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    29, tăng lần lượt
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    791 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    792 lên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    25 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    26
  • Một hàm
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    378, in "
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    35", đến 2 chữ số thập phân
Tệp Tiêu đề - Bóng. h
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36
File Thực Hiện - Bóng. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
37
Lái thử - TestBall. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
38

Hãy bắt đầu với lớp Tác giả

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Hãy bắt đầu với một lớp có tên là

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36, được thiết kế như trong sơ đồ lớp. Nó chứa

  • Ba thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    02.
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39),
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    40 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39), và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    42 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    43 của
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    44,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    45 hoặc
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    46 không xác định)
  • Một hàm tạo để khởi tạo
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    40 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    42 với các giá trị đã cho. Không có giá trị mặc định cho các thành viên dữ liệu
  • Getters cho
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    40 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    42, và setter cho
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    40. Không có setter cho
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    42 vì chúng tôi cho rằng các thuộc tính này không thể thay đổi
  • Hàm thành viên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    378 in "tên (giới tính) trong email", e. g. , "Peter Jones (m) tại peter@somewhere. com"
Tệp tiêu đề - Tác giả. h
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
39
Hồ sơ thực hiện - Tác giả. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
70
Mổ xẻ tác giả. cpp

Tác giả. Tác giả(tên chuỗi, chuỗi email, giới tính ký tự) {
   this->name = name;
   setEmail(email);
In this example, we use identifier

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
38 in the function's parameter, which crashes with the data member's identifier
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
38. To differentiate between the two identifiers, we use the keyword
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
183, which is a pointer to this instance.
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
60 refers to the data member; while
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
38 refers to the function's parameter.
Không có xác thực đầu vào nào được thực hiện trên tham số
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
38. Mặt khác, đối với
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
40, chúng tôi gọi setter
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
64 thực hiện xác thực đầu vào.

   if (giới tính == 'm'. giới tính == 'f') {
      this->gender = giới tính;
   } other {
      cout << "Không hợp lệ . Đặt thành 'u' (không xác định). " << endl;
      this->gender = 'u';
   }
}
We validate the input for

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
42 (
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
44,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
45, or
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
46 for unknown). We assign
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
46 for any other inputs.

vô tác giả. setEmail(chuỗi email) {
   size_t found = email. find('@');
   if (đã tìm thấy. = chuỗi. npos && tìm thấy. = 0 && tìm thấy. = email. length()-1) {
      this->email = email;
   } other {
      cout << "Email không hợp lệ. Đặt thành chuỗi rỗng. " << endl;
      this->email = "";
   }
}
To validate

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
40, we assume that there is an
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
71 which is not the first or last character (there are other stricter email validation criteria). We use the
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
39 class function
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
73 to find the position of the character
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
71, which returns a value of type
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
75 (typically same as
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
76). The function
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
73 returns a special constant
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
78 (which is typically set to -1) to indicate "not found"; 0 for the first character and
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
79 for the last character (where
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
39's function
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
81 returns the length of the string).

TestAuthor. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
33

Sách được viết bởi Tác giả - Sử dụng Thành viên dữ liệu "Đối tượng"

Một lớp có thể có bao nhiêu hàm (phương thức) trong C++

Hãy thiết kế một lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82. Giả sử rằng một cuốn sách được viết bởi một và chỉ một tác giả. Lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82 (như trong sơ đồ lớp) bao gồm các thành viên sau

  • Bốn thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    02.
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39),
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    87 (một thể hiện của lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    36 mà chúng ta đã tạo trước đó),
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    89 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    07) và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    91 (
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    711, với giá trị mặc định là 0).
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    89 phải là dương và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    91 là 0 hoặc dương.
    Hãy lưu ý rằng thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    87 là một thể hiện (đối tượng) của lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    36, thay vì một kiểu cơ bản (chẳng hạn như
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    711,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    07). Trên thực tế,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38 cũng là một đối tượng của lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39.
  • Các getters và setters
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03 cho các thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    02. Hãy lưu ý rằng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    003 trả về một đối tượng (một thể hiện của lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    36)
  • Hàm thành viên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    378, in "'book-name' theo tên tác giả (giới tính) @ email"
  • Hàm thành viên
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    03
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    008, trả về
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38 của tác giả của trường hợp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    82 này

Hình dạng kim cương thần thánh trong sơ đồ lớp biểu thị mối quan hệ liên kết tổng hợp (hoặc có-a). Nghĩa là, một phiên bản

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82 có một (và chỉ một) phiên bản
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36 là thành phần của nó

Tệp tiêu đề - Sách. h
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
72

#include "Tác giả. h"
Chúng ta cần bao gồm tiêu đề "

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
013", vì chúng ta sử dụng lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36 trong lớp này
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82.

riêng tư.
   Tác giả tác giả;
Chúng tôi khai báo thành viên dữ liệu

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
02
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
87 là một thể hiện của lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36, được định nghĩa trước đó.

Hồ sơ thực hiện - Sách. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
37

Sách. Sách(tên chuỗi, Tác giả tác giả, giá gấp đôi, int qtyInStock)
. name(name), author(author) {
   setPrice(price);
   setQtyInStock(qtyInStock);
}}}}}}}}}}}
In the constructor, the caller is supposed to create an instance of

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36, and pass the instance into the constructor. We use member initializer list to initialize data members
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
38 and
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
87. We call setters in the body, which perform input validation to set the
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
89 and
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
91. The body is run after the member initializer list. The
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
024 invokes the default copy constructor of the
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36 class, which performs memberwise copy for all the data members. Object data member shall be constructed via the member initializer list, not in the body. Otherwise, the default constructor will be invoked to construct the object.

Sách trống. setPrice(giá gấp đôi) {
   if (giá > 0) {
      this->price = price;
   } other { . Đặt thành 0" << endl;
      cout << "price should be positive! Set to 0" << endl;
      this->price = 0;
   }
}
The setter for

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
89 validates the given input.

Sách chuỗi. getAuthorName() const {
   return tác giả. getName();
}
Gọi

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
027 của thành viên dữ liệu
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
87, trả về tên tác giả của phiên bản
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82 này.

Sách kiểm tra. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
15
Trình tạo bản sao mặc định

Trình khởi tạo

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
024 trong hàm tạo gọi cái gọi là hàm tạo sao chép. Một hàm tạo bản sao tạo một thể hiện mới bằng cách sao chép thể hiện đã cho của cùng một lớp. Nếu bạn không cung cấp một hàm tạo bản sao trong lớp của mình, thì C++ sẽ cung cấp một hàm tạo bản sao mặc định, hàm tạo này sẽ xây dựng một đối tượng mới thông qua bản sao thành viên. Ví dụ, đối với lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36, hàm tạo bản sao mặc định do trình biên dịch cung cấp như sau

Pass-by-Reference cho đối tượng Chức năng Tham số Tác giả và chuỗi

Theo mặc định, các đối tượng được truyền theo giá trị vào các hàm. Nghĩa là, một bản sao được tạo và chuyển vào hàm, thay vì bản gốc. Pass-by-value cho các đối tượng lớn mô tả hiệu suất do chi phí tạo bản sao

Thay vào đó, chúng ta có thể truyền một đối tượng vào hàm theo tham chiếu, thông qua khai báo tham chiếu (

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
032) trong danh sách tham số. Nếu chúng tôi không có ý định sửa đổi đối tượng bên trong chức năng (có tác dụng phụ đối với bản gốc), chúng tôi đặt nó là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
198

Trong lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82, các thành viên dữ liệu của
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
39 và
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36 là các đối tượng. Lớp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36 đã được định nghĩa trước đó; . Thay vì đưa "
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
041" vào tiêu đề (đây là một cách làm không tốt vì câu lệnh này sẽ được đưa vào tất cả các tệp sử dụng tiêu đề này), chúng ta sẽ sử dụng toán tử phân giải phạm vi và gọi nó là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
042

Hãy sửa đổi lớp

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82 của chúng ta để minh họa pass-by-reference (để thực hiện)

Tác giả. h
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
39

Ghi chú chương trình

  • Trong C++,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39 là một lớp trong thư viện chuẩn (trong header, thuộc namespace
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    040), giống như các lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    784,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    09 mà ta đã định nghĩa
  • Thay vì bao gồm "
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    041", đây là một cách làm không tốt vì câu lệnh này sẽ được bao gồm trong tất cả các tệp sử dụng tiêu đề này, chúng tôi sử dụng tên đủ điều kiện
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    042
  • Thay vì chuyển các đối tượng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39 theo giá trị vào chức năng, điều này ảnh hưởng đến hiệu suất vì cần phải tạo một bản sao. Chúng tôi chuyển các đối tượng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39 theo tham chiếu (được chỉ định bởi
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    032)
  • Tuy nhiên, trong pass-by-reference, những thay đổi bên trong hàm sẽ ảnh hưởng đến bản sao của người gọi bên ngoài hàm
  • Nếu chúng ta không có ý định thay đổi đối tượng bên trong hàm, chúng ta có thể sử dụng từ khóa
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    198 để chỉ ra tính bất biến. Nếu đối tượng vô tình bị thay đổi bên trong hàm, trình biên dịch sẽ báo lỗi
Tác giả. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
76

Ghi chú chương trình

  • Tác giả. Tác giả(const chuỗi & tên, const string & email, ký tự giới tính) {. }
    Trong hàm tạo, các đối tượng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39 được truyền theo tham chiếu. Điều này cải thiện hiệu suất vì nó loại bỏ nhu cầu tạo một đối tượng tạm thời (bản sao). Hàm tạo sau đó gọi hàm tạo sao chép của lớp
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39 để sao chép các đối số vào các thành viên dữ liệu của nó là
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    38 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    40.
    Chúng tôi tạo các tham số
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    198 để ngăn chúng sửa đổi bên trong hàm (có tác dụng phụ đối với bản gốc).
Sách. h
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
77

Ghi chú chương trình

  • Sách(const chuỗi & tên, const Tác giả & tác giả, giá gấp đôi, int qtyInStock = 0);
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39 và các đối tượng
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    36 được truyền vào hàm tạo thông qua tham chiếu. Điều này cải thiện hiệu suất vì nó loại bỏ việc tạo bản sao nhân bản tạm thời trong giá trị truyền qua. Các tham số được đánh dấu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    198 vì chúng tôi không có ý định sửa đổi chúng bên trong chức năng (có tác dụng phụ đối với bản gốc).
  • Author getAuthor() const;
    Getter trả về một bản sao của thành viên dữ liệu
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    87.
Sách. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
37
  • Sách. Sách(const chuỗi & tên, Tác giả & tác giả, giá gấp đôi, int qtyInStock)
    . tên(tên), tác giả(tác giả) {. }
    ______1063 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    024 gọi các hàm tạo sao chép mặc định để xây dựng các phiên bản mới của
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    39 và
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    36 bằng cách sao chép tham số thành viên.
  • Sách tác giả. getAuthor() { trở lại tác giả; .
    A copy of the data member
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    87 is returned to the caller.
    Bạn nên tránh trả lại tham chiếu của thành viên dữ liệu riêng tư cho người gọi (e. g. ,
    Circle(double r = 1.0, string c = "red") {
       radius = r;
       color = c;
    }
    068), vì người gọi có thể thay đổi thành viên dữ liệu riêng tư thông qua tham chiếu, điều này phá vỡ khái niệm "che giấu và đóng gói thông tin".
Lái thử xe - TestBook. cpp
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
79

Trong chương trình thử nghiệm ở trên, một thể hiện của

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
36 có tên là
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
9 được xây dựng (ở Dòng 8). Thể hiện này được chuyển bằng tham chiếu vào hàm tạo của
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82 (Dòng 12) để tạo thể hiện của
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
82
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
073

Bản tóm tắt

Tất cả các mã trong phiên bản ví dụ này (sử dụng tham chiếu) hoàn toàn giống với phiên bản trước (không sử dụng tham chiếu), ngoại trừ các tham số hàm đối tượng được đánh dấu bằng "

Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
074" (e. g. ,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
075,
Circle(double r = 1.0, string c = "red") {
   radius = r;
   color = c;
}
076). Điều này giúp loại bỏ việc tạo đối tượng nhân bản tạm thời như trong giá trị truyền qua, giúp cải thiện hiệu suất. Hãy lưu ý rằng hàm tạo thực sự gọi hàm tạo sao chép để tạo một bản sao cho thành viên dữ liệu của nó, thay vì tham chiếu bản sao do hàm gọi cung cấp

Một lớp có thể có nhiều chức năng không?

Một số ngôn ngữ lập trình, chẳng hạn như C++, C# và Java, hỗ trợ cái gọi là nạp chồng hàm hoặc phương thức . Tính năng này cho phép bạn cung cấp nhiều hàm tạo lớp vì nó cho phép bạn tạo nhiều hàm hoặc phương thức có cùng tên và cách triển khai khác nhau.

Một lớp C# có thể có bao nhiêu phương thức?

Câu trả lời đúng, trong triển khai CLR hiện tại, là ushort. Giá trị tối đa - 15 .

Có giới hạn về số lượng chức năng mà một chương trình có thể có không?

Không, bạn có thể có bao nhiêu chức năng tùy theo bộ nhớ của bạn . Nhưng có một giới hạn rất hữu hạn đối với lượng FLASH và RAM mà bạn phải làm việc với. Cuối cùng, bạn sẽ hết cái này hay cái kia, và chương trình của bạn rất có thể sẽ hoạt động thất thường.

Có bao nhiêu chức năng là quá nhiều?

Nói cách khác, một chức năng nên làm một việc và làm tốt việc đó. Thông thường các hàm có thể lên tới ~25 dòng mã nhưng nếu nhiều hơn thế. có lẽ nó có thể được chia nhỏ . Đây chỉ là hướng dẫn.