参考Copy constructors, assignment operators, and exception safe assignment
1. copy constructor
The copy constructor is called whenever an object is initialized from another object of the same type, which includes
- initialization, T a = b; or T a(b);, where b is of type T
- function argument passing: f(a);, where a is of type T and f is void f(T t)
- function return: return a; inside a function such as T f(), where a is of type T, which has no move constructor.
此外,看一个例子
#include<iostream>
using namespace std;
class MyClass {
public:
int data1_;
int data2_;
MyClass() {
cout << "Default constructor..." << endl;
}
MyClass(int x, int y) : data1_(x), data2_(y) {
cout << "Constructor..." << endl;
}
MyClass(const MyClass& other) : data1_(other.data1_), data2_(other.data2_) {
cout << "Copy Constructor..." << endl;
}
MyClass& operator=(const MyClass& other) {
cout << "operator = ...." << endl;
data1_ = other.data1_;
data2_ = other.data2_;
return *this;
}
void print() const {
cout << "data1: " << data1_ << ", data2: " << data2_ << endl;
}
};
int main() {
MyClass c1(1, 2); //should call constructor
MyClass c2 = c1; //will not call default constructor first, but call copy constructor.
c2.data1_ = 1000;
c1.print(); //should not change, should print "data1: 1, data2: 2"
c2 = c1; //should call operator =, not copy constructor
return 0;
}