Bạn đang xem : cách viết một lớp

Lớp (I)

Các lớp là một khái niệm được mở rộng: giống như cấu trúc dữ liệu, chúng có thể chứa các thành viên dữ liệu, nhưng chúng cũng có thể chứa các hàm với tư cách là các thành viên.

Một đối tượng là một khởi tạo của một lớp. Về mặt biến, một lớp sẽ là kiểu và một đối tượng sẽ là biến.

Các lớp được xác định bằng từ khóa class hoặc từ khóa struct , với cú pháp sau:

 class class_name {
  access_specifier_1:
    thành viên1;
  access_specifier_2:
    thành viên2;
  ...
} object_names;

Trong đó class_name là định danh hợp lệ cho lớp, object_names là danh sách tên tùy chọn cho các đối tượng của lớp này. Phần nội dung của khai báo có thể chứa, có thể là dữ liệu hoặc khai báo hàm, và tùy chọn.

Các lớp có định dạng giống như đơn giản, ngoại trừ việc chúng cũng có thể bao gồm các hàm và có những thứ mới này được gọi. An là một trong ba từ khóa sau: private , public hoặc protected . Những chỉ định này sửa đổi quyền truy cập cho các thành viên theo sau họ:

  • private các thành viên của một lớp chỉ có thể truy cập được từ bên trong các thành viên khác của cùng lớp (hoặc từ của họ).
  • Các thành viên của

  • được bảo vệ có thể truy cập được từ các thành viên khác trong cùng một lớp (hoặc từ họ), nhưng cũng có thể từ các thành viên của các lớp dẫn xuất của họ.
  • Cuối cùng, các thành viên public có thể truy cập được từ bất kỳ nơi nào có thể nhìn thấy đối tượng.

Theo mặc định, tất cả các thành viên của một lớp được khai báo với từ khóa class đều có quyền truy cập riêng tư cho tất cả các thành viên của nó. Do đó, bất kỳ thành viên nào được khai báo trước bất kỳ thành viên nào khác đều có quyền truy cập riêng tư tự động. Ví dụ:

  1 
2
3
4
5
6
  class Rectangle {
    int chiều rộng, chiều cao;
  công cộng:
    void set_values ​​(int, int);
    khu vực int (void);
} trực tràng;  

Khai báo một lớp (tức là một kiểu) được gọi là Rectangle và một đối tượng (tức là một biến) của lớp này, được gọi là direct . Lớp này chứa bốn thành viên: hai thành viên dữ liệu kiểu int (thành viên width và thành viên height ) với (vì private là cấp truy cập mặc định) và hai hàm thành viên với: các hàm set_values ​​ area , hiện tại chúng tôi chỉ đưa vào phần khai báo chứ chưa đưa vào định nghĩa của chúng.

Lưu ý sự khác biệt giữa cái và: Trong ví dụ trước, Rectangle là (tức là loại), trong khi direct là một đối tượng thuộc loại Rectangle . Nó có cùng mối quan hệ int a trong khai báo sau:

   
  int a;  

trong đó int là tên kiểu (lớp) và a là tên biến (đối tượng).

Sau khi khai báo Rectangle direct , bất kỳ thành viên công khai nào của đối tượng direct đều có thể được truy cập như thể chúng là các hàm bình thường hoặc các biến bình thường, bằng cách chỉ cần chèn một dấu chấm (. ) giữa và. Điều này tuân theo cú pháp tương tự như truy cập các thành viên của cấu trúc dữ liệu thuần túy. Ví dụ:

  1 
2
  direct.set_values ​​(3,4);
myarea = trực tràng.area ();  

Các thành viên duy nhất của direct không thể truy cập từ bên ngoài lớp là width height , vì chúng có quyền truy cập riêng tư và chúng chỉ có thể được giới thiệu từ bên trong các thành viên khác của cùng lớp đó.

Đây là ví dụ đầy đủ về lớp Rectangle:

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

Ví dụ về

  // các lớp
#include & lt; iostream & gt;
sử dụng không gian tên std;

class Rectangle {
    int chiều rộng, chiều cao;
  công cộng:
    void set_values ​​(int, int);
    int area () {return width * height;}
};

void Rectangle :: set_values ​​(int x, int y) {
  chiều rộng = x;
  chiều cao = y;
}

int main () {
  Hình chữ nhật hình chữ nhật;
  trực tràng.set_values ​​(3,4);
  cout & lt; & lt; "khu vực:" & lt; & lt; trực tràng.area ();
  trả về 0;
}  
 khu vực: 12 

Ví dụ này giới thiệu lại ( :: , hai dấu hai chấm), được thấy trong các chương trước liên quan đến không gian tên. Ở đây, nó được sử dụng trong định nghĩa của hàm set_values ​​ để xác định một thành viên của một lớp bên ngoài chính lớp đó.

Lưu ý rằng định nghĩa của hàm thành viên area đã được bao gồm trực tiếp trong định nghĩa của class Rectangle do nó cực kỳ đơn giản. Ngược lại, set_values ​​ nó chỉ được khai báo với nguyên mẫu bên trong lớp, nhưng định nghĩa của nó nằm bên ngoài nó. Trong định nghĩa bên ngoài này, toán tử phạm vi ( :: ) được sử dụng để chỉ định rằng hàm đang được định nghĩa là thành viên của lớp Rectangle và không phải là thành viên thông thường. chức năng.

Toán tử phạm vi ( :: ) chỉ định lớp mà thành viên được định nghĩa thuộc về, cấp chính xác các thuộc tính phạm vi giống như khi định nghĩa hàm này được đưa trực tiếp vào định nghĩa lớp. Ví dụ: hàm set_values ​​ trong ví dụ trước có quyền truy cập vào các biến width height , là các thành viên riêng của lớp Rectangle , và do đó chỉ có thể truy cập từ các thành viên khác của lớp, chẳng hạn như cái này.

