Truyền một lớp cho một hàm C++

Sau khi một hàm được khai báo và định nghĩa, nó có thể được gọi từ bất kỳ đâu trong chương trình. từ bên trong hàm main, từ hàm khác và thậm chí từ chính nó. Gọi hàm liên quan đến việc chỉ định tên hàm, theo sau là toán tử gọi hàm và bất kỳ giá trị dữ liệu nào mà hàm muốn nhận. Các giá trị này là đối số cho các tham số được xác định cho hàm. Quá trình này được gọi là truyền đối số cho hàm

Bạn có thể truyền đối số cho các hàm được gọi theo ba cách.

  • , sao chép giá trị của một đối số vào tham số tương ứng trong hàm được gọi;
  • , chuyển đối số con trỏ tới tham số tương ứng trong hàm được gọi;
  • Truyền một lớp cho một hàm C++
    , chuyển tham chiếu của một đối số tới tham số tương ứng trong hàm được gọi.
    Truyền một lớp cho một hàm C++

Truyền một lớp cho một hàm C++
Nếu một lớp có một hàm hủy hoặc một hàm tạo bản sao thực hiện nhiều hơn một bản sao theo từng bit, thì việc truyền một đối tượng lớp theo giá trị sẽ dẫn đến việc xây dựng một đối tượng tạm thời thực sự được truyền bằng tham chiếu

Trình biên dịch tạo ra lỗi khi đối số hàm là đối tượng lớp và tất cả các điều kiện sau đều đúng

  • Lớp học cần một hàm tạo bản sao
  • Lớp không có hàm tạo bản sao do người dùng định nghĩa
  • Không thể tạo một hàm tạo bản sao cho lớp đó
Truyền một lớp cho một hàm C++

Truyền một lớp cho một hàm C++
Một lệnh gọi hàm luôn là một giá trị
Truyền một lớp cho một hàm C++

Truyền một lớp cho một hàm C++
Một lệnh gọi hàm thuộc về một trong các loại giá trị sau tùy thuộc vào loại kết quả của hàm
  • Một giá trị nếu loại kết quả là một loại tham chiếu giá trị lvalue
    Truyền một lớp cho một hàm C++
    hoặc một tham chiếu giá trị cho một loại hàm
    Truyền một lớp cho một hàm C++
  • Truyền một lớp cho một hàm C++
    Một xvalue nếu loại kết quả là một tham chiếu giá trị cho một loại đối tượng
    Truyền một lớp cho một hàm C++
  • A
    Truyền một lớp cho một hàm C++
    (prvalue)
    Truyền một lớp cho một hàm C++
    giá trị trong các trường hợp khác
Truyền một lớp cho một hàm C++

Một đối tượng có thể được truyền vào một hàm giống như chúng ta truyền một cấu trúc cho một hàm. chúng ta có thể truyền đối tượng của một lớp khác cho một hàm của một lớp khác. Chúng ta có thể chuyển các đối tượng của lớp làm đối số và trả về chúng từ một hàm

Khi chúng ta muốn khởi tạo tất cả các thành viên dữ liệu của một đối tượng với một đối tượng khác, chúng ta có thể truyền các đối tượng và gán các giá trị của một đối tượng được cung cấp cho đối tượng hiện tại. Đối với các dự án phức tạp hoặc lớn, chúng ta cần sử dụng các đối tượng làm đối số hoặc tham số. Vì vậy, đây là câu hỏi.  

Mục lục

Đối tượng là gì?

Một Đối tượng là một thể hiện của Lớp. Khi một lớp được định nghĩa, không có bộ nhớ nào được cấp phát nhưng khi nó được thể hiện thì có nghĩa là một đối tượng được tạo và bộ nhớ được cấp phát.  

Khai báo đối tượng. Khi một lớp được khởi tạo, chỉ đặc tả cho đối tượng được xác định; . Để sử dụng các hàm truy cập và dữ liệu được định nghĩa trong lớp, bạn cần tạo các đối tượng

cú pháp

ClassName Tên đối tượng;

một lớp học là gì?

Một lớp là một khuôn mẫu tương tự như một bản thiết kế liên kết các thuộc tính và chức năng của một thực thể. Bạn có thể gán tất cả các thực thể hoặc đối tượng có các thuộc tính tương tự dưới một mái nhà duy nhất, được gọi là một lớp. Chúng có thể triển khai thêm các khái niệm cốt lõi như đóng gói, ẩn dữ liệu và trừu tượng hóa. Trong C++, một lớp hoạt động như một kiểu dữ liệu có thể có các đối tượng hoặc các thể hiện khác nhau của kiểu lớp.  

  • Lớp là kiểu dữ liệu do người dùng định nghĩa có các thành viên dữ liệu và các hàm thành viên
  • Các thành viên dữ liệu bao gồm các biến dữ liệu và các hàm thành viên là các hàm được sử dụng để thao tác các biến này cùng nhau. Các thành viên dữ liệu này và các hàm thành viên xác định các thuộc tính và hành vi của các đối tượng trong một lớp.

