質問の背景
お世話になります。
C++開発をしておりますが、Java上がりなのでやはりポインタ周りの理解が不十分で、以下の疑問を抱いております。
参照渡しはポインタ渡しよりも安全だ という記述を良く見かけるのですが、それがどうも良くわかりません。
特に参照渡しだと「実体がある前提で良い」かのような記述を見かけるのですが、そこが理解できません。
私個人としては、参照渡しの方がソースが見やすいので、メリットがあるのであれば、特別スコープの広い変数でヒープ領域にメモリ確保したい場合を除き、ポインタよりも参照を使用するような方向性にしたいです。
参照渡しがない時代によく開発していた人に、参照渡しを推し進めたいのですが、うまく説明できずにいます…。
本題
例えば、以下のようなプログラムがあった場合、SumP
は、nullptr
の考慮が必要だと思います。
SumR
では、参照がNULL
となる考慮は必要ないのでしょうか?
ないのであれば、その理由が知りたいです。
関数定義
C++
1// 【ポインタ渡し】a + b の結果をpcに格納する関数 2void SumP(int a, int b, int *pc) { 3 if( pc == nullptr ) { 4 return; 5 } 6 *pc = a + b; 7} 8 9// 【参照渡し】a + b の結果をcに格納する関数 10void SumR(int a, int b, int &c) { 11 c = a + b; 12}
呼び出し
C++
1// 【ポインタ渡し】 2void DoSumP() { 3 int *pRet = nullptr; 4 SumP(10, 20, pRet); //NG 5 pRet = new int(); 6 SumP(10, 20, pRet); //OK 7 int iRet = 0; 8 SumP(10, 20, &iRet); //OK 9} 10// 【参照渡し】 11void DoSumR() { 12 int iRet = 0; 13 SumR(10, 20, iRet); //OK 14 int* pRet = nullptr; 15 SumR(10, 20, *pRet); //NG これのチェックは必要ないの? 16 pRet = new int(); 17 SumR(10, 20, *pRet); //OK 18}
初歩的な質問でお恥ずかしい限りですが、インターネットで調べただけでは直接的な回答にたどり着けなかったため、よろしくお願いいたします。
(C++ムヅカシイ…)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。