Hàm thành viên trong C++ | Laptrinhcanban.com

HOME › >>

Hàm thành viên trong C++

Cùm tìm hiểu về hàm thành viên trong C++ . Bạn sẽ biết khái niệm hàm thành viên trong C++ là gì, cách khai báo cũng như cách gọi hàm thành viên sau bài học này.

Hàm thành viên trong C++ là gì

Hàm thành viên trong C++ có tên tiếng anh là member function, là các hàm hoặc toán tử được khai báo bên trong class, có tác dụng thực hiện các xử lý đối với đối tượng được tạo ra từ class.

Trong hàm thành viên miêu tả các xử lý tham chiếu và thay đổi các biến thành viên có trong class.

Thông thường, các biến thành viên trong class được khai báo ở dạng private, do vậy chúng không thể được truy cập hay thay đổi từ bên ngoài class, mà chỉ có thể được tham chiếu truy cập hay thay đổi bằng hàm thành viên mà thôi.

Do đó, bằng việc sử dụng hàm thành viên trong class++, chúng ta có thể từ bên ngoài một class mà thực hiện gián tiếp các xử lý truy cập lẫn thay đổi biến thành viên có trong nó.

Hai kiểu hàm thành viên trong C++

Như đã nói ở trên thì chúng ta có thể từ bên ngoài class++ mà thực hiện gián tiếp các xử lý truy cập lẫn thay đổi biến thành viên có trong nó, thông qua hàm thành viên của class.

Tuy nhiên thì không phải hàm thành viên nào cũng có đủ cả 2 chức năng truy cập lẫn thay đổi biến thành viên như thế.

Tùy thuộc vào việc hàm thành viên có khả năng thay đổi giá trị của biến thành viên hay không (phụ thuộc vào việc có dùng từ khóa const khi khai báo hàm không) mà trong C++ tồn tại 2 kiểu hàm thành viên như sau:

  1. Hàm thành viên dạng const: chỉ cho phép tham chiếu thuộc tính của đối tượng.
  2. Hàm thành viên không thuộc dạng const: cho phép tham chiếu và thay đổi thuộc tính của đối tượng. Đây là loại hàm thành viên thường sử dụng trong C++.
  • Ở đây const một từ khóa nhằm chỉ định một dữ liệu chỉ có thể được đọc mà thôi.

Cách khai báo và sử dụng 2 loại hàm này sẽ được Kiyoshi trình bày ở phần dưới đây.

Khai báo hàm thành viên trong C++

Gộp khai báo và mô tả hàm thành viên trong C++

Chúng ta khai báo hàm thành viên trong trong khối của class, cũng như viết mô tả cac xử lý trong nó với cú pháp tương tự như các hàm thông thường trong C++ như sau:

class Person {
private:
double m_height;
double m_weight;

public:
void myfunc(){ // Khai báo hàm thành viên
// Các xử lý trong hàm
std::cout << m_height << "\n";
std::cout << m_weight << "\n";
};

//...
};

Trong đó myfunc() chính là một hàm thành viên. Khi khai báo hàm này, chúng ta cần lưu ý phải chỉ định Access Modifier cho nó, ví dụ như trên là public chẳng hạn.

Access Modifier là từ khóa quy định một biến hay hàm thành viên trong class có thể được truy cập từ bên ngoài class hay không. Nếu chỉ định Access Modifier là public thì chúng ta có thể truy cập và sử dụng hàm thành viên đó từ bên ngoài class. Còn nếu chỉ định Access Modifier là private hoặc protected thì chúng ta sẽ không thể truy cập từ ngoài class vào hàm thành viên đó.

Chia file khai báo và file mô tả hàm thành viên

Đối với các chương trình nhỏ, chúng ta có thể viết gộp cả khai báo và các xử lý trong hàm thành viên như trên. Tuy nhiên đối với các chương trình lớn cần làm việc theo nhóm, thì thông thường việc khai báo và việc miêu tả xử lý trong hàm thành viên sẽ được viết riêng vào 2 file với đuôi file là myclass.hmyclass.cpp, cùng với các thành phần khác của class.

person.h:

class Person {
private:
double m_height;
double m_weight;

public:
void myfunc();
//...
};

person.cpp:

#include "person.h"
void Person::myfunc()
{
std::cout << m_height << "\n";
std::cout << m_weight << "\n";
}

//...

