# Sep 1, 2018

## C++

### Arrays

C++ provides a data structure, **the array**, which stores a fixed-size sequential collection of elements of the same type. An array is used to store a collection of data, but it is often more useful to think of an array as a collection of variables of the same type.

Instead of declaring individual variables, such as number0, number1, ..., and number99, you declare one array variable such as numbers and use numbers\[0], numbers\[1], and ..., numbers\[99] to represent individual variables. A specific element in an array is accessed by an index.

All arrays consist of contiguous memory locations. The lowest address corresponds to the first element and the highest address to the last element.

#### Declaring Arrays

To declare an array in C++, the programmer specifies the type of the elements and the number of elements required by an array as follows

```cpp
type arrayName [ arraySize ];
```

This is called a single-dimension array. The **arraySize** must be an integer constant greater than zero and **type** can be any valid C++ data type. For example, to declare a 10-element array called balance of type double, use this statement

```cpp
double balance[10];
```

#### Initializing Arrays

You can initialize C++ array elements either one by one or using a single statement as follows −

```cpp
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
```

The number of values between braces { } can not be larger than the number of elements that we declare for the array between square brackets \[ ]. Following is an example to assign a single element of the array −

If you omit the size of the array, an array just big enough to hold the initialization is created. Therefore, if you write −

```cpp
double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};
```

You will create exactly the same array as you did in the previous example.

```cpp
balance[4] = 50.0;
```

The above statement assigns element number 5th in the array a value of 50.0. Array with 4th index will be 5th, i.e., last element because all arrays have 0 as the index of their first element which is also called base index. Following is the pictorial representation of the same array we discussed above.

```cpp
#include <iostream>
using namespace std;
 
#include <iomanip>
using std::setw;
 
int main () {

   int n[ 10 ]; // n is an array of 10 integers
 
   // initialize elements of array n to 0          
   for ( int i = 0; i < 10; i++ ) {
      n[ i ] = i + 100; // set element at location i to i + 100
   }
   cout << "Element" << setw( 13 ) << "Value" << endl;
 
   // output each array element's value                      
   for ( int j = 0; j < 10; j++ ) {
      cout << setw( 7 )<< j << setw( 13 ) << n[ j ] << endl;
   }
 
   return 0;
}
```

![C++ Arrays](https://2983667966-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LJXi0H4dvnbcPXWPlJC%2F-LLNNnbwst9LXFleo3JS%2F-LLNOqhnNvsLRt_jHJFp%2FScreen%20Shot%202018-09-01%20at%2022.50.18.png?alt=media\&token=95c44889-4142-4adb-b298-7e33a841da4c)

### Const member functions

A function becomes const when `const` keyword is used in function's declaration. The idea of const functions is **not allow them to modify the object on which they are called**. It is recommended practice to make as many functions `const` as possible so that **accidental changes to objects are avoided**.

Following is a simple example of const function.

```cpp
#include<iostream>
using namespace std;

class Test {
    int value;
public:
    Test(int v = 0) {value = v;}

    // We get compiler error if we add a line like "value = 100;"
    // in this function.
    int getValue() const {return value;}  
};

int main() {
    Test t(20);
    cout<<t.getValue();
    return 0;
}

```

When a function is declared as `const`, it can be called on any type of object. **Non-const functions can only be called by non-const objects**.

For example the following program has compiler errors.

```cpp
#include<iostream>
using namespace std;
 
class Test {
    int value;
public:
    Test(int v = 0) {value = v;}
    int getValue() {return value;}
};

int main() {
    const Test t;
    cout << t.getValue();
    return 0;
}
```

### Destructors

**What is destructor?**\
Destructor is a member function which destructs or deletes an object.

**When is destructor called?**\
A destructor function is called automatically when the object goes out of scope:\
(1) the function ends\
(2) the program ends\
(3) a block containing local variables ends\
(4) a delete operator is called&#x20;

**How destructors are different from a normal member function?**\
Destructors have same name as the class preceded by a tilde (`~`)\
Destructors don't take any argument and don't return anything

```cpp
class String
{
private:
    char *s;
    int size;
public:
    String(char *); // constructor
    ~String();      // destructor
};
  
String::String(char *c)
{
    size = strlen(c);
    s = new char[size+1];
    strcpy(s,c);
}
  
String::~String()
{
    delete []s;
}
```

Useful if your object needs to free any memory when it dies.

* `delete` any pointers stored as private members
* `delete[]` any arrays stored as private members

