-
Notifications
You must be signed in to change notification settings - Fork 0
/
constructors.cpp
151 lines (145 loc) · 3.48 KB
/
constructors.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// A constructor is a member function with the same name as of the class. It is used to initialize objects, and is automatically invoked whenever an object is created.
#include <iostream>
using namespace std;
class Complex
{
int a, b;
public:
Complex(); // declaring a constructor (should always be public)
void printData()
{
cout << "The complex number is " << a << " + " << b << "i." << endl;
}
};
Complex ::Complex() // Since there are no parameters, this is a default constructor, i.e., a = 0 and b = 0 by default whenever an object is created
{
a = 0;
b = 0;
}
int main()
{
Complex c1;
c1.printData();
return 0;
}
// Parameterized constructor
#include <iostream>
using namespace std;
class num
{
int a, b, c;
public:
num(int, int, int);
void printData()
{
cout << "The numbers are " << a << ", " << b << " and " << c << endl;
}
};
num ::num(int x, int y, int z = 10)
{
a = x;
b = y;
c = z;
}
// ALternatively, num :: num(int x, int y, int z = 10) : a(x), b(y), c(z) {} (this is called an initialization list, and is only used with constructors)
int main()
{
num c1(4, 6); // implicit calling of function
num c2 = num(5, 7, 8); // explicit calling of function
c1.printData();
c2.printData();
return 0;
}
/* Similar to function overloading, constructor overloading (more than one constructor for the same class) is also observed */
// Copy constructor
#include <iostream>
using namespace std;
class number
{
int integer;
public:
number()
{
integer = 100;
}
number(int a)
{
integer = a;
}
number(number &object) // copy constructor
{
integer = object.integer;
cout << "Copy constructor called: ";
}
void display()
{
cout << integer << endl;
}
};
int main()
{
number x1(50), x3;
x1.display();
number x2(x1);
x2.display(); // If the copy constructor were not declared, a default copy constructor declared automatically would have been invoked, giving 100 as the output. This is called shallow copy.
x3 = x1; // The copy constructor is not invoked since x3 has not been created in this line; it has only been initialized using the assignment operator. This is also an example of shallow copy.
x3.display();
number x4 = x1; // copy constructor invoked; deep copy
x4.display();
return 0;
}
// Constructors in derived class
#include <iostream>
using namespace std;
class Base1
{
int data1;
public:
Base1(int i)
{
data1 = i;
cout << "Constructor of Base 1 called" << endl;
}
void printDataBase1()
{
cout << "The value of data1 is " << data1 << endl;
}
};
class Base2
{
int data2;
public:
Base2(int i)
{
data2 = i;
cout << "Constructor of Base2 called" << endl;
}
void printDataBase2()
{
cout << "The value of data2 is " << data2 << endl;
}
};
class Derived : public Base2, public Base1
{
int derived1, derived2;
public:
Derived(int a, int b, int c, int d) : Base1(a), Base2(b)
{
derived1 = c;
derived2 = d;
cout << "Constructor of Derived called" << endl;
}
void printDataDerived()
{
cout << "The value of derived1 is " << derived1 << endl;
cout << "The value of derived2 is " << derived2 << endl;
}
};
int main()
{
Derived abc(1, 2, 3, 4);
abc.printDataBase1();
abc.printDataBase2();
abc.printDataDerived();
return 0;
}