📌

[C++] ポインタ型変数でも関数呼び出し時には実体参照渡ししよう

2025/01/01に公開

こんにちは、kaiwareです。

C++での話になります。タイトル通りです。

以下のようにnewで生成したインスタンスを外部の関数に渡す場合を考えます。

その際、インスタンスを利用する側の関数は参照で受け取るようにすれば
Nullチェックのダブりを防げて効率がよいと思い、活用しています。

#include <iostream>

struct MyClass {
    int x;
    int y;
}

void func_call_by_pointer(MyClass* ptr){
    /// ptrのNullチェックをしたくなるが、呼び出し元でもされている。
    /// → 二重チェックになり効率が悪い。
    if(!ptr){
        return;
    }

    std::cout << ref->x << ref->y << std::endl;
}

void func_call_by_reference(MyClass& ref){
    /// 参照で受け取ればこの関数内でNullチェックの必要がない
    /// → 呼び出し元でNullチェックされている前提で処理をかける!
    /// → 関数内で意図せずDeleteされる危険性も小さくできる!

    std::cout << ref.x << ref.y << std::endl;
}

int main(){
    auto mc = new MyClass{1, 2};

    /// 呼び出す前にNullチェックしたくなるのがC++プログラマの性
    if(mc) {
        func_call_by_pointer(mc);
        func_call_by_reference(*mc); /// 実体にアクセスして関数呼び出し
    }
    return 0;
}

ご意見ありましたらぜひコメントお願いします!

GitHubで編集を提案

Discussion