1) Both Copy Constructor and Assignment Operator are call by address, not call by value
#include <iostream>
using namespace std;
class Array {
public:
int *_array;
int size;
Array(int input):size(input)
{
_array = new int[size];
}
void Set(int i, int v)
{
_array[i] = v;
}
int Get(int i)
{
return _array[i];
}
~Array()
{
delete [] _array;
}
};
int main()
{
Array a(5);
Array b = a;
a.Set(0, 10);
a.Set(1, 20);
a.Set(2, 30);
a.Set(3, 40);
a.Set(4, 50);
cout << a.Get(0) << " " << a.Get(1) << " " << a.Get(2) << " " << a.Get(3) << " " << a.Get(4) << endl;
cout << b.Get(0) << " " << b.Get(1) << " " << b.Get(2) << " " << b.Get(3) << " " << b.Get(4) << endl;
cout << &a << " " << a._array << endl;
cout << &b << " " << b._array << endl;
return 0;
}
10 20 30 40 50
10 20 30 40 50
0x7fff61f44a90 0x1180010
0x7fff61f44aa0 0x1180010
*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0000000001180010 ***
the problem caused in this program:
- memory leak in b
- it was copied by "b._array = a._array;", either modified in b or a will change the result
- double free
2) Initialization list
#include <iostream>
using namespace std;
class A {
public:
A()
{
cout << "A constructor" << endl;
}
A(const A& a)
{
cout << "A copy constructor" << endl;
}
A& operator=(const A& a)
{
cout << "A assignment Operator" << endl;
}
};
class B {
public:
B(A &input)
{
cout << "B consturctor" << endl;
m_a = input;
}
private:
A m_a;
};
class C {
public:
C(A& input):m_a(input)
{
cout << "C constructor" << endl;
}
private:
A m_a;
};
int main()
{
cout << "===A===" << endl;
A a;
cout << "===B===" << endl;
B b(a);
cout << "===C===" << endl;
C c(a);
return 0;
}
===A===
A constructor
===B===
A constructor
B consturctor
A assignment Operator
===C===
A copy constructor
C constructor
3) Const variable can only be initialed in initialization list
#include <iostream>
using namespace std;
class A {
public:
A(int input) { a = input; }
void show() { cout << a << endl; }
private:
const int a;
};
int main()
{
A aa(5);
aa.show();
return 0;
}
test2.cpp: In constructor ‘A::A(int)’:
test2.cpp:7:9: error: uninitialized member ‘A::a’ with ‘const’ type ‘const int’ [-fpermissive]
test2.cpp:7:28: error: assignment of read-only member ‘A::a’
#include <iostream>
using namespace std;
class A {
public:
A(int input):a(input) { }
void show() { cout << a << endl; }
private:
const int a;
};
int main()
{
A aa(5);
aa.show();
return 0;
}
5
4) The serial of constructor and destructor
#include <iostream>
using namespace std;
class A {
public:
A()
{
cout << "A constructor" << endl;
}
~A()
{
cout << "A destructor" << endl;
}
};
class B {
public:
B()
{
cout << "B constructor" << endl;
}
~B()
{
cout << "B destructor" << endl;
}
};
class C {
public:
C()
{
cout << "C constructor" << endl;
}
~C()
{
cout << "C destructor" << endl;
}
};
class Aa : public A {
public:
Aa(int in1):y(in1)
{
cout << "Aa constructor" << endl;
}
~Aa()
{
cout << "Aa destructor" << endl;
}
private:
B b;
int y;
C c;
};
int main()
{
Aa hi(5);
return 0;
}
A constructor
B constructor
C constructor
Aa constructor
Aa destructor
C destructor
B destructor
A destructor