0% found this document useful (0 votes)
2 views15 pages

C++ Notes

c++ intruduction and basics

Uploaded by

sharmadhruv7416
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views15 pages

C++ Notes

c++ intruduction and basics

Uploaded by

sharmadhruv7416
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 15

Certainly!

Function overloading in C++ is a feature that allows you to


define multiple functions with the same name but different parameters.
It’s a way to perform different tasks with the same function name,
depending on the type or number of arguments passed.

Here’s a step-by-step guide to understanding function overloading:

### 1. **What is Function Overloading?**

Function overloading allows you to use the same function name for
different functions as long as they have different parameter lists. It helps
make your code more readable and organized.

### 2. **Basic Concept**

To overload a function, you define multiple functions with the same name
but with different signatures. A function signature is the combination of
the function’s name and its parameter list.

### 3. **Function Signature**

A function signature consists of:

- The function name

- The number of parameters

- The type of each parameter

**Note**: The return type is not part of the function signature for
overloading. Therefore, you cannot overload functions solely based on
different return types.

### 4. **Examples of Overloading**


Let’s see some basic examples:

```cpp

#include <iostream>

// Function to add two integers

int add(int a, int b) {

return a + b;

// Function to add three integers

int add(int a, int b, int c) {

return a + b + c;

// Function to add two doubles

double add(double a, double b) {

return a + b;

int main() {

std::cout << "Add 2 and 3: " << add(2, 3) << std::endl;

std::cout << "Add 2, 3, and 4: " << add(2, 3, 4) << std::endl;

std::cout << "Add 2.5 and 3.5: " << add(2.5, 3.5) << std::endl;

return 0;

```
In this example:

- `add(int a, int b)` adds two integers.

- `add(int a, int b, int c)` adds three integers.

- `add(double a, double b)` adds two doubles.

### 5. **How the Compiler Chooses the Correct Function**

When you call an overloaded function, the compiler looks at the


arguments you provide and matches them to the function signatures
available. This process is called **function resolution** or **function
matching**.

### 6. **Rules for Overloading**

- **Different Parameter Types**: Functions with different types of


parameters can be overloaded.

```cpp

void print(int i);

void print(double d);

```

- **Different Number of Parameters**: Functions with a different number of


parameters can be overloaded.

```cpp

void display(int i);

void display(int i, int j);

```

- **Same Parameter Types but Different Order**: You can overload


functions with parameters of the same types but in a different order.

```cpp
void show(int i, double d);

void show(double d, int i);

```

### 7. **Overloading Constraints**

- **Same Number and Types but Different Return Type**: You cannot
overload functions based on return type alone.

```cpp

// This will result in a compile error

int getValue();

double getValue(); // Error: function signatures are the same

```

- **Default Arguments**: Using default arguments can affect function


overloading. The default arguments may lead to ambiguities.

```cpp

void print(int i = 0);

void print(double d);

```

### 8. **Conclusion**

Function overloading is a powerful feature that helps in creating functions


that perform similar tasks but with different types or numbers of
arguments. It increases code readability and maintainability by avoiding
the need for multiple function names for similar operations.

Feel free to experiment with different overloaded functions to get a better


understanding. If you have any specific questions or need further
clarification, let me know!
Absolutely! Let’s dive into **constant arguments** and **default
arguments** in C++ with a step-by-step approach.

### 1. **Constant Arguments**


**Constant arguments** are parameters that you don’t want to change
within a function. They are marked with the `const` keyword, which
ensures that their values cannot be altered by the function. This is useful
for protecting data and improving function performance.

#### **Why Use Constant Arguments?**

- **Protection**: Ensures that the function does not modify the argument.

- **Optimization**: Allows the compiler to optimize function calls knowing


that the argument won't change.

#### **Example of Constant Arguments**

Let’s see how you can use constant arguments:

```cpp

#include <iostream>

void printValue(const int value) {

// value is constant within this function

std::cout << "Value: " << value << std::endl;

// value = 10; // This will cause a compile-time error because value is


const

int main() {

int num = 5;

printValue(num); // Passing a variable to a function expecting a const


argument
return 0;

```

In this example:

- `printValue` accepts an argument `value` that is constant.

- Inside `printValue`, you cannot modify `value`, ensuring that the


function only reads from it.

#### **Constant References**

When passing large objects like strings or vectors, you often pass them by
reference to avoid copying, and you can make these references constant
to prevent modification:

```cpp

#include <iostream>

#include <vector>

void printVector(const std::vector<int>& vec) {

for (int num : vec) {

std::cout << num << " ";

std::cout << std::endl;

// vec.push_back(1); // Error: can't modify a const reference

int main() {

std::vector<int> numbers = {1, 2, 3, 4};

printVector(numbers);
return 0;

```

In this case, `vec` is a constant reference to a `std::vector<int>`,


meaning the function `printVector` can read the vector but cannot modify
it.

### 2. **Default Arguments**

**Default arguments** allow you to call a function without specifying all


the arguments. If you don’t provide a value for an argument, the function
uses a predefined default value.

#### **Why Use Default Arguments?**