Sự khác biệt duy nhất giữa việc xác định một hàm thành viên hoàn toàn trong định nghĩa lớp hoặc chỉ bao gồm khai báo của nó trong hàm và định nghĩa nó sau đó bên ngoài lớp, là trong trường hợp đầu tiên, hàm được trình biên dịch tự động coi là một hàm thành viên, trong khi trong thứ hai, nó là một hàm thành viên lớp bình thường (không phải nội tuyến). Điều này không gây ra sự khác biệt về hành vi, nhưng chỉ đối với các tối ưu hóa trình biên dịch có thể có.

Các thành viên width height có quyền truy cập riêng tư (hãy nhớ rằng nếu không có gì khác được chỉ định, tất cả các thành viên của lớp được xác định bằng từ khóa class đều có quyền truy cập riêng tư) . Bằng cách khai báo chúng là private, không được phép truy cập từ bên ngoài lớp. Điều này có ý nghĩa, vì chúng ta đã định nghĩa một hàm thành viên để đặt giá trị cho các thành viên đó trong đối tượng: hàm thành viên set_values ​​. Do đó, phần còn lại của chương trình không cần phải truy cập trực tiếp vào chúng. Có lẽ trong một ví dụ đơn giản như thế này, thật khó để thấy việc hạn chế quyền truy cập vào các biến này có thể hữu ích như thế nào, nhưng trong các dự án lớn hơn, điều rất quan trọng là không thể sửa đổi các giá trị theo cách không mong muốn (không mong đợi từ quan điểm của đối tượng).

Thuộc tính quan trọng nhất của một lớp là nó là một kiểu và như vậy, chúng ta có thể khai báo nhiều đối tượng của nó. Ví dụ: tiếp theo với ví dụ trước về lớp Rectangle , chúng ta có thể đã khai báo đối tượng directb ngoài đối tượng direct :

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  // example: một lớp, hai đối tượng
#include & lt; iostream & gt;
sử dụng không gian tên std;

class Rectangle {
    int chiều rộng, chiều cao;
  công cộng:
    void set_values ​​(int, int);
    int area () {return width * height;}
};

void Rectangle :: set_values ​​(int x, int y) {
  chiều rộng = x;
  chiều cao = y;
}

int main () {
  Hình chữ nhật hình chữ nhật, hình chữ nhậtb;
  trực tràng.set_values ​​(3,4);
  directb.set_values ​​(5,6);
  cout & lt; & lt; "vùng trực tràng:" & lt; & lt; trực tràng.area () & lt; & lt; endl;
  cout & lt; & lt; "khu vực trực tràng:" & lt; & lt; directb.area () & lt; & lt; endl;
  trả về 0;
}  
 khu vực trực tràng: 12
vùng trực tràng: 30 

Trong trường hợp cụ thể này, lớp (loại đối tượng) là Rectangle , trong đó có hai trường hợp (tức là các đối tượng): direct directb . Mỗi một trong số chúng có các biến thành viên và hàm thành viên riêng.

Lưu ý rằng lệnh gọi tới direct.area () không cho kết quả giống như lệnh gọi tới directb.area () . Điều này là do mỗi đối tượng của lớp Rectangle có các biến riêng của nó width height , vì chúng - theo một cách nào đó - cũng có các thành viên hàm riêng của chúng. set_value area hoạt động trên các biến thành viên của chính đối tượng.

Các lớp cho phép lập trình bằng cách sử dụng mô hình hướng đối tượng: Dữ liệu và hàm đều là thành viên của đối tượng, giảm nhu cầu truyền và mang các trình xử lý hoặc các biến trạng thái khác làm đối số cho các hàm, vì chúng là một phần của đối tượng mà thành viên của nó được gọi. Lưu ý rằng không có đối số nào được chuyển cho các lệnh gọi đến direct.area hoặc directb.area . Các hàm thành viên đó đã trực tiếp sử dụng các thành viên dữ liệu của các đối tượng tương ứng direct directb .

