Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में static_cast vs C-स्टाइल कास्टिंग का अंतर


C++ में static_cast और C-स्टाइल कास्टिंग दोनों टाइप कन्वर्जन के लिए उपयोग होते हैं, लेकिन उनके व्यवहार और सुरक्षा में महत्वपूर्ण अंतर हैं।

सिंटैक्स तुलना

// C-स्टाइल कास्ट
int x = (int)3.14;
int* ptr = (int*)&someChar;

// C++ static_cast
int y = static_cast<int>(3.14);
// int* ptr = static_cast<int*>(&someChar); // कंपाइल एरर!

मुख्य अंतर

पहलूC-स्टाइल कास्टstatic_cast
कंपाइल-टाइम चेकिंगनहींहां
संबंधित टाइप्स के बीच कन्वर्जनअनुमतिअनुमति
असंबंधित पॉइंटर कन्वर्जनअनुमति (खतरनाक)ब्लॉक करता है
const हटानाअनुमतिनहीं (const_cast चाहिए)
विजिबिलिटी/सर्चेबिलिटीमुश्किलआसान (static_cast खोजें)
इंटेंशन क्लैरिटीकमअधिक

उदाहरण: static_cast सुरक्षा

#include <iostream>
using namespace std;

class Base { virtual void f() {} };
class Derived : public Base {};
class Unrelated {};

int main() {
    Derived d;
    Base* b = &d;
    
    // 1. अपकास्ट (Derived* → Base*) - दोनों काम करते हैं
    Base* b1 = static_cast<Base*>(&d);  // OK
    Base* b2 = (Base*)&d;                 // OK
    
    // 2. डाउनकास्ट (Base* → Derived*) - static_cast अनसेफ लेकिन अनुमत
    Derived* d1 = static_cast<Derived*>(b);  // OK (प्रोग्रामर की जिम्मेदारी)
    Derived* d2 = (Derived*)b;               // OK
    
    // 3. असंबंधित क्लासेज - static_cast ब्लॉक करता है!
    Unrelated* u1 = static_cast<Unrelated*>(&d);  // COMPILE ERROR!
    // Unrelated* u2 = (Unrelated*)&d;             // C-स्टाइल: कंपाइल होता है लेकिन UB!
    
    // 4. const हटाना - static_cast नहीं करता
    const int ci = 10;
    // int* p1 = static_cast<int*>(&ci);  // COMPILE ERROR!
    // int* p2 = (int*)&ci;                 // C-स्टाइल: कंपाइल होता है लेकिन UB!
    
    // 5. बेसिक टाइप कन्वर्जन - दोनों काम करते हैं
    double pi = 3.14159;
    int i1 = static_cast<int>(pi);  // 3
    int i2 = (int)pi;               // 3
    
    cout << "static_cast और C-स्टाइल दोनों बेसिक टाइप्स के लिए काम करते हैं।\n";
    cout << "लेकिन static_cast पॉइंटर टाइप सेफ्टी लागू करता है।\n";
    
    return 0;
}

आउटपुट

static_cast और C-स्टाइल दोनों बेसिक टाइप्स के लिए काम करते हैं।
लेकिन static_cast पॉइंटर टाइप सेफ्टी लागू करता है।

कब कौन सा उपयोग करें?

  • static_cast: सामान्य टाइप कन्वर्जन (numeric, related pointers, enums)
  • dynamic_cast: पॉलीमॉर्फिक डाउनकास्ट (RTTI आवश्यक, रनटाइम चेक)
  • const_cast: const/volatile क्वालिफायर हटाने/जोड़ने के लिए
  • reinterpret_cast: लो-लेवल रीइंटरप्रिटेशन (पॉइंटर↔इंटीजर, असंबंधित पॉइंटर्स)
  • C-स्टाइल कास्ट: बचें आधुनिक C++ में। यह ऊपर के सभी का कॉम्बिनेशन करता है अनजाने में।

बेस्ट प्रैक्टिस

// ✅ अच्छा: स्पष्ट इरादा
double d = 3.14;
int i = static_cast<int>(d);

// ✅ अच्छा: पॉलीमॉर्फिक डाउनकास्ट
if (Derived* dp = dynamic_cast<Derived*>(bp)) {
    // सुरक्षित उपयोग
}

// ✅ अच्छा: const हटाना (दुर्लभ, सावधानी से)
void legacyApi(int* p);
const int ci = 42;
legacyApi(const_cast<int*>(&ci)); // केवल यदि legacyApi modify नहीं करता

// ❌ बुरा: C-स्टाइल कास्ट
int* p = (int*)someVoidPtr;  // क्या इरादा है? static? reinterpret? const_cast?
  1. डायरेक्टएक्स 11 और डायरेक्टएक्स 12 में क्या अंतर है? डायरेक्टएक्स 11 और डायरेक्टएक्स 12 में क्या अंतर है?

    डायरेक्टएक्स एपीआई का एक संग्रह है, या एप्लिकेशन प्रोग्रामिंग इंटरफेस, जिसका उपयोग सॉफ्टवेयर द्वारा मल्टीमीडिया सामग्री को रेंडर करने और ग्राफिकल हार्डवेयर के साथ संचार करने के लिए किया जाता है। डायरेक्टएक्स का प्रमुख घटक एपीआई, डायरेक्ट3डी, सॉफ्टवेयर और ग्राफिक्स हार्डवेयर के बीच संचार को संभालता ह

  1. - C# में लिस्ट और डिक्शनरी में क्या अंतर है?

    List<T> और Dictionary<TKey, TValue> दोनों जेनेरिक कलेक्शन हैं लेकिन अलग-अलग उद्देश्यों के लिए उपयोग किए जाते हैं। List<T> - क्रमबद्ध संग्रह List myList = new List Maths Dictionary<TKey, TValue> - की-वैल्यू पेयर Dictionary d = new Dictionary 2 तुलना तालिका विशेषताList<T&

  1. - C# में Type Conversion और Type Casting में अंतर

    C# में Type Conversion vs Type Casting C# में टाइप कन्वर्जन और टाइप कास्टिंग अक्सर एक ही अर्थ में उपयोग होते हैं: **एक टाइप के मान को दूसरे टाइप में बदलना**। तकनीकी रूप से कास्टिंग एक्सप्लिसिट कन्वर्जन का सिंटैक्स है। दो रूप 1. इम्प्लिसिट टाइप कन्वर्जन (Implicit Conversion) कंपाइलर द्वारा स्वचालि