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.
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.
Hi toan.
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();
};
Hi toan.
Đâ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++
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
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.
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ề.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?