- **Simplifies Function Calls**: Makes it easier to call functions when some


parameters have common default values.

- **Code Reusability**: Reduces the need for multiple overloaded


functions.

#### **How to Use Default Arguments**

You specify default values in the function declaration. Here’s how:

```cpp

#include <iostream>

// Function with default arguments

void greet(const std::string& name = "Guest", int age = 18) {


std::cout << "Hello, " << name << ". You are " << age << " years
old." << std::endl;

int main() {

greet(); // Uses both default arguments

greet("Alice"); // Uses default age

greet("Bob", 25); // Uses no default arguments

return 0;

```

In this example:

- `greet` has default values for both `name` and `age`.

- When you call `greet()` without arguments, it uses `"Guest"` and `18`
as defaults.

- You can also call `greet("Alice")` to override just the `name`, or


`greet("Bob", 25)` to provide both arguments.

#### **Rules for Default Arguments**

1. **Default Arguments Must Be Trailing**: Default arguments must


appear at the end of the parameter list. You cannot have a non-default
argument following a default argument.

```cpp

// Correct

void foo(int a, int b = 5);

// Incorrect

void foo(int a = 1, int b);


```

2. **Default Values in Function Declaration Only**: Default values should


be provided only in the function declaration (not in the definition) to avoid
ambiguity.

```cpp

void foo(int a, int b = 5); // Declaration with default argument

void foo(int a, int b) { /* Definition */ } // Definition without default


arguments

```

### 3. **Combining Constant and Default Arguments**

You can combine constant and default arguments in a single function:

```cpp

#include <iostream>

void printMessage(const std::string& message = "Default message") {

std::cout << message << std::endl;

int main() {

printMessage(); // Uses default message

printMessage("Custom message"); // Uses provided message

return 0;

```
In this case:

- `message` is a constant reference with a default value.

### 4. **Conclusion**

- **Constant Arguments**: Used to ensure that the values of the


arguments cannot be modified within the function.

- **Default Arguments**: Allow functions to be called with fewer


arguments by providing default values for some parameters.

Both features enhance the flexibility and robustness of your functions,


making your code easier to maintain and use. If you have any more
questions or need further examples, feel free to ask!

Sure! Let's explore **inline functions** and **friend functions** in C++


with detailed explanations and examples.

### Inline Functions

**Inline functions** are a way to suggest to the compiler that it should


attempt to embed the function's code directly into the calling code, rather
than generating a separate function call. This can potentially reduce
function call overhead and improve performance, especially for small and
frequently called functions.

#### How Inline Functions Work

- **Definition**: You use the `inline` keyword before the function


definition.

- **Purpose**: Inline functions are typically used for small, frequently


called functions where the overhead of a function call would be relatively
high compared to the cost of executing the function's code.
- **Compilation**: The compiler decides whether or not to actually inline
the function. The `inline` keyword is a suggestion, not a command.

#### Example of Inline Function

```cpp

#include <iostream>

// Inline function to compute the square of a number

inline int square(int x) {

return x * x;

int main() {

int num = 5;

std::cout << "The square of " << num << " is " << square(num) <<
std::endl;

return 0;

```

In this example:

- The `square` function is defined with the `inline` keyword.

- The compiler may replace calls to `square(num)` with `num * num`


directly in the code, avoiding the overhead of a function call.

### Friend Functions

**Friend functions** are functions that are not members of a class but still
have access to the private and protected members of that class. This can
be useful for operations that need to interact closely with the internal
state of the class but don't logically belong to the class itself.

#### How Friend Functions Work

- **Definition**: You declare a function as a friend inside the class


definition using the `friend` keyword.

- **Access**: Friend functions can access private and protected members


of the class but are not members of the class themselves.

- **Purpose**: Useful for operations that involve multiple classes or that


require access to private data of a class for purposes like operator
overloading.

#### Example of Friend Function

```cpp

#include <iostream>

class Box {

private:

int length;

int width;

int height;

public:

Box(int l, int w, int h) : length(l), width(w), height(h) {}

// Declare a friend function

friend int calculateVolume(const Box& b);

};
// Friend function definition

int calculateVolume(const Box& b) {

// Accessing private members of Box

return b.length * b.width * b.height;

int main() {

Box box(3, 4, 5);

std::cout << "Volume of the box: " << calculateVolume(box) <<


std::endl;

return 0;

```

In this example:

- `calculateVolume` is declared as a friend of the `Box` class.

- The friend function `calculateVolume` has access to the private


members `length`, `width`, and `height` of the `Box` class.

- Although `calculateVolume` is not a member of `Box`, it can still access


its private data to calculate the volume.

### Summary

**Inline Functions**:

- Use the `inline` keyword to suggest that the compiler replace the
function call with the function code.

- Improve performance for small, frequently called functions.

- The `inline` keyword is a request, not a command; the compiler may


ignore it.

**Friend Functions**:
- Use the `friend` keyword to grant a non-member function access to
private and protected members of a class.

- Useful for operations that need to interact with private data but are not
logically part of the class.

Both features provide ways to manage performance and access control in


C++ programs. If you need further clarification or have more questions,
feel free to ask!

You might also like