C++ 同時実行プログラミングを学んでいる学生です。C++ プログラムを介してグラフィック カード チップとサウンド カード チップの両方の機能にアクセスする方法を知りたいです。OpenGL などの外部ライブラリを使用せずに、それぞれのドライバーとアプリケーションを接続する別の方法はありますか? OpenALなどのソリューションを例を挙げて簡単に説明していただけますか。ありがとうございました。
2 に答える
const int * const function_name(const int * point) const;
//(1) (2) (3) (4)
1 つ目は、返されたポインタが、関数によってアクセスされているデータを変更するために使用されるのを防ぎます。これは、共有データの予期しない変更を防ぐため、(変更したくない場合は) 良いことです。
2 つ目は、呼び出し元が返されたポインターを変更できないようにします。これは、組み込み型 (ポインターなど) を返す場合は効果がなく、クラス型を返す場合は、ムーブ セマンティクスが阻害されるため、不適切な場合があります。
3 番目は、関数がデータを変更するのを防ぎます。これは、最初と同じ理由で (適切な場合) 適切です。
4 番目は、関数がオブジェクトの (可変でない) 状態を変更するのを防ぎます。const
これは、オブジェクトで関数を呼び出すことができ、オブジェクトがいつ変更されるかを簡単に追跡できるため、(適切な場合)便利です。
const int * const Functiontwo(const int * const &) const;
// (5)
ここで唯一新しいのは、ポインターをconst
参照渡しすることです。そんなことをしても意味がありません。値による受け渡しは同じセマンティクスを提供し、冗長ではなく、おそらくより効率的です。const
参照による受け渡しは、サイズが大きいかコピーにコストがかかる型の場合、値による受け渡しよりも効率的です。
const
わずかなバリエーションとして、値を渡します。
const int * const Functiontwo(const int * const) const;
// (6)
これは、呼び出し元にとっては重要ではありません (実際、関数は、意味を変更することなく、それを使用してまたは使用せずに宣言できます)。したがって、それを宣言に置く意味はなく、定義に置くだけです。これは、ポインターが関数内で変更できないことを意味します。const
これは、関数の実装を追跡しやすくすることができるため、(ローカル変数の宣言と同様に) 良い場合があります。
const
メンバー関数の後は、関数が親オブジェクトの状態を変更しないことを意味します。
struct foo
{
int bar() const; // does not modify the instance of foo
int & bar(); // might modify the instance of foo
};
あなたの例では、関数は戻ります
int const * const
最初のconst
手段は、int
指している を変更してはならないということです。値を読み取ることはできるが、変更することはできないことをユーザーに伝えます。const
これは、正確性にも関連しています。
int const * foo() const; // can be used from const functions
int * foo(); // cannot be used from const function
2 番目const
は、ポインター自体がconst
であることを意味します。つまり、次のことを意味します。
int * ptr = &a;
*ptr = 42; // valid
ptr = &b; // valid
int const * ptr = &a;
*ptr = 42; // INVALID
ptr = &b; // valid
int * ptr const = &a;
*ptr = 42; // valid
ptr = &b; // INVALID
int const * ptr const = &a;
*ptr = 42; // INVALID
ptr = &b; // INVALID
const
関数からの戻り値としてポインター自体を作成することは、ほとんど役に立ちません。
参考までに、C++03 のクイック ガイドは、オブジェクトを変更する場合は参照渡しを行い、変更を保持することです。オブジェクトを変更したいが、変更を保持したくない場合 (コピーが作成される)、または (例外!) 渡す値が POD タイプの場合は、値で渡します。POD 以外のタイプを変更する必要がない場合は、定数参照で渡し、コピー コストを節約します。
void foo(int & a); // changes to a are applied to a itself, no copy made
void foo(int a); // changes to a are applied to a copy of a, copy made
void foo(std::string const & a); // no changes allowed, no copy made