יום שבת

Explicit Constructor

את הפוסט הזה אני לא מתחיל בהצהרות על חשיבות הנושא. לא מדובר כאן בנושא מרכזי, אבל בכל זאת אפשר ללמוד כאן משהו חדש שיעזור לביסוס הבנת ה- c++.
הערה מקדימה:  הנושא רללונטי רק עבור constructors שמקבלים פרמטר יחיד. 
אז על מה מדובר....? מתי להשתמש ב-explicit constructor ומה זה עושה?
מיד נראה, אבל זו דווקא הזדמנות להראות  תחילה עוד דרך לקריאה ל-Constructor.
בדוגמא הבאה נראה 3 דרכים לקריאה ל-constructor. שתיים מהן כבר הכרנו.


  1. /*
  2.  * explicit_const.cpp
  3.  *
  4.  *  Created on: Mar 17, 2012
  5.  *      Author: ronen halevy
  6.  *
  7.  */
  8. #include <iostream>
  9. using namespace std;
  10. class Example {
  11. private:
  12. int a;
  13.  public:
  14.    Example(int a):a(a){}
  15.    void show(){cout << "a="<< a << endl;}
  16.  };

  17.  int main(){
  18. Example ex1(10);
  19. ex1.show();
  20. Example ex2 = Example(10);
  21. ex2.show();
  22.  Example ex3 = 10;
  23.  ex3.show();
  24.  }


שלושת הצורות לקריאה ל-constructor מודגשות בצהוב. את הפורמט שבשורות 19 ו-21 כבר הכרנו בפוסט  הראשון על constructors. החידוש הוא בפורמט שבשורה 23. הפורמט הזה מתאים רק ל-constructors עם פרמטר יחיד.

צורת הקריאה האחרונה עשויה להיות מבלבלת, אבל אפשר לחסום אותה. איך?
על ידי סימון ה-constructor כ-explicit. כך נקבל שגיאה בהשמה מהסוג השלישי.

הנה הclass עם סימון ה-explicit:



/*
 * explicit_const.cpp
 *
 *  Created on: Mar 17, 2012
 *      Author: ronen halevy
 *
 */
#include <iostream>
using namespace std;
class Example {
private:
int a;
 public:
   explicit Example(int a):a(a){}
   void show(){cout << "a="<< a << endl;}
 };

 int main(){

Example ex1(10);
ex1.show();
Example ex2 = Example(10);
ex2.show();
Example ex3 = 10; // Here we get error: conversion from ‘int’ to non-scalar type ‘Example’ requested
ex3.show();
 }



אין תגובות:

הוסף רשומת תגובה