C++汎用思想

1674 ワード

一、汎用プログラミング
オブジェクト向けプログラミングはプログラミングデータに注目し、汎用プログラミングはアルゴリズムに注目し、それらの間の共通点は抽象的で再利用可能なコードを作成することである.汎用型はパラメータ化タイプ,タイプのパラメータ化であり,関数のパラメータのようにタイプを伝達することができる.汎用プログラミングは、データ型とは独立したコードを記述することを目的としています.
1.汎用型は、コンパイラがコンパイル中にタイプをチェックしてタイプのセキュリティを向上させ、実行時にオブジェクトタイプが一致しないことによる異常を低減することができる.
(1)では,なぜ汎用型が導入されたのかを理解するには,汎用型が用いられていないことによる問題を知る必要がある.
現在のプログラム開発はオブジェクト向けなので、プログラムには様々なタイプのオブジェクトが多く、オブジェクトには何らかのタイプのコンテナが必要です.プログラマは任意のタイプのオブジェクトをコンテナに入れる可能性があるため、JavaではObjectがルートクラスであるため、これらのコンテナは設計時にObjectタイプのオブジェクトを入れるようにデフォルトで設計するしかありません.例:
public class ListContainer {
    private Object obj;

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }
}

多態によって、容器にはどんなタイプのオブジェクトも入れることができます.ただし、オブジェクトを取り出す場合は強制型変換を行い、実際の型に変換する必要があります.しかし、これは多くのタイプの不安全な問題があります.なぜですか.コンパイラがタイプチェックを手伝うことができないため、コードは実行時にClassCastException異常が発生しやすい.したがって、タイプセキュリティの問題はプログラマー自身で解決するしかなく、さまざまなタイプを覚えて、タイプ変換エラーを回避します.
(2)、汎用型を使用して、上の容器を再設計する
public class ListContainer {
    private T obj;

    public T getObj() {
        return obj;
    }

    public void setObj(T obj) {
        this.obj = obj;
    }
}

ここでのTのタイプのパラメータは,具体的にはTがどのタイプを指すのか,プログラマが開発する際にListContainerを使用する場合に指定する.
ListContainer myCon=new ListContainer();

このような場合、コンパイラはListContainerコンテナがDogタイプのオブジェクトを配置していることを知り、タイプセキュリティチェックを行います.
myCon.setObj(new Dog());  //ok
myCon.setObj("123");      //         

 
2,アルゴリズムまたはコンテナをデータ型汎用型から独立させ,アルゴリズムまたはコンテナをデータ型から独立させ,C++のクラステンプレートと関数テンプレートは上記の2つの機能をうまく実現できる.