Survey: Constructors • Method that is called when an occurrence is made

class Integer { open: int val; Integer() { val = 0; cout << "default constructor" << endl; };

int primary() { Integer i; }

Yield: default constructor

• When making a variety of items, default constructor is conjured on each

class Integer { open: int val; Integer() { val = 0; cout << "default constructor" << endl; };

int primary() { Integer arr[3]; }

Yield: default constructor default constructor default constructor

• When making a class occurrence, the default constructor of its fields are conjured

class Integer { open: int val; Integer() { val = 0; cout << "Number default constructor" << endl; }; class IntegerWrapper { open: Integer val; IntegerWrapper() { cout << "IntegerWrapper default constructor" << endl; };

int fundamental() { IntegerWrapper q; }

Yield: Integer default constructor IntegerWrapper default constructor

• Constructors can acknowledge parameters

class Integer { open: int val; Integer(int v) { val = v; cout << "constructor with arg " << v << endl; };

int fundamental() { Integer i(3); }

Yield: constructor with arg 3

• Constructors can acknowledge parameters – Can summon single-parameter constructor by means of task to the suitable sort

class Integer { open: int val; Integer(int v) { val = v; cout << "constructor with arg " << v << endl; };

int fundamental() { Integer i(3); Integer j = 5; }

Yield: constructor with arg 3 constructor with arg 5

class Integer { open: int val; Integer(int v) { val = v; };

int fundamental() { Integer i(3);/alright Integer j; }

• If a constructor with parameters is characterized, the default constructor is no more accessible

Mistake: No default constructor accessible for Integer

class Integer { open: int val; Integer(int v) { val = v; };

int fundamental() { Integer a[] = { Integer(2), Integer(5) };/alright Integer b[2]; }

• If a constructor with parameters is characterized, the default constructor is no more accessible – Without a default constructor, can't proclaim clusters without instating

Mistake: No default constructor accessible for Integer

class Integer { open: int val; Integer() { val = 0; } Integer(int v) { val = v; };

int fundamental() { Integer i;/alright Integer j(3);/alright }

• If a constructor with parameters is characterized, the default constructor is no more accessible – Can make a different 0-contention constructor

class Integer { open: int val; Integer(int v = 0) { val = v; };

int primary() { Integer i;/alright Integer j(3);/alright }

• If a constructor with parameters is characterized, the default constructor is no more accessible – Can make a different 0-contention constructor – Or, use default contentions

class Integer { open: int val; Integer(int val = 0) { this->val = val; };

• How would I allude to a field when a strategy contention has the same name? • this: a pointer to the present occurrence

this->val is a shorthand for (*this).val

class Integer { open: int val; Integer(int val = 0) { this->val = val; } void setVal(int val) { this->val = val; };

• How would I allude to a field when a strategy contention has the same name? • this: a pointer to the present occurrence

Checking and Memory

• Whenever we announce another variable (int x), memory is distributed • When can this memory be authorized (so it can be utilized to store different variables)? – When the variable goes out of degree

int principle() { if (genuine) { int x = 5; }/x now out of degree, memory it used to involve can be reused }

• When a variable goes out of degree, that memory is no more ensured to store the variable's quality Scoping and Memory

int principle() { int *p; if (genuine) { int x = 5; p = &x; } cout << *p << endl;/??? }

• When a variable goes out of degree, that memory is no more ensured to store the variable's quality Scoping and Memory

int principle() { int *p; if (genuine) { int x = 5; p = &x; } cout << *p << endl;/??? } here

• When a variable goes out of extension, that memory is no more ensured to store the variable's worth Scoping and Memory

int principle() { int *p; if (genuine) { int x = 5; p = &x; } cout << *p << endl;/??? } here

• When a variable goes out of extension, that memory is no more ensured to store the variable's worth Scoping and Memory

int fundamental() { int *p; if (genuine) { int x = 5; p = &x; } cout << *p << endl;/??? } here

• When a variable goes out of degree, that memory is no more ensured to store the variable's quality Scoping and Memory

int fundamental() { int *p; if (genuine) { int x = 5; p = &x; } cout << *p << endl;/??? }

here

???

• When a variable goes out of degree, that memory is no more ensured to store the variable's quality – Here, p has turned into a dangling pointer (focuses to memory whose substance are indistinct) Scoping and Memory

A Problematic Task

• Implement a capacity which gives back a pointer to some memory containing the whole number 5 • Incorrect execution:

int* getPtrToFive() { int x = 5; return &v; }

• Implement a capacity which gives back a pointer to some memory containing the whole number 5 • Incorrect execution: – x is announced in the capacity scope

int* getPtrToFive() { int x = 5; return &x; }

int principle() { int *p = getPtrToFive(); cout << *p << endl;/??? }

here

• Implement a capacity which gives back a pointer to some memory containing the whole number 5 • Incorrect execution: – x is announced in the capacity scope – As getPtrToFive() returns, x goes out of extension. So a dangling pointer is returned

int* getPtrToFive() { int x = 5; return &x; }

int primary() { int *p = getPtrToFive(); cout << *p << endl;/??? }

here ???

The new administrator

• Another approach to allot memory, where the memory will remain dispensed until you physically de-apportion it • Returns a pointer to the recently assigned memory

int *x = new int;

The new administrator

• Another approach to allot memory, where the memory will remain dispensed until you physically de-apportion it • Returns a pointer to the recently assigned memory

int *x = new int;

Sort parameter expected to decide the amount of memory to dispense

The new administrator

• Another approach to allot memory, where the memory will remain dispensed until you physically de-apportion it • Returns a pointer to the recently assigned memory • Terminology note: – If utilizing int x; the portion happens on an area of memory called the stack – If utilizing new int; the designation happens on a district of memory called the pile

The erase administrator

• De-apportions memory that was beforehand assigned utilizing new • Takes a pointer to the memory area

int *x = new int;/use memory apportioned by new erase x;

• Implement a capacity which gives back a pointer to some memory containing the whole number 5 – Allocate memory utilizing new to guarantee it remains distributed

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

• Implement a capacity which gives back a pointer to some memory containing the whole number 5 – Allocate memory utilizing new to guarantee it remains allotted. – When done, de-allot the memory utilizing erase

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int primary() { int *p = getPtrToFive(); cout << *p << endl;/5 erase p; }

Erase Memory When Done Using It

• If you don't utilize de-designate memory utilizing erase, your application will squander memory int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int primary() { int *p; for (int i = 0; i < 3; ++i) { p = getPtrToFive(); cout << *p << endl; }

erroneous

• If you don't utilize de-assign memory utilizing erase, your application will squander memory

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int principle() { int *p; for (int i = 0; i < 3; ++i) { p = getPtrToFive(); cout << *p << endl; }

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int principle() { int *p; for (int i = 0; i < 3; ++i) { p = getPtrToFive(); cout << *p << endl; } first cycle

• If you don't utilize de-assign memory utilizing erase, your application will squander memory

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int principle() { int *p; for (int i = 0; i < 3; ++i) { p = getPtrToFive(); cout << *p << endl; } second cycle

• If you don't utilize de-assign memory utilizing erase, your application will squander memory

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int principle() { int *p; for (int i = 0; i < 3; ++i) { p = getPtrToFive(); cout << *p << endl; } third cycle

• If you don't utilize de-assign memory utilizing erase, your application will squander memory • When your project allots memory however can't de-apportion it, this is a memory spill

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int fundamental() { int *p; for (int i = 0; i < 3; ++i) { p = getPtrToFive(); cout << *p << endl; } erase p; } third cycle

• Does including an erase after the circle settle this memory spill?

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int fundamental() { int *p; for (int i = 0; i < 3; ++i) { p = getPtrToFive(); cout << *p << endl; } erase p; }

• Does including an erase after the circle settle this memory spill? – No; just the memory that was dispensed on the last cycle gets de-designated

int *getPtrToFive() { int *x = new int; *x = 5; return x; }

int fundamental() { int *p; for (i
 
Top