سؤال

ما هو المقصود ب "دلالات قيمة"، والمقصود من "دلالات المؤشر الضمني؟

هل كانت مفيدة؟

المحلول

وجافا وتستخدم دلالات المؤشر الضمني لأنواع الكائنات ودلالات قيمة الأوليات.

ودلالات القيمة يعني أنك تتعامل مباشرة مع القيم والتي تمرر نسخ حولها. النقطة هنا هي أنه عندما يكون لديك قيمة، يمكن أن تثق انها لن تغير وراء ظهرك.

ومع دلالات المؤشر، لم يكن لديك قيمة، لديك 'العناوين'. شخص آخر يمكن أن يغير ما هو هناك، لا يمكنك معرفة.

ومؤشر الدلالة في C ++:

void foo(Bar * b) ...
... b->bar() ...

وأنت بحاجة إلى * لطلب دلالات المؤشر و-> لاستدعاء الأساليب على pointee

.

والضمنية الدلالة المؤشر في جاوة:

void foo(Bar b) ...
... b.bar() ...

ومنذ لم يكن لديك خيار استخدام دلالات قيمة، وليس هناك حاجة ل* ولا تمييز بين -> و، وبالتالي ضمنا

نصائح أخرى

والأساس، ودلالات قيمة يعني أن تعيين قيمة واحدة إلى أخرى بإنشاء نسخة:

int x = 1;
int y = x;
x = 2; // y remains the same!

وهناك حالة خاصة هي استدعاء دالة الذي يحصل على مر حجة:

void f(int x) {
    x = 5;
}

int a = 1;
f(a);
// a is still 1

وهذا هو في الواقع الشيء نفسه بالنسبة جافا وC ++. ومع ذلك، جافا يعرف سوى عدد قليل من أنواع البدائية، من بينها int، double، boolean وchar، جنبا إلى جنب مع تتضمن التعدادات التي تتصرف بهذه الطريقة. جميع أنواع أخرى تستخدم دلالات مرجعية وهو ما يعني أن التنازل عن قيمة واحدة إلى أخرى الموجهات في الواقع مؤشر بدلا من نسخ القيمة الأساسية:

class Foo {
    int x;

    public Foo(int x) { this.x = x; }
}

Foo a = new Foo(42);
Foo b = a; // b and a share the same instance!
a.x = 32;
//b.x is now also changed.

وهناك بعض المحاذير ولكن. على سبيل المثال، العديد من أنواع المرجعية (String، Integer ...) هي immutables الواقع. لا يمكن تغيير قيمتها وأي مهمة لهم يتجاوز القيمة القديمة.

وأيضا، والحجج لا يزال الحصول على تمرير من حيث القيمة. وهذا يعني أن قيمة كائن التي تم تمريرها إلى وظيفة يمكن أن تتغير ولكن إشارة لا يستطيع:

void f(Foo foo) {
    foo.x = 42;
}

void g(Foo foo) {
    foo = new Foo(42);
}

Foo a = new Foo(23);
f(a);
// a.x is now 42!

Foo b = new Foo(1);
g(b);
// b remains unchanged!

وجافا تمريرة من قيمة. C ++ يمكن استخدامها على حد سواء، وقيمة مرجعية دلالات.

http://javadude.com/articles/passbyvalue.htm

وجافا يستخدم implicit pointer semantics على الوصول متغير (لا يمكنك تحرير مباشرة الإشارة، فإنه autmatically (الضمني) يحصل على حلها إلى كائن الحصول على) ويستخدم أيضا Pass-by-Value semantics على معلمات الأسلوب تمرير .

ومقروءة على دلالات تمرير كل قيمة في تطبيقات جافا :

<اقتباس فقرة>   

في تطبيقات جافا، عندما كائن   المرجعية هي معلمة إلى الأسلوب،   يتم تمرير نسخة من   المرجعية (تمر من حيث القيمة)، وليس   الرجوع نفسها. نلاحظ أن   دعا مرجع كائن طريقة و   نسخة تشير إلى نفسها   موضوع. هذا هو المهم   تمييز. تطبيق جافا لا   لا شيء بشكل مختلف عند تمرير   المعلمات من أنواع مختلفة مثل C ++   هل. تطبيقات جافا تمر جميع   المعلمات من حيث القيمة، مما يجعل   نسخ من جميع المعلمات بغض النظر عن   نوع.

وقصيرة: يتم تمرير كافة المعلمات في جافا من حيث القيمة. ولكن هذا لا يعني كائن يحصل على نسخ (مثل الافتراضي في PHP4)، ولكن يحصل على نسخ إشارة إلى هذا الكائن.

وسترى كل تفسيرات وأمثلة معمقة حول <لأ href = "http://web.archive.org/web/20070526204705/http://www.ibm.com:80/developerworks/java/ مكتبة /-ي passbyval "يختلط =" نوفولو noreferrer "> تمرير كل قيمة دلالات في تطبيقات جافا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top