构造函数可以在类的私有部分中定义吗?
先决条件:构造函数构造函数是类的特殊成员函数,它初始化类的对象 。在 C++ 中,创建类的对象时会自动调用构造函数。
默认情况下,构造函数定义在类的公共部分。那么,问题是可以在类的私有部分中定义构造函数吗? 答:是的,构造函数可以在类的私有部分中定义
1如何在私有部分使用构造函数?
1.1 使用朋友类
使用朋友类:如果我们希望该类不应该由其他任何人实例化,而只能由朋友类实例化。
// CPP program to demonstrate usage of // private constructor #include <iostream> using namespace std; // class A class A{ private: A(){ cout << "constructor of A "; } friend class B; }; // class B, friend of class A class B{ public: B(){ A a1; cout << "constructor of B "; } }; // Driver program int main(){ B b1; return 0; }
输出:
constructor of A constructor of B
如果您注释掉 friend class B,您将遇到以下错误:
test1.cpp: In constructor ‘B::B()’: test1.cpp:9:5: error: ‘A::A()’ is private A(){ ^ test1.cpp:19:11: error: within this context A a1;
1.2 使用单例设计模式
使用单例设计模式:当我们想要设计一个单例类时。这意味着系统不创建多个类对象,而是由单个对象或非常有限数量的对象驱动。
1.3 使用 Named Constructor Idiom
Named Constructor Idiom :由于构造函数与类同名,不同的构造函数通过参数列表来区分,但是如果构造函数的数量更多,那么实现容易出错。 使用 Named Constructor Idiom,您可以在私有或受保护部分中声明所有类的构造函数,然后为了访问类的对象,您可以创建公共静态函数。
例如,考虑下面的 CPP 程序
// CPP program to demonstrate // ambiguous nature of constructor // with same no of parameters of same type #include <iostream> using namespace std; class Point { public: // Rectangular coordinates Point(float x, float y); // Polar coordinates (radius and angle) Point(float r, float a); // error: ‘Point::Point(float, float)’ cannot // be overloaded }; int main() { // Ambiguous: Which constructor to be called ? Point p = Point(5.7, 1.2); return 0; }
这个问题可以通过命名构造函数来解决。上述 CPP 程序可以改进如下:
// CPP program to demonstrate // named constructor idiom #include <iostream> #include <cmath> using namespace std; class Point { private: float x1, y1; Point(float x, float y) { x1 = x; y1 = y; }; public: // polar(radius, angle) static Point Polar(float, float); // rectangular(x, y) static Point Rectangular(float, float); void display(); }; // utility function for displaying of coordinates void Point :: display() { cout << "x :: " << this->x1 <<endl; cout << "y :: " << this->y1 <<endl; } // return polar coordinates Point Point :: Polar(float x, float y) { return Point(x*cos(y), x*sin(y)); } // return rectangular coordinates Point Point :: Rectangular(float x, float y) { return Point(x,y); } int main() { // Polar coordinates Point pp = Point::Polar(5.7, 1.2); cout << "polar coordinates "; pp.display(); // rectangular coordinates Point pr = Point::Rectangular(5.7,1.2); cout << "rectangular coordinates "; pr.display(); return 0; }
输出 :
polar coordinates x :: 2.06544 y :: 5.31262 rectangular coordinates x :: 5.7 y :: 1.2