01/10/2018, 13:54

Con trỏ trỏ đến hàm khác với hàm trả về con trỏ thế nào vậy các bạn

Cho mình hỏi:

  • Khi nào mình dùng con trỏ trỏ đến hàm?
    VD: int (*A)(int a, int b)

  • Khi nào mình dùng hàm trả về 1 con trỏ?
    VD Node* CreateNode(int x)

Chúng khác nhau ở chỗ nào? Có minh họa để so sánh thì thật tuyệt.

Tao Không Ngu. viết 16:05 ngày 01/10/2018

Hi toan.

  1. Khi bạn cần tính đa hình thì dùng con trỏ hàm.
  2. Khi dữ liệu trả về được cấp phát động trong hàm.
  3. Hai cái đó không có gì giống nhau.
toan viết 16:05 ngày 01/10/2018

thank bạn
bạn ơi bạn có thể giải thích giúp mình cơ chế hoạt động của hàm trả về con trỏ k bạn
như ví dụ như

#include <iostream>
using namespace std;
 
class Singleton
{
private:
	static Singleton* m_instance;
	Singleton();
public:
	static Singleton* getInstance();
	void			method();
};
Tao Không Ngu. viết 15:56 ngày 01/10/2018

Hi toan.

  1. Tạo 1 con trỏ rồi trả về.
  2. Singleton.
Dark.Hades viết 16:09 ngày 01/10/2018

TL; DR

Đây sẽ là bài rep dài nhất lịch sử và không bao giờ lặp lại lần hai, cơ bản là mình đang quá rảnh nên sẽ reply giúp bạn những vấn đề bạn đang mắc phải với C++

1. Hàm và return

Trong toán học có f(x) tượng trưng cho sự biến thiên của hàm số f theo x.
Giả sử ta có hàm số
y = f(x) = ax + b (a, b thuộc R)
Để biểu diễn hàm số này trên C++ ta sẽ làm như sau (cho a=3, b=5)

  float f(float x)
  {
    float a = 3;
    float b = 5;
    return a * x + b;
  }
  float x;
  std::cin >> x;
  float y = f(x);

Đó là mục đích của return không hơn không kém

Còn nữa tại đây: https://github.com/Jam3/math-as-code/blob/master/README.md

2. Con trỏ hàm

Là một con trỏ giữ địa chỉ của hàm.
Trong C++, mọi thứ đều có địa chỉ, tất cả đều có thể quản lí được qua con trỏ.
Việc sử dụng con trỏ hàm thường dùng để callback, ngoài ra không hay được sử dụng khi viết code cá nhân, tuy nhiên nó có nhiều trong các library. Hầu như dùng lib nào cũng có mặt nó, nhưng nó ít được biểu diễn dưới dạng một biến số thực sự mà chỉ là parameter của hàm.
Sau khi ra mắt modern C++ thì con trỏ hàm ít được sử dụng mà thay vào đó là lambda và std::function với chức năng tương tự và có thể mix với nhau.

Có thể nói con trỏ hàm là một thứ tạo ra để giữ địa chỉ của hàm và gọi hàm đó, đi đêm vài ngày với nó là quen ngay.

3. Hàm con trỏ

Là hàm trả về một con trỏ/địa chỉ, không phải chỉ cấp phát động. Cứ là con trỏ là được. Nhớ là nó phải tồn trong suốt quá trình hàm được gọi

  int* pDoChangeValue(int* cObj)
  {
    int *c = &cObj;
    *c = 1000;
    return c;
  }
  int f = 1;
  pDoChangeValue(f);
  // F tồn tại trong suốt quá trình từ trước, trong, và sau khi hàm được gọi đến mãi mãi (đến khi hết scope biến)

Với cấp phát động:

  int* pDoMakePointer(int n)
  {
    int *c = new int[n];
    return c;
  }
  int n = 10;
  int *p = pDoMakePointer(n);
  // p tồn tại suốt quá trình từ sau khi cấp phát đến mãi mãi nếu không được lập trình viên/os thu hồi

Có thể thấy hàm con trỏ là thứ giúp ta quản lí một dữ liệu động, có thể mang vác đi mọi nơi, dữ liệu của nó cũng chính là biến mà hàm trả về.

Bài liên quan
0