1.拷贝函数的值拷贝:
#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public:Person() {cout << "Person的默认构造函数调用" << endl;}Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}Person(const Person &p) {cout << "Person的拷贝构造函数调用" << endl;m_Age = p.m_Age;}~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};void test01() {Person p;p.m_Age = 18;Person p2(p);cout << "p2的年龄为:" << p2.m_Age << endl;}int main() {test01();system("pause");return 0;
}
如果这个时候我们没有写拷贝函数,这个时候编译器就会用它自己的拷贝函数,eg:
#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public:Person() {cout << "Person的默认构造函数调用" << endl;}Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}// Person(const Person &p) {
// cout << "Person的拷贝构造函数调用" << endl;
// m_Age = p.m_Age;
// }~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};void test01() {Person p;p.m_Age = 18;Person p2(p);cout << "p2的年龄为:" << p2.m_Age << endl;}int main() {test01();system("pause");return 0;
}
// Person(const Person &p) {
// cout << "Person的拷贝构造函数调用" << endl;
// m_Age = p.m_Age;
// }
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = //p.m_Age;但是它只会进行值拷贝,
//所以最后的输出里面没有 Person的拷贝构造函数调用
2.如果我们写了有参构造函数,编译器就不再提供默认构造,依然提供拷贝函数
#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public:// Person() {
// cout << "Person的默认构造函数调用" << endl;
// }Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}// Person(const Person &p) {
// cout << "Person的拷贝构造函数调用" << endl;
// m_Age = p.m_Age;
// }
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = p.m_Age;~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};//void test01() {
// Person p;
// p.m_Age = 18;
//
// Person p2(p);
//
// cout << "p2的年龄为:" << p2.m_Age << endl;
//
//}void test02() {Person p;
}int main() {
// test01();test02();system("pause");return 0;
}
会报错,原因是我们写了有参构造函数,所以编译器不会提供默认构造函数,但是我们自己没有写默认构造函数,所以Person没有合适的默认构造函数可用。
下面证明编译器依然会提供拷贝构造函数:
#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public:// Person() {
// cout << "Person的默认构造函数调用" << endl;
// }Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}// Person(const Person &p) {
// cout << "Person的拷贝构造函数调用" << endl;
// m_Age = p.m_Age;
// }
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = p.m_Age;~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};//void test01() {
// Person p;
// p.m_Age = 18;
//
// Person p2(p);
//
// cout << "p2的年龄为:" << p2.m_Age << endl;
//
//}void test02() {Person p(28);Person p2(p);cout << "p2的年龄为:" << p2.m_Age << endl;
}int main() {
// test01();test02();system("pause");return 0;
}
3.如果我们写了拷贝构造函数,编译器就不再提供其他普通构造函数:
#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public:// Person() {
// cout << "Person的默认构造函数调用" << endl;
// }// Person(int age) {
// cout << "Person的有参构造函数调用" << endl;
// m_Age = age;
// }Person(const Person &p) {cout << "Person的拷贝构造函数调用" << endl;m_Age = p.m_Age;}
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = p.m_Age;
// ~Person() {
// cout << "Person的析构函数" << endl;
//
// }int m_Age;
};//void test01() {
// Person p;
// p.m_Age = 18;
//
// Person p2(p);
//
// cout << "p2的年龄为:" << p2.m_Age << endl;
//
//}void test02() {Person p;}int main() {
// test01();test02();system("pause");return 0;
}
由于我们提供了拷贝构造函数,编译器不再提供其他普通函数,所以报错,原因:Person没有合适的默认构造函数可用。