Truyền đối tượng theo giá trị C++

Có bốn cách truyền đối tượng cho hàm. Giả sử bạn có một lớp X và muốn chuyển nó cho một hàm fun, sau đó

Vượt qua giá trị

Điều này tạo ra một bản sao nông cục bộ của đối tượng trong phạm vi chức năng. Những thứ bạn sửa đổi ở đây sẽ không được phản ánh trong đối tượng được truyền cho nó. Ví dụ,

Tuyên ngôn

void fun(X x);

gọi

X x;
fun(x);

Vượt qua tham chiếu

Điều này chuyển một tham chiếu đến đối tượng đến hàm. Những thứ bạn sửa đổi ở đây sẽ được phản ánh trong đối tượng được truyền cho nó. Không có bản sao nào của đối tượng được tạo. Ví dụ,

Tuyên ngôn

void fun(X &x);

gọi

X x;
fun(x);

Vượt qua tham chiếu const

Điều này chuyển một tham chiếu const đến đối tượng cho hàm. Bạn không thể trực tiếp sửa đổi/gán lại đối tượng ở đây (bạn có thể sử dụng các phương thức của nó để làm như vậy). Điều này hữu ích nếu bạn muốn chức năng chỉ có một bản sao chỉ đọc của đối tượng. Không có bản sao nào của đối tượng được tạo. Ví dụ,

Tuyên ngôn

void fun(X const *x);

gọi

X x;
fun(&x);

Vượt qua con trỏ const

Điều này chuyển một con trỏ const tới đối tượng cho hàm. Bạn không thể sửa đổi/gán lại con trỏ ở đây. Điều này hữu ích nếu bạn muốn hàm chỉ có địa chỉ của đối tượng này trong con trỏ. Không có bản sao của đối tượng được tạo ra. Ví dụ,

Tuyên ngôn

void fun(X *x);

gọi

X x;
fun(&x);

Vượt qua con trỏ

Điều này chuyển một con trỏ tới đối tượng tới hàm. Điều này tương tự như chuyển một tham chiếu đến đối tượng. Không có bản sao của đối tượng được tạo ra. Ví dụ,

Hôm nay chúng ta sẽ tìm hiểu về cách truyền đối tượng cho hàm bằng phương thức tham chiếu trong C++. Trong lập trình C++, nhiều khi chúng ta cần phản ánh sự thay đổi của các tham số thực tế. Vì vậy, ở đây chúng ta cần truyền một đối tượng theo tham chiếu. Nếu bạn muốn học cách làm điều đó, thì bạn đang ở đúng nơi. Sau đây chúng ta sẽ xem các chương trình mẫu. Ở đây, trong hướng dẫn này, chúng ta sẽ phân biệt giữa truyền theo giá trị và theo tham chiếu. Và cuối cùng, bạn sẽ nhận ra tầm quan trọng của việc chuyển qua tham chiếu trong lập trình C++

Biến tham chiếu trong C++

Biến tham chiếu là bí danh của một biến khác đã được xác định trước đó. Khi bạn xác định một biến tham chiếu cho một biến đã tồn tại, bạn có thể sử dụng cả hai tên. Tên biến đề cập đến một khối bộ nhớ trong đó dữ liệu được lưu trữ. Xác định một biến tham chiếu đặt tên khác cho cùng một khối bộ nhớ

________số 8_______

Trong đoạn mã này, cả biến i. e. a và b sẽ tạo ra cùng một giá trị. Trong trường hợp này, chỉ có một biến số nguyên có hai tên khác nhau là a và b

Chuyển qua tham chiếu trong C++

Truyền theo phương thức tham chiếu trong C++, hàm tạo một tham chiếu của các tham số thực tế. Những thay đổi được thực hiện đối với các tham số chính thức cũng được phản ánh trong các giá trị tham số thực tế. Trong cuộc gọi theo phương thức tham chiếu, nguyên mẫu hàm sẽ giống như –

return_type function_name(data_type &arg1,data_type &arg2,data_type &argn);

