Con trỏ hàm thành viên C++

Con Tro Ham Thanh Vien C



Trong C++, con trỏ hàm thành viên hỗ trợ việc tham chiếu các hàm thành viên trong một lớp. Chúng cung cấp một cách để lưu và gọi một hàm thành viên trên một thể hiện của một lớp, góp phần linh hoạt và mở rộng trong nhiều tình huống khác nhau. Một cách sử dụng phổ biến của các con trỏ hàm thành viên là khi các hành vi riêng biệt phải được kích hoạt dựa trên các điều kiện thời gian chạy. Một ứng dụng có thể tự động chọn và gọi hành vi phù hợp bằng cách sử dụng con trỏ tới các hàm thành viên. Ngoài ra, con trỏ hàm thành viên rất hữu ích trong các tình huống yêu cầu tách các thành phần hệ thống.

Ví dụ 1:

Chúng tôi bao gồm tệp tiêu đề “iostream” để giúp bạn dễ dàng sử dụng các chức năng đã xác định. Sau đó, chúng ta có “không gian tên std”. Bên dưới lớp này, chúng tôi tạo ra lớp có tên “MyNewClass” và sử dụng hàm tạo “công khai”.

Trong “public”, chúng ta tạo hàm thành viên có tên “myFunc” và khai báo “int num” là tham số của “myFunc()”. Bên dưới phần này, chúng ta sử dụng “cout” và gọi phương thức main() bên dưới phương thức này để tạo con trỏ hàm thành viên. Chúng ta khai báo con trỏ “MyFuncPtr” tới kiểu hàm thành viên, chỉ định lớp “MyNewClass” và kiểu tham số (int).







Sau đó, chúng ta tạo đối tượng lớp có tên là “Class_obj” và sau đó gọi hàm thành viên với sự trợ giúp của con trỏ “*MyFuncPtr” bằng cách đặt đối tượng lớp bằng cái này. Chúng ta gán “10” làm tham số để hiển thị giá trị này khi gọi con trỏ hàm thành viên.



Mã 1:

#include

sử dụng không gian tên std ;

lớp MyNewClass {

công cộng :

trống rỗng myFunc ( int trên một ) {

cout << 'Giá trị là' << trên một << kết thúc ;

}

} ;

int chủ yếu ( ) {

trống rỗng ( Lớp mới của tôi ::* MyFuncPtr ) ( int ) = & Lớp mới của tôi :: myFunc ;

Lớp mới của tôi_obj ;

( Lớp_obj. * MyFuncPtr ) ( 10 ) ;

trở lại 0 ;

}

Đầu ra:



Điều này minh họa cách hoạt động của con trỏ hàm thành viên. Con trỏ hàm thành viên có thể được sử dụng để khởi chạy các hàm thành viên một cách linh hoạt theo các điều kiện hiện tại.





Ví dụ 2:

Để sử dụng các hàm được xác định trong tệp tiêu đề “iostream” một cách đơn giản, chúng tôi đưa “iostream” vào đây. “Không gian tên std” được đặt tiếp theo. Bên dưới nó, chúng ta tạo lớp “Test” và sau đó sử dụng hàm tạo “public”. Chúng tôi xác định hàm thành viên ” myTestingFunc ” trong “public” và đặt “int t_value” làm tham số cho ” myTestingFunc()” trong trường hợp này. Hàm “cout” được sử dụng bên dưới và phương thức main() được gọi. Sau đó, chúng ta tạo con trỏ hàm thành viên.



Chúng tôi chỉ định lớp “Test” và con trỏ hàm thành viên “*MyTestFuncPtr” tại đây. Chúng ta gán “&Test::myTestingFunc” cho con trỏ hàm thành viên được khai báo là “void (Test::*MyTestFuncPtr)(int)”.

Tiếp theo, chúng ta tạo đối tượng lớp “t_obj” và sử dụng đối tượng này để gọi hàm thành viên bằng cách đặt đối tượng lớp và sử dụng con trỏ “*MyTestFuncPtr”. Để điều này được trình bày khi chúng ta gọi con trỏ hàm thành viên, chúng ta gán “932” làm tham số.

Mã 2:

#include

sử dụng không gian tên std ;

kiểm tra lớp {

công cộng :

trống rỗng myTestingFunc ( int giá trị t ) {

cout << 'Giá trị thử nghiệm là' << giá trị t << kết thúc ;

}

} ;

int chủ yếu ( ) {

trống rỗng ( Bài kiểm tra ::* MyTestFuncPtr ) ( int ) = & Bài kiểm tra :: myTestingFunc ;

Kiểm tra t_obj ;

( t_obj. * MyTestFuncPtr ) ( 932 ) ;

trở lại 0 ;

}

