// 构造函数的分类及调用
#include <iostream>
using namespace std;
// 分类
// 按照参数进行分类 无参构造函数 (默认构造函数) 有参构造函数
// 按照类型进行分类 普通构造函数 拷贝构造函数
class Person {
public: // 构造和析构必须写在 public 下才可以调用到;
Person() { // 默认、无参构造函数
cout << "默认构造函数 调用" << endl;
}
Person(int a) {
cout << "有参构造函数 调用" << endl;
}
Person(const Person& person) { // 拷贝构造函数: const 必须加;
this->m_Age = person.m_Age;
cout << "拷贝构造函数 调用" << endl;
}
~Person() {
cout << "析构函数 调用" << endl;
}
int m_Age;
};
void test01() {
Person person1; // 默认构造函数 不要加小括号( person1() );
Person person2(1);
person2.m_Age = 19;
Person person3(person2);
cout << person3.m_Age << endl;
}
void test02() {
Person person4 = Person(100);
Person person5 = Person(person4);
}
int main() {
test01();
test02();
return EXIT_SUCCESS;
}
// 拷贝构造函数的调用时机
#include <iostream>
#include <string>
using namespace std;
class Person {
public: // 构造和析构必须写在 public 下才可以调用到;
Person() { // 默认、无参构造函数
cout << this->name << " 默认构造函数 调用" << endl;
}
Person(int a) {
cout << this->name << " 有参构造函数 调用" << endl;
}
Person(const Person& person) { // 拷贝构造函数: const 必须加;
this->m_Age = person.m_Age;
cout << this->name << " 拷贝构造函数 调用" << endl;
}
~Person() {
cout << this->name << " 析构函数 调用" << endl;
}
int m_Age;
string name = "person ";
};
// 拷贝构造函数调用的时机
// 1. 用已经创建好的对象来初始化新的对象;
void test01() {
Person person1;
person1.name = "test01 person";
Person person2(person1);
}
// 2. 以值传递的方式给函数参数传值;
void doWork02(Person person1) {
person1.name = "doWork02 person ";
}
void test02() {
Person person;
person.name = "test02 person";
doWork02(person);
}
// 3. 以值方式返回局部对象;
Person doWork03() {
Person person;
person.name = "doWork03 person";
return person;
}
void test03() {
Person person = doWork03();
person.name = "test03 person";
}
// 4. 以地址传递的方式给函数参数传值;
void doWork04(Person& person1) {
person1.name = "doWork04 person";
}
void test04() {
Person person;
person.name = "test04 person";
doWork04(person);
}
int main() {
//test01();
//test02();
//test03();
test04();
return EXIT_SUCCESS;
}
// 构造函数的调用规则
#include <iostream>
using namespace std;
class MyClass {
public:
/*MyClass() {
cout << "默认 构造函数" << endl;
}*/
MyClass(int a) {
cout << "有参 构造函数" << endl;
}
//MyClass(const MyClass& myClass) {
// cout << "拷贝 构造函数" << endl;
//}
~MyClass() {
cout << "析构函数" << endl;
}
int gradeNumber;
int classNumber;
};
// 1. 当类内只提供了有参构造函数, 那么系统就不会再提供默认构造函数了;
// 但是 系统还会提供默认拷贝构造函数
// 当类内提供了 拷贝构造, 那么系统就不会提供其他构造了
void test01() {
MyClass myClass1(1);
myClass1.gradeNumber = 3;
myClass1.classNumber = 4;
MyClass myClass2(myClass1); // 即使类中没有实现 拷贝构造函数, 系统会默认实现
myClass2.gradeNumber = 2;
myClass2.classNumber = 3;
cout << "myClass1.gradeNumber: " << myClass1.gradeNumber << endl; // 3
cout << "myClass1.classNumber: " << myClass1.classNumber << endl; // 4
cout << "myClass2.gradeNumber: " << myClass2.gradeNumber << endl; // 2
cout << "myClass2.classNumber: " << myClass2.classNumber << endl; // 3
}
int main() {
test01();
return EXIT_SUCCESS;
}