Tôi đã viết một ví dụ lớp C++ đơn giản với 1 hàm tạo không tham số, 1 hàm tạo param, 2 hàm tạo bản sao, 1 toán tử gán và toán tử 1 cộng.Xác định các nhà xây dựng sao chép nào được gọi trong mã C++
class Complex {
protected:
float real, img;
public:
Complex() : real(0), img(0) {
cout << "Default constructor\n";
}
Complex (float a, float b) {
cout << "Param constructor" << a << " " << b << endl;
real = a;
img = b;
}
// 2 copy constructors
Complex(const Complex& other) {
cout << "1st copy constructor " << other.real << " " << other.img << endl;
real = other.real;
img = other.img;
}
Complex(Complex& other) {
cout << "2nd copy constructor " << other.real << " " << other.img << endl;
real = other.real;
img = other.img;
}
// assignment overloading operator
void operator= (const Complex& other) {
cout << "assignment operator " << other.real << " " << other.img << endl;
real = other.real;
img = other.img;
}
// plus overloading operator
Complex operator+ (const Complex& other) {
cout << "plus operator " << other.real << " " << other.img << endl;
float a = real + other.real;
float b = img + other.img;
return Complex(a, b);
}
float getReal() {
return real;
}
float getImg() {
return img;
}
};
tôi sử dụng lớp này trong chính một cách chính xác như thế này:
int main() {
Complex a(1,5);
Complex b(5,7);
Complex c = a+b; // Statement 1
system("pause");
return 0;
}
Kết quả được in như:
Param constructor 1 5
Param constructor 5 7
plus operator 5 7
Param constructor 6 12
Tôi nghĩ rằng một constructor sao chép phải được sử dụng trong Bản Tuyên Bố 1, nhưng tôi không thực sự biết cái nào được gọi. Hãy cho tôi biết cái nào và tại sao? Cảm ơn rất nhiều
Nó có thể được elided. – chris
Nên là phiên bản 'const' của hàm tạo bản sao, bạn luôn có thể đặt các bản in gỡ lỗi trong các phần tử của hàm tạo để tự kiểm tra. – iammilind
@iammilind nếu ctor được elided, các bản in ra được elided quá, được cho phép theo tiêu chuẩn. – Walter