📅  最后修改于: 2023-12-03 15:14:03.413000             🧑  作者: Mango
在C++中,构造函数是一种特殊的函数,它在对象实例化时被自动调用,用于初始化对象的成员变量。通常情况下,构造函数是静态的,即编译器在编译时确定构造函数的实现代码。但是,在某些情况下,我们需要动态创建对象,这时就可以使用动态构造函数来实现对象的初始化。
动态构造函数是指在运行时动态地创建构造函数。在C++中,使用动态构造函数一般是在实现抽象工厂模式、原型模式、反射等场景时使用。动态构造函数相比于静态构造函数的优点在于可以在运行时动态地创建对象,使得代码更加灵活。
在C++中,动态构造函数可以通过函数指针或者函数对象实现。下面分别介绍两种实现方式。
可以定义一个函数指针类型,该函数指针类型指向构造函数。然后,通过调用函数指针来创建对象,并用新对象初始化指向的指针。例如:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void say() = 0;
};
class Cat : public Animal {
public:
void say() {
cout << "I am a cat." << endl;
}
};
class Dog : public Animal {
public:
void say() {
cout << "I am a dog." << endl;
}
};
typedef Animal* (*CreateAnimalFn)();
Animal* createCat() {
return new Cat();
}
Animal* createDog() {
return new Dog();
}
int main() {
CreateAnimalFn cf1 = createCat;
CreateAnimalFn cf2 = createDog;
Animal *p1 = cf1();
Animal *p2 = cf2();
p1->say();
p2->say();
delete p1;
delete p2;
return 0;
}
上述代码中,CreateAnimalFn是一个函数指针类型,该函数指针类型指向返回Animal指针的函数。createCat和createDog两个函数分别返回Cat和Dog的指针,它们都符合CreateAnimalFn类型的要求。在main函数中,分别定义了两个函数指针变量cf1和cf2,用于存放createCat和createDog函数的地址。通过调用函数指针,创建了两个Animal对象p1和p2,然后分别调用它们的say()方法输出结果。
函数对象是C++中的一种重载了函数调用符(operator())的类。可以定义一个函数对象类,该类中的operator()可以实现对象的创建。然后,通过调用该函数对象,创建对象,并用新对象初始化指向的指针。例如:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void say() = 0;
};
class Cat : public Animal {
public:
void say() {
cout << "I am a cat." << endl;
}
};
class Dog : public Animal {
public:
void say() {
cout << "I am a dog." << endl;
}
};
class CreateCat {
public:
Animal* operator() () {
return new Cat();
}
};
class CreateDog {
public:
Animal* operator() () {
return new Dog();
}
};
int main() {
CreateCat cc;
CreateDog cd;
Animal *p1 = cc();
Animal *p2 = cd();
p1->say();
p2->say();
delete p1;
delete p2;
return 0;
}
上述代码中,CreateCat和CreateDog分别是函数对象类,重载了operator()运算符,可以直接实现对象的创建。在main函数中,分别定义了cc和cd两个函数对象,用于创建Cat和Dog对象。通过调用函数对象,创建了两个Animal对象p1和p2,然后分别调用它们的say()方法输出结果。
动态构造函数是一种在C++中动态创建对象并进行初始化的方式,可以通过函数指针或者函数对象来实现。使用动态构造函数可以使得代码更加灵活,适用于实现抽象工厂模式、原型模式、反射等场景。