Call by Value
Call by value is the default parameter passing mechanism in C++. When you pass a parameter by value, a copy of the argument's value is created and passed to the function. Any modifications made to the parameter inside the function do not affect the original argument.
Here's a simple example to illustrate call by value:
cpp#include <iostream>
// Function that increments an integer by 1 using call by value
void incrementByValue(int num) {
num++;
std::cout << "Inside function: " << num << std::endl;
}
int main() {
int num = 5;
std::cout << "Before function call: " << num << std::endl;
incrementByValue(num);
std::cout << "After function call: " << num << std::endl;
return 0;
}
Output:
cppBefore function call: 5
Inside function: 6
After function call: 5
In this example, the incrementByValue
function takes an integer num
by value. When we call the function with num
, it creates a copy of num
(let's call it num_copy
) and increments num_copy
by 1. Inside the function, num_copy
becomes 6, but the original num
remains unchanged, showing that call by value does not modify the original argument.
Call by Reference
Call by reference, on the other hand, allows a function to directly access and modify the original data by passing a reference or pointer to the argument. This mechanism can be more memory-efficient and is often used when you want to modify the original data within a function.
Here's an example demonstrating call by reference using references:
cpp#include <iostream>
// Function that increments an integer by 1 using call by reference
void incrementByReference(int &num) {
num++;
std::cout << "Inside function: " << num << std::endl;
}
int main() {
int num = 5;
std::cout << "Before function call: " << num << std::endl;
incrementByReference(num);
std::cout << "After function call: " << num << std::endl;
return 0;
}
Output:
cppBefore function call: 5
Inside function: 6
After function call: 6
In this example, the incrementByReference
function takes an integer num
by reference using the &
symbol. When we call the function with num
, any modifications made to num
inside the function directly affect the original num
. As a result, the value of num
is incremented to 6, and this change persists outside the function.
When to Use Each Mechanism
Choosing between call by value and call by reference depends on your specific needs:
Use call by value when you want to work with a local copy of the argument, ensuring that modifications inside the function do not affect the original data.
Use call by reference when you need to modify the original data within a function or when dealing with large data structures to avoid the overhead of copying data.
Understanding these parameter passing mechanisms is crucial for effective C++ programming. By choosing the appropriate mechanism, you can optimize your code for both performance and clarity.
Using Class :
let's explore the difference between call by value and call by reference using C++ classes. We'll create a simple class to demonstrate these concepts.
cpp#include <iostream>
// A simple class representing a person
class Person {
public:
Person(std::string name, int age) : name(name), age(age) {}
// Function to print person's information by value
void printByValue() {
std::cout << "Call by Value - Original Values: " << name << " (" << age << " years old)" << std::endl;
name = "Alice";
age = 30;
std::cout << "Call by Value - Modified Values: " << name << " (" << age << " years old)" << std::endl;
}
// Function to print person's information by reference
void printByReference() {
std::cout << "Call by Reference - Original Values: " << name << " (" << age << " years old)" << std::endl;
name = "Bob";
age = 25;
std::cout << "Call by Reference - Modified Values: " << name << " (" << age << " years old)" << std::endl;
}
private:
std::string name;
int age;
};
int main() {
Person person("John", 35);
std::cout << "Original Values: " << person.getName() << " (" << person.getAge() << " years old)" << std::endl;
person.printByValue();
std::cout << "After Call by Value: " << person.getName() << " (" << person.getAge() << " years old)" << std::endl;
person.printByReference();
std::cout << "After Call by Reference: " << person.getName() << " (" << person.getAge() << " years old)" << std::endl;
return 0;
}
In this example, we have a Person
class with a name and an age as private members. We define two member functions, printByValue
and printByReference
, to demonstrate call by value and call by reference, respectively.
printByValue
takes thePerson
object by value, modifies its internal data, and prints the changes. However, notice that the changes do not persist outside the function because the object was passed by value.printByReference
takes thePerson
object by reference and modifies its internal data. As a result, the changes are reflected in the original object outside the function.
When you run the code, you'll see the difference between the two mechanisms in action, showcasing how call by value and call by reference behave when using a class in C++.