Đầu ra:

Kết quả của mã đã cho được hiển thị. Chúng ta có thể thấy rằng chúng ta đã gọi “con trỏ hàm thành viên” với đối tượng lớp như được hiển thị ở đây.

Ví dụ 3:

Lớp mà chúng tôi tạo trong mã này là “MyNewCar”, nơi chúng tôi sử dụng hàm tạo “công khai” và tạo hàm thành viên trong đó là “startCarEngine()”. Trong hàm này, chúng ta thêm “cout” để hiển thị khi chúng ta gọi hàm này trong mã của mình. Sau đó, chúng ta tạo một hàm thành viên khác là “stopCarEngine()” và sử dụng lại “cout” trong hàm thành viên này.

Sau đó, chúng ta gọi hàm main() và khai báo con trỏ hàm thành viên là “MyNewCar::*carEngineFunc()”. Bên dưới này, chúng ta tạo đối tượng lớp “MyNewCar” với tên “myCar_obj”. Sau đó, chúng tôi gán hàm “startCarEngine” cho con trỏ “carEngineFunc”. Bên dưới phần này, chúng tôi gọi hàm này với sự trợ giúp của con trỏ “carEngineFunc” bằng cách đặt tên đối tượng vào đó.

Tiếp theo, chúng ta gán lại hàm “stopCarEngine” cho con trỏ “carEngineFunc”. Bên dưới đó, chúng tôi gọi hàm này bằng cách chuyển tên đối tượng cùng với tham chiếu “carEngineFunc”.

Mã 3:

#include

sử dụng không gian tên std ;

lớp MyNewCar {

công cộng :

trống rỗng bắt đầuCarEngine ( ) {

cout << 'Động cơ xe khởi động' << kết thúc ;

}

trống rỗng dừngXeĐộng Cơ ( ) {

cout << 'Động cơ xe dừng lại' << kết thúc ;

}

} ;

int chủ yếu ( ) {

trống rỗng ( Xe Mới Của Tôi ::* chức năng xe hơi ) ( ) ;

MyNewCar myCar_obj ;

chức năng xe hơi = & Xe Mới Của Tôi :: bắt đầuCarEngine ;

( myCar_obj. * chức năng xe hơi ) ( ) ;

chức năng xe hơi = & Xe Mới Của Tôi :: dừngXeĐộng Cơ ;

( myCar_obj. * chức năng xe hơi ) ( ) ;

trở lại 0 ;

}

Đầu ra:

Ở đây, hoạt động của “con trỏ hàm thành viên” được hiển thị. Chúng ta có thể thấy rằng chúng ta đã tạo con trỏ hàm thành viên và hiển thị kết quả ở đây.

Ví dụ 4:

Sau khi bao gồm tệp tiêu đề và “không gian tên std”, chúng tôi khai báo lớp “MyNewStudent” tại đây. Hàm thành viên “studentPass()” là một trong những hàm thành viên mà chúng tôi xây dựng cho lớp “MyStudentClass” mà chúng tôi tạo ở đây. Chúng tôi cũng thêm “cout” vào hàm này, hàm này sẽ hiển thị khi chúng tôi gọi nó trong mã của mình.

Tiếp theo, chúng ta viết hàm thành viên “studentFail()” trong đó chúng ta sử dụng “cout” một lần nữa. Sau đó, hàm main() được gọi và con trỏ hàm thành viên “(MyNewStudent::*studentResultFunc)()” được khai báo. Bên dưới đó, chúng ta tạo đối tượng ” myStd_obj ” thuộc lớp “MyNewStudent”.

Tiếp theo, chúng ta gán hàm “studentPass” cho con trỏ “studentResultFunc”. Bên dưới đó, chúng ta gọi hàm này bằng cách chuyển tên đối tượng cùng với tham chiếu “studentResultFunc”. Hàm “studentFail” được gán lại cho con trỏ “studentResultFunc”. Bên dưới đó, chúng tôi gọi phương thức này bằng cách cung cấp tham chiếu “carEngineFunc” và tên đối tượng.

Bây giờ, cả hai hàm đều được gọi ở đây và các câu lệnh mà chúng tôi đưa vào các hàm này sẽ được hiển thị.

Mã 4:

#include

sử dụng không gian tên std ;

lớp MyNewStudent {

công cộng :

trống rỗng học sinh đỗ ( ) {

cout << 'Thẻ sinh viên' << kết thúc ;

}

trống rỗng sinh viênThất bại ( ) {

cout << “Học sinh thất bại” << kết thúc ;

}

} ;