là một khái niệm mở rộng của: giống như cấu trúc dữ liệu, chúng có thể chứa các thành viên dữ liệu, nhưng chúng cũng có thể chứa các hàm như các thành viên. Về mặt biến, một lớp sẽ là kiểu và một đối tượng sẽ là biến. Các lớp được xác định bằng cách sử dụng từ khóa keywordor, với cú pháp sau: Trong đó, một mã định danh hợp lệ cho lớp, là danh sách tên tùy chọn cho các đối tượng của lớp này. Phần thân của khai báo có thể chứa, có thể là dữ liệu hoặc khai báo hàm, và tùy chọn Các lớp có định dạng giống như đơn giản, ngoại trừ việc chúng cũng có thể bao gồm các hàm và có những thứ mới này được gọi. Anis một trong ba từ khóa sau: hoặc. Các bộ chỉ định này sửa đổi quyền truy cập cho các thành viên theo sau chúng: Theo mặc định, tất cả các thành viên của một lớp được khai báo với từ khóa đều có quyền truy cập riêng tư cho tất cả các thành viên của nó. Do đó, bất kỳ thành viên nào được khai báo trước bất kỳ thành viên nào khác đều có quyền truy cập riêng tư tự động. Ví dụ: Khai báo một lớp (tức là một kiểu) được gọi và một đối tượng (tức là một biến) của lớp này, được gọi. Lớp này chứa bốn thành viên: hai thành viên dữ liệu kiểu (thành viên memberand) với (vì private là cấp truy cập mặc định) và hai hàm thành viên với: các hàm và, hiện tại chúng tôi chỉ đưa vào khai báo chứ chưa đưa vào định nghĩa của chúng. Lưu ý sự khác biệt giữa the và: Trong ví dụ trước, là (tức là kiểu), trong khi đó là một đối tượng của kiểu. Nó là cùng một mối quan hệ và tồn tại trong khai báo sau: đó là tên kiểu (lớp) và là tên biến (đối tượng). , bằng cách chỉ cần chèn một dấu chấm () betweenand. Điều này tuân theo cú pháp tương tự như truy cập các thành viên của cấu trúc dữ liệu thuần túy. Ví dụ: Các thành viên duy nhất của nó không thể được truy cập từ bên ngoài lớp là và vì chúng có quyền truy cập riêng tư và chúng chỉ có thể được tham chiếu từ bên trong các thành viên khác của cùng lớp đó. Đây là ví dụ hoàn chỉnh về lớp Rectangle: Ví dụ này giới thiệu lại , hai dấu hai chấm), được thấy trong các chương trước liên quan đến không gian tên. Ở đây nó được sử dụng trong định nghĩa của hàm. Ngược lại, nó chỉ được khai báo với nguyên mẫu của nó bên trong lớp, nhưng định nghĩa của nó ở bên ngoài nó. Trong định nghĩa bên ngoài này, toán tử phạm vi () được sử dụng để chỉ định rằng hàm đang được định nghĩa là một thành viên của lớp và không phải là một hàm không phải thành viên thông thường. Toán tử phạm vi () chỉ định lớp mà thành viên được định nghĩa thuộc về, cấp chính xác các thuộc tính phạm vi giống như thể định nghĩa hàm này được đưa trực tiếp vào định nghĩa lớp. Ví dụ: hàm chức năng trong ví dụ trước có quyền truy cập vào các biến và, là các thành viên riêng của lớp và do đó chỉ có thể truy cập từ các thành viên khác của lớp, chẳng hạn như điều này. chỉ bao gồm khai báo của nó trong hàm và định nghĩa nó sau đó bên ngoài lớp, là trong trường hợp đầu tiên, hàm được trình biên dịch tự động coi là hàm bộ nhớ, trong khi ở trường hợp thứ hai, nó là hàm thành viên bình thường (không phải nội tuyến) của lớp. Điều này không gây ra sự khác biệt về hành vi, nhưng chỉ khi tối ưu hóa trình biên dịch có thể có. Bằng cách khai báo chúng là private, không được phép truy cập từ bên ngoài lớp. Điều này có ý nghĩa, vì chúng ta đã định nghĩa một hàm thành viên để đặt giá trị cho các thành viên đó trong đối tượng: hàm thành viên. Do đó, phần còn lại của chương trình không cần phải truy cập trực tiếp vào chúng. Có lẽ trong một ví dụ đơn giản như thế này, thật khó để thấy việc hạn chế quyền truy cập vào các biến này có thể hữu ích như thế nào, nhưng trong các dự án lớn hơn, điều rất quan trọng là không thể sửa đổi các giá trị theo cách không mong muốn (không mong đợi từ quan điểm của đối tượng). Thuộc tính quan trọng nhất của một lớp là nó là một kiểu và như vậy, chúng ta có thể khai báo nhiều đối tượng của nó. Ví dụ, tiếp theo với ví dụ trước về lớp, chúng ta có thể đã khai báo việc bổ sung objectin vào đối tượng Trong trường hợp cụ thể này, lớp (kiểu của các đối tượng) là, trong đó có hai trường hợp (tức là các đối tượng): và. Mỗi một trong số chúng có các biến thành viên và các hàm thành viên của riêng nó. Lưu ý rằng các hành động gọi không cho kết quả giống như lệnh gọi tới. Điều này là do mỗi đối tượng của lớp có các biến riêng của nó và, theo một cách nào đó - cũng có các thành viên hàm riêng của chúng và hoạt động trên các biến thành viên của chính đối tượng. Các lớp cho phép lập trình bằng cách sử dụng các mô hình hướng đối tượng: Dữ liệu và hàm đều là thành viên của đối tượng , giảm nhu cầuđể truyền và mang các trình xử lý hoặc các biến trạng thái khác làm đối số cho các hàm, vì chúng là một phần của đối tượng mà thành viên của nó được gọi. Lưu ý rằng không có đối số nào được chuyển cho các lệnh gọi. Các hàm thành viên đó trực tiếp sử dụng các thành viên dữ liệu của các đối tượng tương ứng và

Trình tạo

Điều gì sẽ xảy ra trong ví dụ trước nếu chúng ta gọi hàm thành viên area trước khi gọi set_values ​​? Một kết quả không xác định, vì các thành viên width height chưa bao giờ được gán giá trị.

Để tránh điều đó, một lớp có thể bao gồm một hàm đặc biệt được gọi là hàm của nó, hàm này tự động được gọi bất cứ khi nào một đối tượng mới của lớp này được tạo, cho phép lớp khởi tạo các biến thành viên hoặc cấp phát bộ nhớ.

Hàm khởi tạo này được khai báo giống như một hàm thành viên thông thường, nhưng với tên trùng với tên lớp và không có bất kỳ kiểu trả về nào; thậm chí không void .

Bạn có thể dễ dàng cải thiện lớp Rectangle ở trên bằng cách triển khai hàm tạo:

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  // example: class constructor
#include & lt; iostream & gt;
sử dụng không gian tên std;

lớp Hình chữ nhật {
    int chiều rộng, chiều cao;
  công cộng:
    Hình chữ nhật (int, int);
    int area () {return (width * height);}
};

Rectangle :: Rectangle (int a, int b) {
  chiều rộng = a;
  chiều cao = b;
}

int main () {
  Hình chữ nhật (3,4);
  Hình chữ nhật (5,6);
  cout & lt; & lt; "vùng trực tràng:" & lt; & lt; trực tràng.area () & lt; & lt; endl;
  cout & lt; & lt; "khu vực trực tràng:" & lt; & lt; directb.area () & lt; & lt; endl;
  trả về 0;
}  
 khu vực trực tràng: 12
vùng trực tràng: 30 

Kết quả của ví dụ này giống với kết quả của ví dụ trước. Nhưng bây giờ, lớp Rectangle không có hàm thành viên set_values ​​ và thay vào đó có một hàm tạo thực hiện một hành động tương tự: nó khởi tạo các giá trị của width height với các đối số được truyền vào nó.

Lưu ý cách các đối số này được truyền cho hàm tạo tại thời điểm mà các đối tượng của lớp này được tạo:

  1 
2
  Hình chữ nhật (3,4);