Lưu ý với cách viết này, chúng ta cần thêm dòng #include "person.h" để import nội dung từ file person.h vào file person.cpp.

Khai báo nội tuyến hàm thành viên trong C++

Đối với các hàm thành viên đơn giản, chúng ta có thể thực hiện việc khai báo nội tuyến (inline) trong đó việc khai báo và mô tả hàm được thực hiện cùng lúc trên một dòng.

Ví dụ cụ thể:

class Person {
private:
double m_height;
double m_weight;
public:
double getHeight() const { return m_height; } //Trả về chiều cao
void setHeight(double ht) { m_height = ht; } // Thay đổi chiều cao
//.....
};

Do chỉ có 1 xử lý duy nhất trong hàm thành viên getHeight() và setHeight(), nên chúng ta có thể khai báo nội tuyến và rút gọn code như trên.

Hàm thành viên dạng const trong C++

Như đã trình bày ở trên thì bằng việc sử dụng từ khóa const trong khai báo hàm thành viên mà chúng ta có thể chỉ định hàm đó có khả năng thay đổi biến thành viên trong class hay không.

Và một hàm thành viên ở dạng const, sẽ mất đi khả năng thay đổi giá trị của biến thành viên trong class, và chỉ có thể đọc được giá trị đó mà thôi.

Để biến một hàm thành viên thành dạng const, chúng ta chỉ cần thêm từ khóa này vào trước cặp dấu {} khi khai báo hàm như ví dụ dưới đây:

/*Hàm thành viên không phải dạng const*/
void myfunc1(){
// các xử lý
};

/*Hàm thành viên dạng const*/
void myfunc2() const{
// các xử lý
};

Đối với một hàm thành viên ở dạng const, do nó không có khả năng thay đổi biến thành viên trong class, nên nếu tồn tại xử lý nào thay đổi biến thành viên của class trong nó, thì lỗi sẽ xảy ra.

Ví dụ với hàm print() dưới đây được khai báo dưới dạng const, nhưng do trong phần miêu tả hàm chứa xử lý m_weight = 100"; có tác dụng thay đổi biến thành viên của class, nên lỗi sẽ xảy ra:

#include<iostream>
using namespace std;

class Myclass {
private:
double m_height;
double m_weight = 20;
public:
void print() const {
m_weight = 100;
cout << m_weight;
}
};

int main() {
Myclass obj;
obj.print(); //error: assignment of member ‘Myclass::m_weight’ in read-only object

return 0;
}

Nhưng nếu chúng ta lược bỏ hoặc comment out đi xử lý thay đổi biến thành viên trong nó đi, thì hàm sẽ chạy bình thường như sau:

#include<iostream>
using namespace std;

class Myclass {
private:
double m_height;
double m_weight = 20;
public:
void print() const {
//m_weight = 100;
cout << m_weight;
}
};

int main() {
Myclass obj;
obj.print();

return 0; //20
}

Gọi hàm thành viên trong class C++

Trong bài class trong C++ chúng ta đã biết cách sử dụng toán tử new hoặc không sử dụng nó để tạo ra instance khi sử dụng classs.

Và tùy thuộc vào cách chúng ta có sử dụng new hay không mà việc gọi hàm thành viên trong class C++ cũng sẽ khác nhau như sau:

Gọi hàm thành viên khi không dùng new

Để gọi hàm thành viên trong class trong trường hợp không dùng toán tử new, hãy sử dụng tới toán tử dấu chấm để gọi hàm thành viên với cú pháp sau đây:

obj.func();

Trong đó obj là tên instance và func là tên hàm thành viên cần gọi.

Ví dụ cụ thể:

int main() {
MyClass obj; //Tạo instance tên obj từ MyClass
obj.func(); // gọi hàm thành viên

return 0;
}

Gọi hàm thành viên khi dùng new

Để gọi hàm thành viên trong class trong trường hợp dùng toán tử new, hãy sử dụng tới toán tử mũi tên để gọi hàm thành viên với cú pháp sau đây:

ptr->func();

Trong đó ptr là tên instance và func là tên hàm thành viên cần gọi.

Ví dụ cụ thể:

int main() {
MyClass *ptr = new MyClass; //Tạo instance tên ptr từ MyClass
ptr->func();// gọi hàm thành viên

return 0;
}

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về hàm hủy trong C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/cpp/lap-trinh-cpp-co-ban/huong-doi-tuong-trong-cpp/ham-thanh-vien-trong-cpp/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.