int chủ yếu ( ) {

trống rỗng ( MyNewStudent ::* sinh viênKết quảFunc ) ( ) ;

MyNewStudent myStd_obj ;

sinh viênKết quảFunc = & MyNewStudent :: học sinh đỗ ;

( myStd_obj. * sinh viênKết quảFunc ) ( ) ;

sinh viênKết quảFunc = & MyNewStudent :: sinh viênThất bại ;

( myStd_obj. * sinh viênKết quảFunc ) ( ) ;

trở lại 0 ;

}

Đầu ra:

Chúng tôi đã tạo các hàm thành viên trong mã của mình và sau đó là con trỏ hàm thành viên. Sau đó, chúng ta gọi hàm thành viên và hiển thị kết quả ở đây.

Ví dụ 5:

“SampleClass” được tạo trong trường hợp này. Sau đó, con trỏ hàm thành viên được đặt ở đây là “(SampleClass::*MyFunc)()”. Bên dưới phần này, chúng ta tạo con trỏ hàm là “(*MyFuncPtr)()”. Bên dưới nó, chúng ta khai báo “name” của biến “string” cũng như con trỏ hàm thành viên “MyFunc f”.

Sau đó, chúng ta có hàm tạo “công khai” nơi chúng ta xác định biến hàm thành viên này. Bên dưới điều này, chúng ta tạo các hàm thành viên có tên là “myFunc_1()” và “myFunc_1()” đồng thời thêm “cout” vào mỗi hàm thành viên sẽ hiển thị khi chúng ta gọi hàm thành viên này.

Sau đó, chúng ta gọi con trỏ hàm thành viên này với sự trợ giúp của “(this->*f)()”. Sau đó, chúng ta đặt lại các hàm. Ở đây, chúng tôi thay đổi câu lệnh “cout” mà chúng tôi đã thêm trước đó. Sau đó, “main()” hiện được gọi và con trỏ hàm thành viên được định nghĩa là “MyFunc f = &SampleClass::myFunc_2”.

Sau đó, con trỏ hàm cũng được định nghĩa là “MyFuncPtr fp = myFunc_1”. Sau đó, chúng ta gõ “(a.*f)()” để sử dụng con trỏ hàm thành viên. “b.func” được đặt để sử dụng chức năng thành viên. Sau đó, chúng ta đặt “fp()” để gọi con trỏ hàm.

Mã 5:

#include

sử dụng không gian tên std ;

lớp MẫuLớp ;

typedef trống rỗng ( Lớp mẫu ::* MyFunc ) ( ) ;

typedef trống rỗng ( * MyFuncPtr ) ( ) ;

lớp MẫuLớp {

tên chuỗi ;

MyFunc f ;

công cộng :

Lớp mẫu ( hằng số ký tự * tên )

: tên ( tên ) ,

f ( & Lớp mẫu :: myFunc_1 )

{ }

trống rỗng myFunc_1 ( ) { cout << tên << 'Chúng tôi gọi chức năng 1 ở đây' << kết thúc ; }

trống rỗng myFunc_2 ( ) { cout << tên << 'Chúng tôi đã gọi chức năng 2 ở đây' << kết thúc ; }

trống rỗng vui vẻ ( ) {

( cái này ->* f ) ( ) ;

}

} ;

trống rỗng myFunc_1 ( ) { cout << 'Chức năng đầu tiên' << kết thúc ; }

trống rỗng myFunc_2 ( ) { cout << 'Chức năng thứ hai' << kết thúc ; }

int chủ yếu ( )

{

MyFunc f = & Lớp mẫu :: myFunc_2 ;

MyFuncPtr fp = myFunc_1 ;

MẫuLớp a ( 'Đầu tiên - ' ) , b ( 'thứ hai - ' ) ;

( Một. * f ) ( ) ;

b. vui vẻ ( ) ;

fp ( ) ;

}

Đầu ra:

Kết quả của mã hiện được hiển thị ở đây, kết quả này sẽ hiển thị kết quả tương ứng khi chúng ta gọi các hàm trong mã của mình.

Phần kết luận

Chúng tôi đã khám phá rằng “con trỏ hàm thành viên” trong C++ giúp dễ dàng liên kết động, đóng gói hành vi và xử lý linh hoạt việc gọi hàm trong ngữ cảnh của OOP. Chúng tôi đã biết rằng việc sử dụng “con trỏ hàm thành viên” có thể cải thiện đáng kể tính mô-đun và tính linh hoạt của cơ sở mã C++, cung cấp một công cụ mạnh mẽ để giải quyết nhiều thách thức về thiết kế và thời gian chạy.