Tạo một lớp gọi là “MyCycle”

class MyCycle {       
  public:             // Access specifier
    int myNum;        // Attribute (int variable)
    string myString;  // Attribute (string variable)
};

Để tạo một đối tượng của MyCycle, hãy chỉ định tên lớp và hành động theo tên đối tượng

Để truy cập các thuộc tính của lớp (myNumb và myString), hãy sử dụng cú pháp dấu chấm (. ) trên đối tượng

Ví dụ 1

Tạo một đối tượng có tên là “myObj” và truy cập các thuộc tính

class MyCycle {       
  public:             // Access specifier
    int myNumb;        // Attribute (int variable)
    string myString;  // Attribute (string variable)
};
int main() {
  MyCycle myObj;  // Create an object of MyCycle
  // Access attributes and set values
  myObj.myNumb = 15; 
  myObj.myString = "Random Info";
  // Print attribute values
  cout << myObj.myNumb << "\n";
  cout << myObj.myString;
  return 0;
}

đầu ra

15
Random Info

Truyền đối tượng làm đối số

Các đối tượng của một lớp có thể được truyền dưới dạng đối số cho các hàm thành viên cũng như các hàm không phải thành viên theo giá trị hoặc theo tham chiếu. chúng ta có thể truyền các đối tượng của lớp làm đối số và cũng có thể trả về chúng từ một hàm giống như cách chúng ta truyền và trả về các biến khác. Không có từ khóa đặc biệt hoặc tập tin tiêu đề được yêu cầu

Một bản sao của đối tượng thực được tạo bên trong hàm khi một đối tượng được truyền theo giá trị. Bản sao này bị hủy khi chức năng kết thúc. Ngoài ra, bất kỳ thay đổi nào được thực hiện đối với bản sao của đối tượng bên trong hàm đều không được phản ánh trong đối tượng thực tế

Mặt khác, chỉ một tham chiếu đến đối tượng đó (không phải toàn bộ đối tượng) được truyền cho hàm theo tham chiếu truyền qua. Do đó, những thay đổi được thực hiện đối với đối tượng trong hàm cũng được phản ánh trong đối tượng thực tế. Không có từ khóa đặc biệt hoặc tệp tiêu đề được yêu cầu để làm như vậy

Bất cứ khi nào một đối tượng của một lớp được chuyển đến một hàm thành viên của cùng một lớp, các thành viên dữ liệu của nó có thể được truy cập bên trong hàm bằng cách sử dụng tên đối tượng và toán tử dấu chấm. Tuy nhiên, các thành viên dữ liệu của đối tượng gọi có thể được truy cập trực tiếp bên trong hàm mà không cần sử dụng tên đối tượng và toán tử dấu chấm

Để chuyển một đối tượng làm đối số, chúng ta viết tên đối tượng làm đối số trong khi gọi hàm giống như cách chúng ta thực hiện đối với các biến khác

cú pháp.  

function_name(object_name);

Trả lại đối tượng làm đối số

Đối tượng trả về sẽ được lưu trữ trong một biến đối tượng khác

cú pháp

object = return object_name;

Ví dụ #2

#include 
using namespace std;
 
class Test{
public:
    int a;
 
    // This function will take
    // object as arguments and
    // return object
    Test add(Test Ta, Test Tb)
    {
        Test Tc;
        Tc.a = Ta.a + Tb.a;
 
        // returning the object
        return Tc;
    }
};
int main()
{
    Example T1, T2, T3;
 
    // Values are initialized
    // for both objects
    T1.a = 50;
    T2.a = 100;
    T3.a = 0;
 
    cout << "Initial Values \n";
    cout << "Value of object 1: " << T1.a
         << ", \nobject 2: " << T2.a
         << ", \nobject 3: " << T3.a
         << "\n";
 
    // Passing object as an argument
    // to function add()
    T3 = T3.add(T1, T2);
 
    // Changed values after
    // passing object as an argument
    cout << "New values \n";
    cout << "Value of object 1: " << T1.a
         << ", \nobject 2: " << T2.a
         << ", \nobject 3: " << T3.a
         << "\n";
 
    return 0;
}

đầu ra

Initial Values 
Value of object 1: 50, 
object 2: 100, 
object 3: 0
New values 
Value of object 1: 50, 
object 2: 100, 
object 3: 150

Trong ví dụ này, chúng ta có thể thấy cả hai điều đó là cách chúng ta có thể chuyển các đối tượng cũng như trả lại chúng. Khi đối tượng T3 gọi hàm add, nó chuyển hai đối tượng khác là T1 & T2 làm đối số. Bên trong hàm, một đối tượng khác được khai báo để tính tổng của cả ba biến và trả về T3.  


Đoạn mã này và đoạn mã trên gần như giống nhau, điểm khác biệt duy nhất là lần này hàm add trả về một đối tượng có giá trị được lưu trữ trong một đối tượng khác cùng lớp ‘Test’ T3. Ở đây, giá trị của T1 được hiển thị theo đối tượng1, giá trị của T2 theo đối tượng2 và giá trị của T3 theo đối tượng3