Do đó, trong quá trình chuyển qua tham chiếu, một tên bí danh được đặt cho các tham số thực tế. Cuộc gọi theo phương thức tham chiếu rất hữu ích nếu bạn cần phản ánh những thay đổi được thực hiện bởi một hàm. Bạn có thể sử dụng câu lệnh return nếu hàm thực hiện thay đổi trong chính xác một tham số. Nhưng nếu nhiều tham số bị ảnh hưởng thì gọi theo tham chiếu sẽ hữu ích

Chương trình C++ để chuyển qua tham chiếu

Bây giờ, chúng ta sẽ xem một chương trình trong C++ để minh họa việc truyền các đối tượng bằng cách tham chiếu đến một hàm. Vì vậy, để minh họa điều này, chúng ta sẽ học một lớp C++ có tên là Tourist

#include
using namespace std;
class Tourist
{
  int id;
  char name[30];
  float amount;

  public:
  void get_input(void);
  friend void modify(Tourist&,float);
  void display(void);
};
void Tourist::get_input()
{
  cout<<"ENTER TOURIST ID : ";
  cin>>id;
  cout<<"ENTER NAME : ";
  cin>>name;
  cout<<"ENTER AMOUNT PAID : ";
  cin>>amount;
}
void Tourist::display()
{
  cout<<"\nTOURIST ID : "<>amt;
  modify(t1,amt);
  cout<<"\n\n\n--AFTER MODIFICATION--";
  t1.display();
}

Trong chương trình trên, chúng ta đã tạo một lớp Tourist có các biến id, name và số tiền mà một khách du lịch đã trả. Sử dụng hàm get_input() chúng ta lấy đầu vào về thông tin du lịch từ người dùng. Hàm display() hiển thị thông tin chi tiết của một khách du lịch. Ngoài các chức năng này, chúng tôi đã thực hiện chức năng sửa đổi () như một người bạn của lớp Du lịch

Hàm friend không thể truy cập trực tiếp các biến của đối tượng lớp. Vì vậy, chúng ta cần truyền đối tượng lớp làm tham số cho hàm. Sự vượt qua này có thể có hai loại -

  • Vượt qua giá trị
  • Chuyển qua tham chiếu

Ở đây, trong chương trình này, chúng tôi đã sử dụng pass theo phương thức tham chiếu

Đầu ra của chương trình C++

Đầu ra của chương trình trên là -

[email protected]:~/cpp$ g++ pass.cpp
[email protected]:~/cpp$ ./a.out
ENTER TOURIST ID : 11
ENTER NAME : siddharth
ENTER AMOUNT PAID : 1900


--BEFORE MODIFICATION--
TOURIST ID : 11
TOURIST NAME : siddharth
AMOUNT PAID : 1900

  ENTER THE NEW AMOUNT : 2100
  NEW AMOUNT FOR TOURIST 11 IS : 2100


--AFTER MODIFICATION--
TOURIST ID : 11
TOURIST NAME : siddharth
AMOUNT PAID : 2100
[email protected]:~/cpp$

Vì vậy, ở đầu ra, số tiền trước khi sửa đổi là 1900. Sau đó, chúng tôi gọi hàm sửa đổi () bằng cách gọi theo phương thức tham chiếu. Do đó, việc sửa đổi cũng phản ánh trong tham số thực tế. Trong hàm main(), số tiền trả sau khi gọi hàm modify() là 2100. Vì vậy, giá trị của đối tượng bị thay đổi bởi hàm modify() do chuyển qua tham chiếu

Tầm quan trọng của việc truyền theo phương thức tham chiếu trong C++

Trong phương thức truyền giá trị, chúng ta tạo một đối tượng mới có phạm vi chỉ giới hạn ở hàm. Các thay đổi được thực hiện với đối tượng tạm thời này. Nhưng đối tượng thực tế vẫn giữ nguyên. Nguyên mẫu hàm modify() sử dụng phương thức gọi theo giá trị sẽ là –

vô hiệu sửa đổi (Khách du lịch t, ​​float new_amt);

