Lớp trong C++ là khối xây dựng dẫn đến lập trình hướng đối tượng. Nó là một kiểu dữ liệu do người dùng xác định, chứa các thành viên dữ liệu và chức năng thành viên của riêng nó, có thể được truy cập và sử dụng bằng cách tạo một thể hiện của lớp đó. Một lớp C++ giống như một bản thiết kế cho một đối tượng. Ví dụ: Hãy xem xét loại xe. Có thể có nhiều chiếc xe với tên gọi và thương hiệu khác nhau nhưng tất cả chúng sẽ chia sẻ một số đặc tính chung như tất cả chúng sẽ có 4 bánh, Giới hạn tốc độ, Phạm vi quãng đường, v.v. Vì vậy, ở đây, Xe hơi là đẳng cấp, và bánh xe, giới hạn tốc độ và quãng đường đi được là tài sản của chúng.
- Lớp là kiểu dữ liệu do người dùng xác định có các thành viên dữ liệu và hàm thành viên.
- Data members là các biến dữ liệu và hàm thành viên là các hàm được sử dụng để thao tác các biến này với nhau, các thành viên dữ liệu này và các hàm thành viên xác định các thuộc tính và hành vi của các đối tượng trong một Class.
- Trong ví dụ trên về hạng Car, thành viên dữ liệu sẽ là giới hạn tốc độ, quãng đường, v.v. và các chức năng của thành viên có thể áp dụng phanh, tăng tốc độ, v.v.
Một Object là một instance của một Class. Khi một lớp được xác định, không có bộ nhớ nào được cấp phát nhưng khi nó được khởi tạo (tức là một đối tượng được tạo) bộ nhớ được phân bổ.
Xác định lớp và khai báo đối tượng
Một lớp được định nghĩa trong C++ bằng cách sử dụng lớp từ khóa theo sau là tên của lớp. Phần thân của lớp được xác định bên trong dấu ngoặc nhọn và kết thúc bằng dấu chấm phẩy ở cuối.
Khai báo đối tượng
Khi một lớp được định nghĩa, chỉ có đặc tả cho đối tượng được xác định; Không có bộ nhớ hoặc bộ nhớ được phân bổ. Để sử dụng các hàm dữ liệu và truy cập được định nghĩa trong lớp, bạn cần tạo các đối tượng.
Cú pháp
ClassName ObjectName;
Truy cập các thành viên dữ liệu và các chức năng thành viên: Các thành viên dữ liệu và các hàm thành viên của lớp có thể được truy cập bằng toán tử dot (‘.’) với đối tượng. Ví dụ, nếu tên của đối tượng là obj và bạn muốn truy cập vào hàm member với tên printName() thì bạn sẽ phải viết obj.printName().
Truy cập thành viên dữ liệu
Các thành viên dữ liệu công khai cũng được truy cập theo cách tương tự, tuy nhiên các thành viên dữ liệu riêng tư không được phép truy cập trực tiếp bởi đối tượng. Việc truy cập một thành viên dữ liệu chỉ phụ thuộc vào kiểm soát truy cập của thành viên dữ liệu đó. Kiểm soát truy cập này được cung cấp bởi các công cụ sửa đổi Access trong C ++. Có ba công cụ sửa đổi truy cập: công khai, riêng tư và được bảo vệ.
C++
// C++ program to demonstrate accessing of data members #include <bits/stdc++.h> using namespace std; class Geeks { // Access specifier public : // Data Members string geekname; // Member Functions() void printname() { cout << "Geekname is:" << geekname; } }; int main() { // Declare an object of class geeks Geeks obj1; // accessing data member obj1.geekname = "Abhi" ; // accessing member function obj1.printname(); return 0; } |
Geekname is:Abhi
Chức năng thành viên trong các lớp học
Có 2 cách để xác định hàm thành viên:
- Định nghĩa bên trong lớp
- Định nghĩa lớp bên ngoài
Để định nghĩa một hàm thành viên bên ngoài định nghĩa lớp, chúng ta phải sử dụng toán tử scope resolution:: cùng với tên lớp và tên hàm.
C++
// C++ program to demonstrate function // declaration outside class #include <bits/stdc++.h> using namespace std; class Geeks { public : string geekname; int id; // printname is not defined inside class definition void printname(); // printid is defined inside class definition void printid() { cout << "Geek id is: " <<id; } }; // Definition of printname using scope resolution operator :: void Geeks::printname() { cout << "Geekname is: " <<geekname; } int main() { Geeks obj1; obj1.geekname = "xyz" ; obj1.id=15; // call printname() obj1.printname(); cout << endl; // call printid() obj1.printid(); return 0; } |
Geekname is: xyz Geek id is: 15
Lưu ý rằng tất cả các hàm thành viên được xác định bên trong định nghĩa lớp theo mặc định là nội tuyến, nhưng bạn cũng có thể tạo bất kỳ hàm không phải lớp nào nội tuyến bằng cách sử dụng từ khóa nội tuyến với chúng. Các hàm nội tuyến là các hàm thực tế, được sao chép ở mọi nơi trong quá trình biên dịch, như macro tiền xử lý, do đó chi phí của các cuộc gọi hàm được giảm.
Ghi: Khai báo chức năng bạn bè là một cách để cấp quyền truy cập riêng tư vào chức năng không phải thành viên.
Nhà xây dựng
Các hàm tạo là các thành viên lớp đặc biệt được trình biên dịch gọi mỗi khi một đối tượng của lớp đó được khởi tạo. Các hàm tạo có cùng tên với lớp và có thể được định nghĩa bên trong hoặc bên ngoài định nghĩa lớp. Có 3 loại hàm tạo:
- Xây dựng mặc định
- Các nhà xây dựng tham số
- Sao chép hàm tạo
C++
// C++ program to demonstrate constructors #include <bits/stdc++.h> using namespace std; class Geeks { public : int id; //Default Constructor Geeks() { cout << "Default Constructor called" << endl; id=-1; } //Parameterized Constructor Geeks( int x) { cout << "Parameterized Constructor called " << endl; id=x; } }; int main() { // obj1 will call Default Constructor Geeks obj1; cout << "Geek id is: " <<obj1.id << endl; // obj2 will call Parameterized Constructor Geeks obj2(21); cout << "Geek id is: " <<obj2.id << endl; return 0; } |
Default Constructor called Geek id is: -1 Parameterized Constructor called Geek id is: 21
Một Copy Constructor tạo ra một đối tượng mới, đó là một bản sao chính xác của đối tượng hiện có. Trình biên dịch cung cấp một Copy Constructor mặc định cho tất cả các lớp.
Cú pháp:
class-name (class-name &){}
Kẻ hủy diệt
Destructor là một hàm thành viên đặc biệt khác được trình biên dịch gọi khi phạm vi của đối tượng kết thúc.
C++
// C++ program to explain destructors #include <bits/stdc++.h> using namespace std; class Geeks { public : int id; //Definition for Destructor ~Geeks() { cout << "Destructor called for id: " << id <<endl; } }; int main() { Geeks obj1; obj1.id=7; int i = 0; while ( i < 5 ) { Geeks obj2; obj2.id=i; i++; } // Scope for obj2 ends here return 0; } // Scope for obj1 ends here |
Destructor called for id: 0 Destructor called for id: 1 Destructor called for id: 2 Destructor called for id: 3 Destructor called for id: 4 Destructor called for id: 7
Sự thật thú vị (Khái niệm hiếm được biết đến)
Tại sao chúng ta cho dấu chấm phẩy vào cuối lớp?
Nhiều người có thể nói rằng đó là một cú pháp cơ bản và chúng ta nên đưa ra dấu chấm phẩy ở cuối lớp như quy tắc của nó được định nghĩa trong cpp. Nhưng lý do chính tại sao dấu chấm phẩy ở cuối lớp là trình biên dịch kiểm tra xem người dùng có đang cố gắng tạo một thể hiện của lớp ở cuối lớp hay không.
Vâng, giống như cấu trúc và hợp nhất, chúng ta cũng có thể tạo ra thể hiện của một lớp ở cuối ngay trước dấu chấm phẩy. Kết quả là, khi thực thi đạt đến dòng đó, nó sẽ tạo ra một lớp và phân bổ bộ nhớ cho phiên bản của bạn.
C++
#include <iostream> using namespace std; class Demo{ int a, b; public : Demo() // default constructor { cout << "Default Constructor" << endl; } Demo( int a, int b):a(a),b(b) //parameterised constructor { cout << "parameterized constructor -values" << a << " " << b << endl; } }instance; int main() { return 0; } |
Default Constructor
Chúng ta có thể thấy rằng chúng ta đã tạo ra một class instance của Demo với tên gọi là “instance”, kết quả là output chúng ta có thể thấy là Default Constructor được gọi.
Tương tự, chúng ta cũng có thể gọi hàm tạo tham số chỉ bằng cách truyền các giá trị ở đây
C++
#include <iostream> using namespace std; class Demo{ public : int a, b; Demo() { cout << "Default Constructor" << endl; } Demo( int a, int b):a(a),b(b) { cout << "parameterized Constructor values-" << a << " " << b << endl; } }instance(100,200); int main() { return 0; } |
parameterized Constructor values-100 200
Vì vậy, bằng cách tạo một instance ngay trước dấu chấm phẩy, chúng ta có thể tạo Instance of class.