Chúng ta cũng có thể truyền một đối tượng làm đối số trong hàm thành viên của lớp. Điều này rất hữu ích, khi chúng ta muốn khởi tạo tất cả các thành viên dữ liệu của một đối tượng với một đối tượng khác, chúng ta có thể truyền đối tượng và gán giá trị của đối tượng được cung cấp cho đối tượng hiện tại

Đối với các dự án phức tạp hoặc lớn, chúng ta cần sử dụng các đối tượng làm đối số hoặc tham số

Ví dụ #3

#include 
using namespace std;

class Decide
{
	private:
	int a;
public:

	void set(int x)
	{
	a = x;
	}

		void sum(Demo ob1, Demo ob2)
		{
			a  = ob1.a + ob2.a;
		}
		void print()
		{
			cout<<"Value of A :  "<

đầu ra

________số 8_______

Làm cách nào để truyền đối tượng vào hàm?

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ó vào một hàm

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);
//Calling
X x;
fun(x);

Chuyển 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

class MyCycle {       
  public:             // Access specifier
    int myNumb;        // Attribute (int variable)
    string myString;  // Attribute (string variable)
};
int main() {
  MyCycle myObj;  // Create an object of MyCycle
  // Access attributes and set values
  myObj.myNumb = 15; 
  myObj.myString = "Random Info";
  // Print attribute values
  cout << myObj.myNumb << "\n";
  cout << myObj.myString;
  return 0;
}
0

Vượt qua tham chiếu const

Điều này chuyển 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

Tuyên ngôn

class MyCycle {       
  public:             // Access specifier
    int myNumb;        // Attribute (int variable)
    string myString;  // Attribute (string variable)
};
int main() {
  MyCycle myObj;  // Create an object of MyCycle
  // Access attributes and set values
  myObj.myNumb = 15; 
  myObj.myString = "Random Info";
  // Print attribute values
  cout << myObj.myNumb << "\n";
  cout << myObj.myString;
  return 0;
}
1

Chuyển 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 nào của đối tượng được tạo

Tuyên ngôn

class MyCycle {       
  public:             // Access specifier
    int myNumb;        // Attribute (int variable)
    string myString;  // Attribute (string variable)
};
int main() {
  MyCycle myObj;  // Create an object of MyCycle
  // Access attributes and set values
  myObj.myNumb = 15; 
  myObj.myString = "Random Info";
  // Print attribute values
  cout << myObj.myNumb << "\n";
  cout << myObj.myString;
  return 0;
}
2

Đi 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 nào của đối tượng được tạo

Tuyên ngôn

class MyCycle {       
  public:             // Access specifier
    int myNumb;        // Attribute (int variable)
    string myString;  // Attribute (string variable)
};
int main() {
  MyCycle myObj;  // Create an object of MyCycle
  // Access attributes and set values
  myObj.myNumb = 15; 
  myObj.myString = "Random Info";
  // Print attribute values
  cout << myObj.myNumb << "\n";
  cout << myObj.myString;
  return 0;
}
3

Bản tóm tắt

Bạn đã học về lớp và đối tượng, cách coi đối tượng là đối số của hàm. Không chỉ vậy , bạn còn học cách trả lại đối tượng sau khi chức năng kết thúc. Nó khá hữu ích để truyền các đối tượng thông qua chức năng, thay vì các thành viên riêng lẻ. Nhưng chi phí gửi bất kỳ đối tượng lớn nào cao khi bạn sao chép mã

Do đó, chúng ta đã thảo luận về nhiều phương pháp truyền toàn bộ đối tượng thông qua hàm với bộ nhớ tối thiểu. Trong các bài viết tiếp theo, chúng ta sẽ khám phá thêm về chủ đề này

Một lớp có thể là một tham số hàm không?

class là từ khóa chỉ được sử dụng* để giới thiệu các định nghĩa về lớp. Khi bạn khai báo các thể hiện của lớp mới dưới dạng đối tượng cục bộ hoặc dưới dạng tham số chức năng, bạn chỉ sử dụng tên của lớp (phải nằm trong phạm vi) chứ không phải chính từ khóa lớp.

Làm thế nào được chuyển đến một chức năng?

Truyền con trỏ tới hàm . by passing its address to that function; In simple terms, it could be achieved via pointers.

Các lớp có thể được truyền theo giá trị trong C++ không?

Mọi thứ được truyền theo giá trị trong C++ . Để chuyển thứ gì đó bằng cách tham chiếu, bạn cần chuyển nó bằng công cụ sửa đổi &.

Làm thế nào các đối tượng có thể được sử dụng làm đối số chức năng?

Đối tượng dưới dạng đối số hàm trong C++ . Khi một đối tượng được truyền theo giá trị, một bản sao của đối tượng thực được tạo bên trong hàm. Bản sao này bị hủy khi chức năng kết thúc. The objects of a class can be passed as arguments to member functions as well as nonmember functions either by value or by reference. When an object is passed by value, a copy of the actual object is created inside the function. This copy is destroyed when the function terminates.