Ở đây, bất kỳ thay đổi nào được thực hiện, nó sẽ xảy ra với đối tượng cục bộ 't'

Có sự khác biệt lớn về đầu ra khi sử dụng gọi theo giá trị và gọi theo tham chiếu –

Đầu ra trong cuộc gọi theo phương thức giá trị –

[email protected]:~/cpp$ g++ pass1.cpp
[email protected]:~/cpp$ ./a.out
ENTER TOURIST ID : 11
ENTER NAME : siddharth
ENTER AMOUNT PAID : 1900


--BEFORE MODIFICATION--
TOURIST ID : 11
TOURIST NAME : siddharth
AMOUNT PAID : 1900

  ENTER THE NEW AMOUNT : 2100
  NEW AMOUNT FOR TOURIST 11 IS : 2100


--AFTER MODIFICATION--
TOURIST ID : 11
TOURIST NAME : siddharth
AMOUNT PAID : 1900
[email protected]:~/cpp$

Bạn có thể thấy rằng số tiền sau khi sửa đổi không thay đổi. Bây giờ vẫn là năm 1900 và không có thay đổi nào xảy ra

Đầu ra trong cuộc gọi theo phương thức tham chiếu –

[email protected]:~/cpp$ g++ pass.cpp
[email protected]:~/cpp$ ./a.out
ENTER TOURIST ID : 11
ENTER NAME : siddharth
ENTER AMOUNT PAID : 1900


--BEFORE MODIFICATION--
TOURIST ID : 11
TOURIST NAME : siddharth
AMOUNT PAID : 1900

  ENTER THE NEW AMOUNT : 2100
  NEW AMOUNT FOR TOURIST 11 IS : 2100


--AFTER MODIFICATION--
TOURIST ID : 11
TOURIST NAME : siddharth
AMOUNT PAID : 2100
[email protected]:~/cpp$

Vì vậy, bạn có thể thấy sự khác biệt. Trong cuộc gọi theo phương thức tham chiếu, giá trị của số tiền thay đổi. Sau khi sửa đổi, nó đang hiển thị 2100. Vì vậy, những thay đổi được thực hiện trong hàm modify() cũng phản ánh trong đối tượng thực tế

Bạn có thể chuyển các đối tượng theo giá trị không?

Giá trị của một đối tượng có thể thay đổi có thể được thay đổi khi nó được truyền vào một phương thức. Không thể thay đổi giá trị của đối tượng bất biến, ngay cả khi nó được truyền một giá trị mới. “Truyền theo giá trị” có nghĩa là chuyển một bản sao của giá trị . "Truyền theo tham chiếu" đề cập đến việc chuyển tham chiếu thực của biến trong bộ nhớ.

Các đối tượng có được truyền theo giá trị hoặc theo tham chiếu trong C++ không?

C++ làm cho cả mô hình truyền theo giá trị và truyền theo tham chiếu có thể thực hiện được . Bạn có thể tìm thấy hai cách sử dụng ví dụ bên dưới. Mảng là cấu trúc đặc biệt, khi bạn truyền một mảng dưới dạng tham số, một con trỏ tới địa chỉ của phần tử đầu tiên được truyền dưới dạng giá trị với loại phần tử trong mảng.

C có sử dụng pass by value không?

C luôn sử dụng 'truyền theo giá trị' để truyền đối số cho hàm (một thuật ngữ khác là 'gọi theo giá trị', có nghĩa giống như vậy), có nghĩa là mã trong một .

Các đối tượng có được truyền theo tham chiếu hoặc giá trị không?

Về mặt kỹ thuật, Java luôn truyền theo giá trị, bởi vì mặc dù một biến có thể chứa tham chiếu đến một đối tượng, nhưng tham chiếu đối tượng đó là một giá trị biểu thị vị trí của đối tượng trong bộ nhớ. Do đó, các tham chiếu đối tượng được truyền theo giá trị. Cả kiểu dữ liệu tham chiếu và kiểu dữ liệu nguyên thủy đều được truyền theo giá trị