Hình chữ nhật (5,6);  

Các hàm tạo không thể được gọi một cách rõ ràng như thể chúng là các hàm thành viên thông thường. Chúng chỉ được thực thi một lần khi một đối tượng mới của lớp đó được tạo.

Lưu ý rằng cả khai báo nguyên mẫu phương thức khởi tạo (trong lớp) cũng như định nghĩa phương thức khởi tạo sau này đều không có giá trị trả về; thậm chí không void : Các hàm tạo không bao giờ trả về giá trị, chúng chỉ khởi tạo đối tượng.

Điều gì sẽ xảy ra trong ví dụ trước nếu chúng ta gọi hàm thành viên trước khi gọi? Một kết quả không xác định, vì các thành viên và không bao giờ được gán giá trị. hoặc cấp phát lưu trữ. Hàm khởi tạo này được khai báo giống như một hàm thành viên thông thường, nhưng với tên khớp với tên lớp và không có bất kỳ kiểu trả về nào; Có thể dễ dàng cải thiện lớp ở trên bằng cách triển khai một phương thức khởi tạo: Kết quả của ví dụ này giống với kết quả của ví dụ trước. Nhưng bây giờ, lớp không có hàm thành viên và thay vào đó có một hàm tạo thực hiện một hành động tương tự: nó khởi tạo các giá trị của và với các đối số được truyền cho nó. Đã tạo: Các hàm tạo không thể được gọi một cách rõ ràng như thể chúng là các hàm thành viên thông thường. Chúng chỉ được thực thi một lần, khi một đối tượng mới của lớp đó được tạo. thậm chí không: Các hàm tạo không bao giờ trả về giá trị, chúng chỉ đơn giản là khởi tạo đối tượng.

Nạp chồng các hàm tạo

Giống như bất kỳ hàm nào khác, một hàm khởi tạo cũng có thể được nạp chồng với các phiên bản khác nhau lấy các tham số khác nhau: với một số lượng tham số khác nhau và / hoặc các tham số thuộc các kiểu khác nhau. Trình biên dịch sẽ tự động gọi trình biên dịch có các tham số khớp với các đối số:

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>
 // nạp chồng các hàm tạo lớp
#include & lt; iostream & gt;
sử dụng không gian tên std;

class Rectangle {
    int chiều rộng, chiều cao;
  công cộng:
    Hình chữ nhật ();
    Hình chữ nhật (int, int);
    int area (void) {return (width * height);}
};

Hình chữ nhật :: Hình chữ nhật () {
  chiều rộng = 5;
  chiều cao = 5;
}

Rectangle :: Rectangle (int a, int b) {
  chiều rộng = a;
  chiều cao = b;
}

int main () {
  Hình chữ nhật (3,4);
  Hình chữ nhật hình chữ nhật;
  cout & lt; & lt; "vùng trực tràng:" & lt; & lt; trực tràng.area () & lt; & lt; endl;
  cout & lt; & lt; "khu vực trực tràng:" & lt; & lt; directb.area () & lt; & lt; endl;
  trả về 0;
}  
 khu vực trực tràng: 12
vùng trực tràng: 25 

Trong ví dụ trên, hai đối tượng của lớp Rectangle được xây dựng: direct directb . direct được tạo bằng hai đối số, giống như trong ví dụ trước.

Nhưng ví dụ này cũng giới thiệu một phương thức khởi tạo loại đặc biệt: the. Hàm là hàm tạo không nhận tham số và nó đặc biệt vì nó được gọi khi một đối tượng được khai báo nhưng không được khởi tạo với bất kỳ đối số nào. Trong ví dụ trên, hàm được gọi cho directb . Lưu ý rằng directb thậm chí không được xây dựng với một tập hợp các dấu ngoặc đơn trống như thế nào - trên thực tế, không thể sử dụng các dấu ngoặc đơn trống để gọi hàm tạo mặc định:

  1 
2
  Hình chữ nhật b; // ok, hàm tạo mặc định được gọi
Rectangle directc (); // rất tiếc, hàm tạo mặc định KHÔNG được gọi  

Điều này là do tập hợp các dấu ngoặc đơn trống sẽ tạo thành một khai báo hàm thay vì một khai báo đối tượng: Đây sẽ là một hàm không có đối số và trả về giá trị kiểu Hình chữ nhật .

Giống như bất kỳ hàm nào khác, một hàm tạo cũng có thể được nạp chồng với các phiên bản khác nhau nhận các tham số khác nhau: với một số lượng tham số khác nhau và / hoặc các tham số thuộc các kiểu khác nhau. Trình biên dịch sẽ tự động gọi đối tượng có các tham số khớp với các đối số: Trong ví dụ trên, hai đối tượng của classare được xây dựng: andis được xây dựng với hai đối số, giống như trong ví dụ trước, nhưng ví dụ này cũng giới thiệu một hàm tạo kiểu đặc biệt: the. Là hàm tạo không nhận tham số và nó đặc biệt vì nó được gọi khi một đối tượng được khai báo nhưng không được khởi tạo với bất kỳ đối số nào. Trong ví dụ trên, theis đã gọi cho. Lưu ý rằng thậm chí không được xây dựng với một tập hợp các dấu ngoặc đơn trống - trên thực tế, các dấu ngoặc đơn trống không thể được sử dụng để gọi phương thức khởi tạo mặc định: Điều này là do tập hợp các dấu ngoặc đơn trống sẽ thực hiện khai báo hàm thay vì khai báo đối tượng: Nó sẽ là một hàm không có đối số và trả về một giá trị kiểu

Khởi tạo thống nhất

Cách gọi các hàm tạo bằng cách đặt các đối số của chúng trong dấu ngoặc đơn, như được hiển thị ở trên, được gọi là. Nhưng các hàm tạo cũng có thể được gọi với các cú pháp khác:

Đầu tiên, các hàm tạo với một tham số duy nhất có thể được gọi bằng cú pháp khởi tạo biến (dấu bằng theo sau là đối số):

