چرا می توانم مقدار جدیدی را به یک مرجع اختصاص دهم ، و چگونه می توانم یک مرجع را به چیز دیگری ارجاع دهم؟

من چند س relatedال در رابطه با استفاده از منابع در C ++ دارم.

  1. در کدی که در زیر نشان داده شده ، چگونه کار می کند و خطی در خط q = "world"؛ خطا نمی دهد؟

     #include 
    
    استفاده از namespace std؛
    
    int اصلی ()
     {
      char * p = "سلام"؛
      char * & q = p؛
      cout << p << '' << q << "\ n"؛
      q = "جهان" ؛  // چرا خطایی در این خط وجود ندارد
      cout << p << '' << q << "\ n"؛
     }
     
    1. چگونه می توان یک مرجع q را دوباره به چیز دیگری تبدیل کرد؟

    2. آیا رشته تحت اللفظی ، p = "سلام" یک فضای ثابت یا فقط برای خواندن نیست؟ بنابراین اگر چنین کنیم ،

       q = "جهان" ؛
       

      آیا رشته موجود در p که قرار است ثابت باشد تغییر نمی کند؟

  2. من در مورد متغیرهای نوع مرجع C ++ خوانده ام زیرا نمی توان آنها را مجدداً تنظیم یا دوباره تعیین کرد ، زیرا آنها به صورت داخلی ذخیره نمی شوند به عنوان نشانگر ثابت بنابراین یک کامپایلر خطا می دهد.

    اما چگونه می توان متغیر مرجع را دوباره تعیین مجدد کرد؟

     int i؛
    
    int & j = من؛
    
    int k؛
    
    j = k ؛  // این باید خوب باشد ، اما چگونه ما به چیز دیگری تغییر کار می دهیم تا پرچم کامپایلر را خطا کنیم؟
     

    من سعی می کنم این مرجع را بدست آورم ، و در نتیجه ممکن است برخی از موارد اصلی را از دست داده باشم ، بنابراین این سالات وجود دارد.

بنابراین هر نشانه ای برای روشن کردن این مسئله مفید خواهد بود.

32
задан Rob Kennedy 24 August 2011 в 20:55
поделиться

1 ответ

Важная деталь, касающаяся ссылок, которые, я думаю, вам не хватает, заключается в том, что, как только ссылка будет привязана к объекту, вы никогда не сможете переназначить ее. С этого момента, всякий раз, когда вы используете ссылку, она неотличима от использования объекта, на который она ссылается. Например, в вашем первом фрагменте кода, когда вы пишете

q = "World";

Поскольку q является ссылкой, связанной с p, это эквивалентно записи

p = "World";

Это просто меняет то, куда указывает p, а не содержимое строки, на которую он указывает. (Это также объясняет, почему не происходит сбой!)

Что касается вашего второго вопроса, ссылки не могут быть переназначены после привязки к объекту. Если вам нужна ссылка, которая может изменить его референт, вы должны вместо этого использовать указатель.

Надеюсь, это поможет!

24
ответ дан 27 November 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: