class Image {
public:
Image(const std::string& name, int index) : _name(name), _index(index) {}
private:
int _index;
std::string _name;
};
#include <iostream>
class A {
public:
// default ctor
A() { _ia = 1; std::cout << "Called default ctor\n";}
// copy ctor
A(const A& other) : _ia(other._ia) { std::cout << "Called copy ctor\n"; }
// copy assignment
A& operator=(const A& other) {
std::cout << "Called copy assignment\n";
if (this != &other) {
_ia = other._ia;
}
return *this;
}
// move ctor
A(A&& other) noexcept : _ia(std::move(other._ia)) { std::cout << "Called move ctor\n"; }
// move assignment
A& operator=(A&& other) noexcept {
std::cout << "Called move assignment\n";
if ( this != &other ){
_ia = std::move(other._ia);
}
return *this;
}
int _ia;
};
class B {
public:
B(A& a) : _a(a) { }
A _a;
};
class C {
public:
C(A& a) { _a = a; }
A _a;
};
int main(){
std::cout << "Step1\n";
A a;
std::cout << "\nStep2\n";
B b(a);
std::cout << "\nStep3\n";
C c(a);
}
Step1
Called default ctor
Step2
Called copy ctor
Step3
Called default ctor
Called copy assignment
class X {
int i;
int j;
public:
// oops! do you see the problem?
X( int val ) : j( val ), i( j )
{}
// ...
};
// preferred idiom
X::X( int val ) : i( val ) { j = i; }