class_name object_name = initialization_value;

Gần đây hơn, C ++ đã giới thiệu khả năng các hàm tạo được gọi bằng cách sử dụng, về cơ bản giống như dạng hàm, nhưng sử dụng dấu ngoặc nhọn ( {} ) thay vì dấu ngoặc đơn ( () ):

class_name object_name {value, value, value, ...}

Theo tùy chọn, cú pháp cuối cùng này có thể bao gồm dấu bằng trước dấu ngoặc nhọn.

Dưới đây là một ví dụ với bốn cách để xây dựng các đối tượng của một lớp có hàm tạo nhận một tham số duy nhất:

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  // các lớp và khởi tạo thống nhất
#include & lt; iostream & gt;
sử dụng không gian tên std;

vòng tròn lớp {
    bán kính gấp đôi;
  công cộng:
    Circle (gấp đôi r) {radius = r; }
    double round () {return 2 * radius * 3,14159265;}
};

int main () {
  Vòng tròn foo (10.0); // Dạng chức năng
  Hình tròn = 20,0; // gán init.
  Vòng tròn baz {30.0}; // init thống nhất.
  Đường tròn qux = {40.0}; // Giống POD

  cout & lt; & lt; chu vi "foo:" & lt; & lt; foo.circum () & lt; & lt; '\N';
  trả về 0;
}  

Chu vi của

 foo: 62,8319 

Một ưu điểm của việc khởi tạo đồng nhất so với dạng hàm là, không giống như dấu ngoặc đơn, dấu ngoặc nhọn không thể bị nhầm lẫn với các khai báo hàm và do đó có thể được sử dụng để gọi các hàm tạo mặc định một cách rõ ràng:

  1 
2
3
  Hình chữ nhật b; // hàm tạo mặc định được gọi
Rectangleectc (); // khai báo hàm (hàm tạo mặc định KHÔNG được gọi)
Chữ nhật hình chữ nhật {}; // hàm tạo mặc định được gọi là  

Việc lựa chọn cú pháp để gọi các hàm tạo phần lớn là vấn đề về kiểu dáng. Hầu hết mã hiện có hiện đang sử dụng dạng chức năng và một số hướng dẫn kiểu mới hơn đề xuất chọn cách khởi tạo đồng nhất so với các mã khác, mặc dù nó cũng có những cạm bẫy tiềm ẩn đối với tùy chọn initializer_list như loại của nó.

Cách gọi các hàm tạo bằng cách đặt các đối số của chúng trong dấu ngoặc đơn, như được hiển thị ở trên, được gọi là. Nhưng các hàm tạo cũng có thể được gọi bằng các cú pháp khác: Đầu tiên, các hàm tạo với một tham số duy nhất có thể được gọi bằng cú pháp khởi tạo biến (dấu bằng theo sau là đối số): Gần đây, C ++ đã giới thiệu khả năng các hàm tạo được gọi bằng cách sử dụng, Về cơ bản giống như dạng hàm, nhưng sử dụng dấu ngoặc nhọn () thay vì dấu ngoặc (): Theo tùy chọn, cú pháp cuối cùng này có thể bao gồm một dấu bằng trước dấu ngoặc nhọn. một tham số duy nhất: Một lợi thế của việc khởi tạo thống nhất so với dạng hàm là, không giống như dấu ngoặc đơn, dấu ngoặc nhọn không thể bị nhầm lẫn với khai báo hàm và do đó có thể được sử dụng để gọi các hàm tạo mặc định một cách rõ ràng: Việc lựa chọn cú pháp để gọi các hàm tạo phần lớn là vấn đề về kiểu dáng . Hầu hết mã hiện có hiện đang sử dụng dạng chức năng và một số hướng dẫn kiểu mới hơn đề xuất chọn cách khởi tạo đồng nhất so với các mã khác, mặc dù nó cũng có những cạm bẫy tiềm ẩn đối với tùy chọn kiểu của nó.

Khởi tạo thành viên trong hàm tạo

Khi một hàm tạo được sử dụng để khởi tạo các thành viên khác, các thành viên khác này có thể được khởi tạo trực tiếp mà không cần dùng đến các câu lệnh trong phần thân của nó. Điều này được thực hiện bằng cách chèn, trước phần thân của hàm tạo, dấu hai chấm (: ) và danh sách các lần khởi tạo cho các thành viên lớp. Ví dụ: hãy xem xét một lớp có khai báo sau:

  1 
2
3
4
5
6
  class Rectangle {
    int chiều rộng, chiều cao;
  công cộng:
    Hình chữ nhật (int, int);
    int area () {return width * height;}
};  

Phương thức khởi tạo cho lớp này có thể được định nghĩa, như thường lệ, như sau:

   
  Rectangle :: Rectangle (int x, int y) {width = x; chiều cao = y; }  

Nhưng nó cũng có thể được định nghĩa bằng cách sử dụng:

   
  Rectangle :: Rectangle (int x, int y): width (x) {height = y; }  

Hoặc thậm chí:

   
  Rectangle :: Rectangle (int x, int y): width (x), height (y) {}  

Lưu ý rằng trong trường hợp cuối cùng này, hàm tạo không làm gì khác ngoài việc khởi tạo các thành viên của nó, do đó nó có thân hàm trống.

Đối với các thành viên của các kiểu cơ bản, không có gì khác biệt so với cách nào ở trên phương thức khởi tạo được xác định, bởi vì chúng không được khởi tạo theo mặc định, nhưng đối với các đối tượng thành viên (những đối tượng có kiểu là một lớp), nếu chúng không được khởi tạo sau dấu hai chấm, chúng được xây dựng mặc định.

Việc xây dựng mặc định tất cả các thành viên của một lớp có thể luôn luôn không thuận tiện: trong một số trường hợp, điều này là lãng phí (khi thành viên đó được khởi động lại theo cách khác trong phương thức khởi tạo), nhưng trong một số trường hợp khác, cấu trúc mặc định thậm chí không thể thực hiện được (khi lớp không có hàm tạo mặc định). Trong những trường hợp này, các thành viên sẽ được khởi tạo trong danh sách khởi tạo thành viên. Ví dụ:

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  // khởi tạo thành viên
#include & lt; iostream & gt;
sử dụng không gian tên std;

