【没有明确提供拷贝构造函数的时候回调用默认的拷贝构造函数】
#include <iostream> #include <string.h> using namespace std; class Student { private: int number; string name; public: Student(int nu, string na) :number(nu), name(na) {} Student() {} void show() { cout << "学生的学号是:" << number << "学生的姓名是:" << name << endl; } }; int main() { Student s(21032114, "李威涛"); Student s1 = s; // 利用初始化的方法 s1.show(); cout << "***********************" << endl; Student s2(s); // 利用小括号的方法赋值 s2.show(); return 0; }
=============
【明确提供拷贝构造函数时】
#include <iostream> #include <string.h> using namespace std; class Student { private: int number; string name; public: Student(int nu, string na) :number(nu), name(na) {} Student() {} Student(const Student& s) //拷贝构造函数要用用引用 ,因为引用值传递形参改变实参也改变 { number = s.number; name = s.name; } void show() { cout << "学生的学号是:" << number << "学生的姓名是:" << name << endl; } }; int main() { Student s(21032114, "李威涛"); Student s1 = s; // 利用初始化的方法 s1.show(); cout << "***********************" << endl; Student s2(s); // 利用小括号的方法赋值 s2.show(); return 0; }
=============
【拷贝构造函数与重载运算符函数】
(为什么要返回对象名,实际上是在用拷贝构造函数)
#include <iostream> using namespace std; class Complex { private: double real; double imag; public: Complex(double r, double i) :real(r), imag(i) { cout << "调用了构造函数" << endl; } Complex() {} Complex(const Complex& c) { real = c.real; imag = c.imag; cout << "*************调用了拷贝构造函数:************" << endl; } Complex operator+(Complex& c) { cout << "*************调用了重载运算符**********" << endl; Complex c1; c1.real = real + c.real; // 返回对象的实部=原实部+引用实部; c1.imag = imag + c.imag; return c1; //返回对象名,其实是想用拷贝函数 } void show() { cout << "加到一起是:" << real << "+" << imag << "i" << endl; } }; int main() { Complex c(2, 3), c1(c); c1.show(); Complex c2(3, 4), c3(2, 5),c4; c4 = c2.operator+(c3); // 实际上为: c4=c1(real,imag); c4.show(); }
=============
【在重载运算符的时候,如果不调用新的对象,要返回*this】
#include <iostream> using namespace std; class Complex { private: double real; double imag; public: Complex(double r, double i) :real(r), imag(i) { cout << "调用了构造函数" << endl; } Complex() {} Complex(const Complex& c) { real = c.real; imag = c.imag; cout << "*************调用了拷贝构造函数:************" << endl; } Complex operator=(Complex& c) { cout << "*************调用了重载运算符**********" << endl; real = c.real; // 返回对象的实部=原实部+引用实部; imag = c.imag; return *this; //临时变量后面会消失 } void show() { cout << "加到一起是:" << real << "+" << imag << "i" << endl; } }; int main() { Complex c(2, 3), c1(c); c1.show(); Complex c2(3, 4), c3(2, 5),c4; c2.operator=(c3); // c2.show(); }
=============
【注意事项】