Wenn man eine öffentliche API entwirft, ist es eine gute Übung, den Konstruktor explizit zu machen?Ist es eine gute Praxis, den Konstruktor explizit zu machen?
class A {
public:
//explicit A(int i){}
A(int i){}
};
void fun(const A& a) {}
int main() {
// If I use explicit for A constructor, I can prevent this mistake.
// (Or shall I call it as feature?)
fun(10);
}
Oder soll ich implizite Konvertierung zulassen, damit Benutzer meine API mit weniger Typisierung aufrufen kann?
Beispiel für implizite Konvertierung: alles numberlike (z.eine Bignum-Bibliothek oder eine Date/Time-Bibliothek) - gegen implizite Konvertierung: Betrachten Sie einfach die Klasse 'std :: vector', die mit einer initialen Größe initialisiert werden kann. –
Dem stimme ich zu. In IME gibt es selten einen Fall, in dem implizites Casting gewünscht wird. Wenn Sie sich auf der expliziten Seite irren, wird kein Schaden angerichtet, indem Benutzer zu einigen weiteren Tastenanschlägen gezwungen werden. – sbi
Als Beispiel: implizite Konvertierung von Double zu Complex über 'complex (double re, double im = 0)' macht Sinn, aber die Umwandlung von int in Vektor über 'vector (int size)' nicht. –