vòng tròn lớp {
    bán kính gấp đôi;
  công cộng:
    Circle (double r): radius (r) {}
    double area () {return radius * radius * 3,14159265;}
};

xi lanh lớp {
    Cơ sở hình tròn;
    chiều cao gấp đôi;
  công cộng:
    Xi lanh (gấp đôi r, gấp đôi h): cơ sở (r), chiều cao (h) {}
    double volume () {return base.area () * height;}
};

int main () {
  Xi lanh foo (10,20);

  cout & lt; & lt; âm lượng của "foo:" & lt; & lt; foo.volume () & lt; & lt; '\N';
  trả về 0;
}  

Âm lượng của

 foo: 6283,19 

Trong ví dụ này, lớp Cylinder có một đối tượng thành viên có kiểu là một lớp khác (kiểu của base Circle ). Vì các đối tượng của lớp Circle chỉ có thể được xây dựng bằng một tham số, hàm tạo của Cylinder cần gọi hàm tạo của base và cách duy nhất để làm điều này là trong.

Các khởi tạo này cũng có thể sử dụng cú pháp trình khởi tạo thống nhất, sử dụng dấu ngoặc nhọn {} thay vì dấu ngoặc đơn () :

   
  Cylinder :: Cylinder (double r, double h): base {r}, height {h} {}  

Khi một hàm tạo được sử dụng để khởi tạo các thành viên khác, các thành viên khác này có thể được khởi tạo trực tiếp mà không cần dùng đến các câu lệnh trong phần thân của nó. Điều này được thực hiện bằng cách chèn, trước phần thân của hàm tạo, dấu hai chấm () và danh sách các lần khởi tạo cho các thành viên lớp. Ví dụ, hãy xem xét một lớp với khai báo sau: Phương thức khởi tạo cho lớp này có thể được định nghĩa, như bình thường, như: Nhưng nó cũng có thể được định nghĩa bằng cách sử dụngas: Hoặc thậm chí: Lưu ý rằng trong trường hợp cuối cùng này, phương thức khởi tạo không làm gì khác ngoài việc khởi tạo các thành viên của nó, do đó nó có một phần thân hàm rỗng. ). hàm tạo), nhưng trong một số trường hợp khác, cấu trúc mặc định thậm chí không thể thực hiện được (khi lớp không có hàm tạo mặc định). Trong những trường hợp này, các thành viên sẽ được khởi tạo trong danh sách khởi tạo thành viên. Ví dụ: Trong ví dụ này, lớp có một đối tượng thành viên có kiểu là một lớp khác (kiểu của là). Bởi vì các đối tượng của lớp chỉ có thể được xây dựng với một tham số, hàm tạo của cần phải gọi hàm tạo của lệnh gọi và cách duy nhất để làm điều này là trong các cách khởi tạo này.

Con trỏ tới các lớp

Các đối tượng cũng có thể được trỏ tới bởi con trỏ: Sau khi được khai báo, một lớp sẽ trở thành một kiểu hợp lệ, vì vậy nó có thể được sử dụng làm kiểu được trỏ tới bởi một con trỏ. Ví dụ:

   
  Rectangle * prect;  

là một con trỏ tới một đối tượng của lớp Rectangle .

Tương tự như với cấu trúc dữ liệu thuần túy, các thành viên của một đối tượng có thể được truy cập trực tiếp từ một con trỏ bằng cách sử dụng toán tử mũi tên ( - & gt; ). Dưới đây là một ví dụ với một số kết hợp có thể có:

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  // ví dụ con trỏ tới các lớp
#include & lt; iostream & gt;
sử dụng không gian tên std;

class Rectangle {
  int chiều rộng, chiều cao;
công cộng:
  Hình chữ nhật (int x, int y): width (x), height (y) {}
  int area (void) {return width * height; }
};


int main () {
  Hình chữ nhật obj (3, 4);
  Hình chữ nhật * foo, * bar, * baz;
  foo = & amp; obj;
  bar = new Rectangle (5, 6);
  baz = new Rectangle [2] {{2,5}, {3,6}};
  cout & lt; & lt; "khu vực của obj:" & lt; & lt; obj.area () & lt; & lt; '\N';
  cout & lt; & lt; "* khu vực của foo:" & lt; & lt; foo- & gt; area () & lt; & lt; '\N';
  cout & lt; & lt; "* khu vực của quán bar:" & lt; & lt; bar- & gt; area () & lt; & lt; '\N';
  cout & lt; & lt; Khu vực của "baz [0]:" & lt; & lt; baz [0] .area () & lt; & lt; '\N';
  cout & lt; & lt; Khu vực của "baz [1]:" & lt; & lt; baz [1] .area () & lt; & lt; '\N';
  thanh xóa;
  xóa [] baz;
  trả về 0;
}  

Ví dụ này sử dụng một số toán tử để hoạt động trên các đối tượng và con trỏ (các toán tử * , & amp; , . , - & gt; < / code>, [] ). Chúng có thể được hiểu là:

biểu thức có thể được đọc là
* x được trỏ tới bởi x
& amp; x địa chỉ của x
x.y thành viên y của đối tượng x
x- & gt; y member y của đối tượng được trỏ tới bởi x
(* x) .y member y của đối tượng được trỏ tới bởi x (tương đương với đối tượng trước đó)
x [0] đối tượng đầu tiên được trỏ tới bởi x
x [1] đối tượng thứ hai được trỏ tới bởi x
Đối tượng thứ x [n] ( n + 1 ) được trỏ tới bởi x

Hầu hết các biểu thức này đã được giới thiệu trong các chương trước. Đáng chú ý nhất, chương về mảng giới thiệu toán tử offset ( [] ) và chương về cấu trúc dữ liệu thuần túy giới thiệu toán tử mũi tên ( - & gt; ).

