-
C ++の構造体とクラスの違いは何ですか?
構造体のメンバーと基本クラスはデフォルトでパブリックですが、クラスではデフォルトでプライベートになります。構造体とクラスは、それ以外は機能的に同等です。 ただし、セマンティクスのために、さまざまな場所で使用されます。構造体は、データを表すために使用されるデータ構造に似ています。一方、クラスは、より機能的な傾向のある構造です。それは物事のあり方と働き方を模倣しています。
-
配列をC++関数に渡す
C ++では、配列全体を引数として関数に渡すことはできません。ただし、インデックスなしで配列の名前を指定することにより、配列へのポインタを渡すことができます。 1次元配列を関数の引数として渡したい場合は、次の3つの方法のいずれかで関数の仮パラメーターを宣言する必要があります。3つの宣言メソッドはすべて、整数ポインターが実行されることをコンパイラーに通知するため、同様の結果を生成します。受け取る必要があります。 配列を関数に渡す方法は3つあります- ポインタとしての正式なパラメータ void myFunction(int *param) { // Do so
-
C++プログラミングでの一般的な未定義の動作
以下は、C++プログラミングでの未定義動作の最も一般的な原因です。これらはすべて、未定義の動作につながるように標準で指定されており、プログラムを作成するときは絶対に回避する必要があることに注意してください。 符号付き整数オーバーフロー NULLポインターの間接参照、サイズ0の「新しい」割り当てによって返されるポインター、まだ完全に初期化されていないポインター、配列の終わりを超えた場所にあるポインター。 スコープ外または削除されたオブジェクトへのポインタの使用 配列の境界外の結果を生成するポインタ演算を実行します。 互換性のないタイプのオブジェクトへのポインタの変換 負のオフセットでのオブジ
-
2次元配列をC++関数に渡す
C ++では、配列全体を引数として関数に渡すことはできません。ただし、インデックスなしで配列の名前を指定することにより、配列へのポインタを渡すことができます。 2D配列を関数に渡すには3つの方法があります- 2D配列の列のサイズを指定します void processArr(int a[][10]) { // Do something } ポインタを含む配列を渡す void processArr(int *a[10]) { // Do Something } // When callingint *array[10]; for(int i
-
C++での通常のキャストとstatic_castとdynamic_cast
static_cast − これは、通常/通常の型変換に使用されます。これは、暗黙の型強制の原因となるキャストでもあり、明示的に呼び出すこともできます。 floatをintに、charをintに変換する場合などに使用する必要があります。 dynamic_cast − このキャストは、ポリモーフィズムを処理するために使用されます。派生クラスにキャストする場合にのみ使用する必要があります。これは、基本クラスから派生クラスにキャストするときに継承でのみ使用されます。 レギュラーキャスト- これは、const_cast、static_cast、およびreinterpret_castを組み合わ
-
C ++の前方宣言とは何ですか?
前方宣言により、宣言に続くコードは、Personという名前のクラスがあることを認識できます。これは、これらの名前が使用されていることを確認すると、コンパイラーを満足させます。後でリンカはクラスの定義を見つけます。 例 Class Person; void myFunc(Person p1) { // ... } Class Person { // Class definition here }; したがって、この場合、コンパイラーがmyFuncに遭遇すると、コードのどこかでこのクラスに遭遇することがわかります。これは、クラスを使用するコー
-
C / C ++でグローバル変数を使用しないようにする必要があるのはなぜですか?
C ++だけでなく、どの言語でもグローバル変数を使用しないようにする必要があります。これは、これらの変数がグローバル名前空間を汚染し、任意のファイルからアクセスできるため、どこからでも変更できるため、大きなプロジェクトで非常に厄介なバグを引き起こす可能性があるためです。これらは、グローバル変数が悪いと見なされる理由のいくつかです- グローバル変数はコードのどの部分でも変更される可能性があるため、考えられるすべての使用法を覚えたり推論したりするのは困難です。 グローバル変数はアクセス制御を持てません。プログラムの一部に限定することはできません。 グローバル変数を使用すると、コー
-
C++の「struct」と「typedefstruct」の違いは?
C ++では、structとtypedef structの間に違いはありません。これは、C ++では、すべてのstruct / union / enum/class宣言が暗黙的にtypedefであるかのように動作するためです。 ed、同じ名前の別の宣言によって名前が隠されていない限り。 typedefを前方宣言できないという微妙な違いが1つありますが、したがって、typedefオプションの場合、どこでも使用する前に、typedefを含むファイルを含める必要があります。
-
コマンドを実行し、POSIXを使用してC ++内でコマンドの出力を取得するにはどうすればよいですか?
popen関数とpclose関数を使用して、プロセスとの間でパイプを行うことができます。 popen()関数は、パイプを作成し、フォークし、シェルを呼び出すことによってプロセスを開きます。バッファを使用してstdoutの内容を読み取り、それを結果文字列に追加し続け、プロセスが終了したときにこの文字列を返すことができます。 例 #include <iostream> #include <stdexcept> #include <stdio.h> #include <string> using namespace std; string exec
-
C++STLを使用したカスタムオブジェクトのベクトルの並べ替え
C++STL関数std::sortを使用して、カスタムオブジェクトのベクトルを並べ替えることができます。ソート関数には、最初、最後、コンパレータを引数として取るオーバーロードされた形式があります。最初と最後は、コンテナの最初と最後の要素へのイテレータです。コンパレータは、コンテナのソート方法を指示するために使用できる述語関数です。 例 #include<iostream> #include<algorithm> #include<vector> using namespace std; struct MyStruct { int
-
セグメンテーション違反はC++での実際の未定義の動作ですか?
未定義動作は、実装者(コンパイラやOSなど)とコンピュータに、「やりたいこと」を実行する自由、つまり結果を気にしない自由を与える方法です。 セグメンテーション違反が発生するケースは、本質的に一時的なものです。それらは常にセグメンテーション違反を引き起こすとは限りませんが、正しく実行することもできます(または少なくともそう見える)。たとえば、次のコードフラグメントを考えてみましょう- #include<iostream> int main() { int arr[2]; arr[0] = 0; ar
-
C++のstd::endlと\nの違いは何ですか?
\ n改行を出力します(適切なプラットフォーム固有の表現であるため、Windowsでは \ r \ nを生成します)が、std ::endlは同じことを行い、ストリームをフラッシュします。通常、ストリームをすぐにフラッシュする必要はなく、パフォーマンスが低下するだけなので、ほとんどの場合、std::endlを使用する理由はありません。 出力がタイムリーに(つまり遅延なく)ユーザーに表示されることを期待しているためにストリームを手動でフラッシュする場合は、ストリームに「\n」を書き込む代わりにstd::endlを使用する必要があります。
-
C ++でintをstringに変換する方法は?
Cのitoa関数を使用して、intを文字列に変換できます。 例 #include<iostream> int main() { int a = 10; char *intStr = itoa(a); string str = string(intStr); cout << str; } 出力 これにより、出力が得られます- 10 これにより、整数が文字列に変換されます。 C ++ 11では、同じ目的で使用できる新しいメソッドto_stringが追加されました。次の
-
C ++で明示的なキーワードはどういう意味ですか?
C ++の明示的なキーワードは、型を暗黙的に変換しないようにコンストラクターをマークするために使用されます。たとえば、クラスFoo-がある場合 class Foo { public: Foo(int n); // allocates n bytes to the Foo object Foo(const char *p); // initialize object with char *p }; 今試してみると Foo mystring = 'x'; charxは暗黙的にintに変換されてから、Foo(int)コンスト
-
C ++のコンストラクター内で仮想関数を呼び出す方法は?
コンストラクタまたはデストラクタから仮想関数を呼び出すことは危険であり、可能な限り避ける必要があります。これは、呼び出す仮想関数が派生クラスではなく基本クラスから呼び出されるためです。 C ++では、すべてのクラスが独自の構造に入る前に、そのバージョンの仮想メソッドテーブルを構築します。したがって、コンストラクターで仮想メソッドを呼び出すと、Baseクラスの仮想メソッドが呼び出されます。または、そのレベルで実装がない場合は、純粋仮想メソッド呼び出しが生成されます。 Baseが完全に構築されると、コンパイラはDerivedクラスの構築を開始し、Derivedクラスの実装を指すようにメソッドポイ
-
C ++にヘッダーファイルと.cppファイルがあるのはなぜですか?
C ++には、インターフェイスを実装から分離するためのヘッダーファイルと.ccpファイルがあります。ヘッダーファイルは、クラス(または実装されているもの)が何をするかを宣言します。つまり、クラスのAPIは、Javaのインターフェイスのようなものです。一方、cppファイルは、これらの機能を実行する「方法」、つまり、これらの宣言された機能の実装を定義します。 これにより、依存関係が減少します。ヘッダーを使用するコードは、実装のすべての詳細と、そのためにのみ必要な他のクラス/ヘッダーを知る必要はありません。実装しようとしていることに焦点を当てる必要があります。これにより、実装を変更するときに必要な
-
C ++で改行を待たずに、標準入力から文字を読み取ります
これを行うためのポータブルソリューションは存在しません。 Windowsでは、conio(Console I / O)ライブラリのgetch()関数を使用して、文字を押すことができます。 例 #include<iostream> #include<conio.h> using namespace std; int main() { char c; while(1){ // infinite loop c = getch(); &nb
-
C ++で文字列をintに解析する方法は?
文字列ストリームを使用して、C++のintをintに解析できます。この方法では、エラーチェックを行う必要があります。 例 #include<iostream> #include<sstream> using namespace std; int str_to_int(const string &str) { stringstream ss(str); int num; ss >> num; return num; } int main() {
-
std ::stringをC++でconstchar*またはchar*に変換する方法は?
文字列クラスのc_str()メソッドを使用して、文字列の内容を含むconstchar*を取得できます。 例 #include<iostream> using namespace std; int main() { string x("hello"); const char* ccx = x.c_str(); cout << ccx; } 出力 これにより、出力が得られます- hello 文字*を取得するには、コピー機能を使用します。 例 #include<ios
-
C ++でcoutを使用して、double値を完全な精度で出力するにはどうすればよいですか?
出力ストリームcoutでは、マニピュレーターを使用して、coutに直接精度を設定し、固定形式の指定子を使用できます。 doubleの完全な精度を得るには、limitsライブラリを使用できます。たとえば、 例 #include<iostream> #include <limits> using namespace std; int main() { // Get numeric limits of double typedef std::numeric_limits< double > dbl; &nbs