Const ??

  • פותח הנושא mdk5
  • פורסם בתאריך

mdk5

New member
Const ??

יש 2 פונקציות: void func1(char *Data) void func1(const char *Data) כאשר תתבצע שורת הקוד: func1("Danny") הקומפיילר אמור לקרוא לפונקציה השניה (זאת עם ה-const) אבל הוא קורא לפונקציה הראשונה... למה ?
 

erezsh

New member
יש לי פתרון

כתוב את הפונקציות כך:
void func1(char *Data) ; void func1_const(const char *Data);​
ואז כשתרצה לקרוא לרגילה, כתוב func1, וכשתרצה לקרוא לשנייה כתוב func1_const. עכשיו אתה בטח שואל : אז בשביל מה צריך function overloading? שאלה טובה!!!
 

ברנדל

New member
ככה זה אמור להיות

וזו גם נקודה חשובה! מחרוזת של תווים היא תמיד קבועה. לכן היינו מצפים שזה:
char* p = "aviad";​
לא היה עובר קומפילציה. אבל ראה זה פלא , זה כן עובר קומפילציה , למה? בשביל תאימות ל C. מה שכן ברגע שננסה להגיד:
p[3] = a;​
נקבל run time error, כי ניסינו לשנות תוכן של const! כלומר האיתחול בשורה הזו הופך את המצביע עצמו ל CONST למרות שהוא לא הוגדר ככזה! אם כן היינו רוצים לשנות את התוכן היינו חייבים לקרוא:
char p[] = "aviad";​
עכשיו אתחול האיבר השלישי כן היה עובד. כאשר קוראים לפונקציה חייבת להשמר תאימות כאילו עשינו אתחול רגיל. מאחר ש:
char *p = "aviad";​
תקין ועובר קומפילציה , אז הקריאה לפונקציה תקינה ועוברת קומפילציה. תמיד הקומפילר יעדיף לקרוא קודם לפונקציה בלי ה const ומכאן קיבלת את התשובה שלך!
 

annefan

New member
מאיפה הבאת את זה?

בדקתי בשני קומפיילרים, והתוצאה שונה ממה שאמרת. יותר מזה ההסבר לא נראה לי קשור במיוחד, כשמדובר בהעברת מצביעים\מערכים לפונקציה. יש לך הסבר\מקור\לינק?
 
למעלה