Các đối tượng cũng có thể được trỏ tới bởi con trỏ: Sau khi được khai báo, một lớp sẽ trở thành một kiểu hợp lệ, vì vậy nó có thể được sử dụng làm kiểu được trỏ tới bởi một con trỏ. Ví dụ: là một con trỏ tới một đối tượng của lớp Tương tự như với cấu trúc dữ liệu thuần túy, các thành viên của một đối tượng có thể được truy cập trực tiếp từ một con trỏ bằng cách sử dụng toán tử mũi tên (). Dưới đây là một ví dụ với một số kết hợp có thể có: Ví dụ này sử dụng một số toán tử để hoạt động trên các đối tượng và con trỏ (toán tử). Chúng có thể được hiểu là: Hầu hết các biểu thức này đã được giới thiệu trong các chương trước. Đáng chú ý nhất, chương về mảng giới thiệu toán tử offset () và chương về cấu trúc dữ liệu thuần túy giới thiệu toán tử mũi tên ().

Các lớp được xác định bằng struct và union

Các lớp có thể được xác định không chỉ với từ khóa class mà còn với các từ khóa struct union .

Từ khóa struct , thường được sử dụng để khai báo cấu trúc dữ liệu thuần túy, cũng có thể được sử dụng để khai báo các lớp có các hàm thành viên, với cú pháp tương tự như với từ khóa class . Sự khác biệt duy nhất giữa cả hai là các thành viên của các lớp được khai báo với từ khóa struct có quyền truy cập public theo mặc định, trong khi các thành viên của các lớp được khai báo bằng từ khóa class có quyền truy cập private theo mặc định. Đối với tất cả các mục đích khác, cả hai từ khóa đều tương đương trong ngữ cảnh này.

Ngược lại, khái niệm về khác với khái niệm của các lớp được khai báo bằng struct class , vì liên kết chỉ lưu trữ một thành viên dữ liệu tại một thời điểm, nhưng chúng cũng là các lớp và có thể do đó cũng giữ các chức năng thành viên. Quyền truy cập mặc định trong các lớp liên hợp là public .


Xem thêm những thông tin liên quan đến chủ đề làm thế nào để viết một lớp học

Cách dạy con viết chữ đẹp lớp 1

  • Tác giả: Ánh Dương education
  • Ngày đăng: 2021-03-10
  • Đánh giá: 4 ⭐ ( 8144 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Như chúng ta đã biết, lớp 1 là giai đoạn quan trọng của một đưa trẻ. Đây là giai đoạn đầu tiên của hệ giáo dục phổ thông. Ở lớp học này, bên cạnh việc học toán thì học sinh sẽ được học viết chữ và rèn chữ. Tuy nhiên do nhận thức còn hạn chế nên học sinh ở giai đoạn này thường viết chữ chưa thực sự đẹp và trẻ thường gặp rất nhiều lỗi khi tập viết chữ. Vì thế, nhiều cha mẹ thường lo lắng không biết dạy trẻ tập viết chữ bằng phương pháp nào mới đúng cách. Nhằm giúp cho cha mẹ giảm bớt căng thẳng trong quá trình dạy viết cho còn thì mình sẽ hướng dẫn cho cha mẹ cách dạy con viết chữ đẹp lớp 1. Cha mẹ hãy cùng theo dõi video của mình nhé!
    luyện_chữ_đẹp cách_dạy_con_viết_chữ_đẹp_lớp_1 kỹ_thuật_dạy_trẻ_lớp_1_viết_chữ_đẹp
    Có thể nói, lớp 1 là giai đoạn chuyển tiếp quan trọng của một đứa trẻ. Từ những cô nhóc, cậu nhóc vẫn còn ham chơi ở mẫu giáo, các em sẽ dần dần phải làm quen với môi trường học tập mới và từ đây học sẽ trở thành hoạt động chủ đạo của các em, thay thế cho hoạt động vui chơi ở các lớp mầm non trước đó. Vì thế, để dạy trẻ viết chữ trong giai đoạn này quả thực rất khó. Trẻ cần có thời gian để dần dần thích nghi với nhịp độ học tập. Muốn con có chữ viết đẹp thì bên cạnh việc dạy học của các thầy cô ở trường thì cha mẹ cũng cần có phương pháp dạy con viết chữ đẹp đúng cách.
    https://luyenchudep.net/ky-thuat-day-tre-lop-1-viet-chu-dep-tai-nha.html
    Một chữ viết đẹp cần có sự hội tụ của rất nhiều các yếu tố khác nhau. Từ yếu tố vật chất cho đến các yếu tố tinh thần, ngoại cảnh. Mỗi yếu tố lại có sự quan trọng nhất định, không thể xem nhẹ một yếu tố nào. Trước khi dạy con viết chữ đẹp thì cha mẹ nên dạy con viết chữ đúng. Đúng ở đây không chỉ là đúng về kích thước mà còn đúng về cấu tạo. Để làm được điều đó thì con cần được dạy cách cầm bút đúng và ngồi đúng tư thế. Đây là sự chuẩn bị cần thiết trước khi cho bé thực hành tập viết chữ. Mỗi chữ viết sẽ có sự khác nhau nên cha mẹ cần cho con nhận diện và ghi nhớ các chữ cái. Sau đó, cha mẹ hãy dạy con viết các nét cơ bản.
    https://butmay.vn/con-hoc-mai-khong-thuoc-bang-chu-cai-loi-tai-bo-me-hay-do-con/
    Dần dần, khi trẻ đã thành thạo và ghi nhớ thì cha mẹ sẽ dạy con tập viết các nét cơ bản trong tiếng Việt bao gồm nét thẳng, nét ngang, nét cong, nét móc và nét khuyết. Trong quá trình con học tập, cha mẹ nên là người đồng hành cùng con. Cha mẹ hoàn toàn có thể luyện tập cùng con để tạo động lực cho trẻ và cũng là cách để rèn chữ cho bản thân. Dựa trên các nét cơ bản, cha mẹ sẽ dạy con viết từng chữ cái theo đúng kích thước và đúng nét. Chỉ khi nào con viết đúng thì con mới có thể rèn luyện thêm để viết chữ đẹp.
    Trong quá trình dạy con viết chữ đẹp lớp 1 cha mẹ nên đặc biệt lưu ý đến vấn đề tâm lý của trẻ. Vì tâm lý có tác động rất lớn đến trẻ ở giai đoạn này. Chúng ta phải luôn luôn tạo ra sự thoải mái, khuyến khích, động viên để trẻ tự luyện tập và cố gắng, Không nên tạo áp lực cho con hay gò bó con trong một khuôn mẫu nhất định nào đó. Điều này có thể dẫn đến sự lo lắng, sợ hãi thậm chí là chống đối ở trẻ. Cuối cùng, mình chỉ muốn nói, cha mẹ cũng chính là người thầy người cô của con. Để con có thể viết được chữ đẹp thì cha mẹ cần có phương pháp giáo dục đúng cách. Để làm được điểu này thì cha mẹ cần học hỏi, trau dồi kiến thức để dạy con tại nhà giúp con phát huy tối đa năng lực của mình.
    Cách dạy con viết chữ chuẩn bị vào lớp 1
    https://www.youtube.com/watch?v=_IdVI...
    Vận dụng hệ thống nét cơ bản vào luyện chữ: Nét cong | Cách viết chữ cái có nét cong
    https://www.youtube.com/watch?v=5K4K3...
    Quy trình học viết chữ thường | Những quy tắc luyện chữ đẹp không thể bỏ qua
    https://www.youtube.com/watch?v=JUsrQ...
    Vận dụng hệ thống nét cơ bản vào luyện chữ: Nét cong và móc | Cách viết chữ cái có nét cong và móc
    https://www.youtube.com/watch?v=o8Qeo...
    Vận dụng hệ thống nét cơ bản vào luyện chữ: Nét khuyết | Cách viết chữ cái có nét khuyết
    https://www.youtube.com/watch?v=V2xS3...
    Vận dụng hệ thống nét cơ bản vào luyện chữ: Nét thắt | Cách viết chữ cái có nét thắt
    https://www.youtube.com/watch?v=kQdvV...
    Vận dụng hệ thống nét cơ bản vào luyện chữ: Nét móc | Cách viết chữ cái có nét móc
    https://www.youtube.com/watch?v=8ya0z...
    Mẫu giấy viết và luyện chữ đẹp | Những lưu ý khi chọn giấy ô ly viết chữ đẹp
    https://www.youtube.com/watch?v=_wYWu...
    Tài liệu luyện chữ đẹp | Tài liệu luyện chữ đẹp cơ bản không thể bỏ qua
    https://www.youtube.com/watch?v=EUnVl...
    Cách trình bày một bài chính tả | Phương pháp trình bày bài viết chữ đẹp hiệu quả
    https://www.youtube.com/watch?v=2ZkBA...
    Cấu tạo và cách viết 29 chữ cái trong bảng chữ cái tiếng việt
    https://www.youtube.com/watch?v=6EtBY...
    Mẫu chữ cái viết thường và viết hoa dành cho học sinh lớp 1
    https://youtu.be/DSW33Tjjm0o
    Mẫu chữ viết lớp 1 chuẩn - Hướng dẫn luyện chữ đẹp cho học sinh lớp 1
    https://youtu.be/_Wn9DTZaNZ0
    Những lưu ý khi tự luyện chữ đẹp tại nhà
    https://youtu.be/_Wn9DTZaNZ0
    Hướng dẫn cách viết chữ ghép cho học sinh
    https://youtu.be/_fM2uSv5ugM
    Tập viết với mẫu chữ thường đẹp
    https://youtu.be/fRA2sV969gM

Làm thế nào để viết một bài luận giành học bổng?

  • Tác giả: duhocinec.com
  • Đánh giá: 5 ⭐ ( 7715 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bài luận cần thể hiện sự độc đáo, cá nhân hóa, đào sâu vào niềm đam mê của bạn, chứng tỏ bạn phù hợp với tiêu chí của học bổng.

Hướng dẫn học sinh cách để viết bài văn biểu cảm hay

  • Tác giả: hoctot.hocmai.vn
  • Đánh giá: 4 ⭐ ( 5738 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Cô Trần Thị Vân Anh - Giáo viên môn Ngữ văn tại Hệ thống Giáo dục HOCMAI đã đưa ra hướng dẫn các bước làm một bài văn biểu cảm hay đạt điểm cao.

Làm thế nào để viết một bản tóm tắt cho một bài báo khoa học

  • Tác giả: vi.eferrit.com
  • Đánh giá: 4 ⭐ ( 1944 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Cách để Viết nên một câu chuyện hay

  • Tác giả: www.wikihow.vn
  • Đánh giá: 4 ⭐ ( 2985 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Cách để Viết nên một câu chuyện hay. Một câu chuyện hấp dẫn sẽ cuốn hút độc giả và khiến họ tò mò muốn đọc thêm. Để viết được một truyện hay, bạn cần phải sẵn sàng chỉnh sửa sao cho mỗi câu văn đều có ý nghĩa. Hãy khởi đầu bằng việc xây...

Cách viết lưu bút hay và ấn tượng 2022

  • Tác giả: hoatieu.vn
  • Đánh giá: 3 ⭐ ( 1238 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Cách viết lưu bút hay và ấn tượng 2022, Cách viết lưu bút hay và ấn tượng trong bài viết sau đây của Hoatieu.vn sẽ giúp các bạn có những bài lưu bút chia tay bạn

Làm thế nào để viết được một bài văn hay>

  • Tác giả: loigiaihay.com
  • Đánh giá: 3 ⭐ ( 6635 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Làm thế nào để viết được một bài văn hay. Làm thế nào để viết được một bài văn hay

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Nút trung tâm CSS: Hướng dẫn định vị các nút ở giữa - căn giữa một nút trong css

By ads_php