タグ付けされた質問 「c++」

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。


5
const参照クラスのメンバーは一時的なオブジェクトの寿命を延ばしますか?
これはなぜですか: #include <string> #include <iostream> using namespace std; class Sandbox { public: Sandbox(const string& n) : member(n) {} const string& member; }; int main() { Sandbox sandbox(string("four")); cout << "The answer is: " << sandbox.member << endl; return 0; } 出力を与える: 答えは: の代わりに: 答えは:4

13
C ++では、食べていないものの代金を払っていますか?
CおよびC ++での次のhello worldの例を考えてみましょう。 main.c #include <stdio.h> int main() { printf("Hello world\n"); return 0; } main.cpp #include <iostream> int main() { std::cout<<"Hello world"<<std::endl; return 0; } godboltでそれらをコンパイルしてアセンブリすると、Cコードのサイズはわずか9行(gcc -O3)になります。 .LC0: .string "Hello world" main: sub rsp, 8 mov edi, OFFSET FLAT:.LC0 call puts xor eax, eax add rsp, 8 ret ただし、C ++コードのサイズは22行(g++ …
170 c++  c 


5
operator&がオーバーロードされているときに、オブジェクトのアドレスを確実に取得するにはどうすればよいですか?
次のプログラムを検討してください。 struct ghost { // ghosts like to pretend that they don't exist ghost* operator&() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( } clydeのアドレスを取得するにはどうすればよいですか? すべてのタイプのオブジェクトに対して同等に機能するソリューションを探しています。C ++ 03ソリュ​​ーションがいいですが、C ++ 11ソリューションにも興味があります。可能であれば、実装固有の動作は避けてください。 C ++ 11のstd::addressof関数テンプレートは知っていますが、ここでは使用しません。標準ライブラリの実装者がこの関数テンプレートを実装する方法を知りたいのですが。

6
C ++ 11、14、17、または20は、piの標準定数を導入しますか?
CとC ++のpiの数値にはかなりばかげた問題があります。私が知る限り、でM_PI定義されてmath.hいることは、どの規格でも要求されていません。 新しいC ++標準では、標準ライブラリに複雑な数学の多くが導入されました-双曲線関数、std::hermiteおよびstd::cyl_bessel_i、さまざまな乱数ジェネレータなど。 「新しい」標準のいずれかがパイの定数をもたらしましたか?そうでない場合-なぜですか?この複雑な数学はそれなしでどのように機能しますか? 私はC ++のpiに関する同様の質問を認識しています(それらは数年前のものであり、標準から古くなっています); 問題の現状を知りたいのですが。 なぜ C ++にはまだpi定数がないのに、もっと複雑な数学がたくさんあるのか、という理由にも非常に興味があります。 UPD:自分でpiを4 * atan(1)またはacos(1)またはdouble pi = 3.14として定義できることを知っています。承知しました。しかし、なぜ2018年に私はまだそれをしなければならないのですか?標準の数学関数はpiなしでどのように機能しますか? UPD2:2019年7月にケルンで開催されたC ++委員会のこの出張レポートによると、提案P0631(数学定数)がC ++ 20に受け入れられました。つまり、ついに標準ライブラリに数piが含まれるようになります!


6
1つのクラスのメンバー関数でジェネリックstd :: functionオブジェクトを使用する
1つのクラスについて、同じクラスのメンバー関数への関数ポインターを1つのmap格納std::functionオブジェクトに格納したい。しかし、私は最初にこのコードで失敗します: class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; 私は受信error C2064: term does not evaluate to a function taking 0 argumentsにxxcallobjいくつかの奇妙なテンプレートのインスタンスエラーと組み合わせます。現在、Visual Studio 2010/2011を搭載したWindows 8で作業していますが、VS10を搭載したWin 7では失敗します。エラーは、私が従わないいくつかの奇妙なC ++ルールに基づいている必要があります


4
.vcxproj.filterファイルをソース管理に追加する必要がありますか?
Visual Studio 2010 Beta 2を評価していると、変換されたディレクトリで、vcprojファイルがvcxprojファイルになったことがわかります。各プロジェクトの横には、フォルダー構造の説明(\ Source Files、\ Header Filesなど)が含まれているように見えるvcxproj.filterファイルもあります。 これらのフィルターファイルはユーザーごとに保持する必要があると思いますか、それとも開発グループ全体で共有してSCCにチェックインする必要がありますか? 私の現在の考えはそれらをチェックインすることですが、それを行わない理由があるのか​​、あるいは私が間違いなくそれらをチェックインする必要があるのにはおそらく正当な理由があるのだろうかと思います。 明らかな利点は、他の人のマシンを見ているとフォルダ構造が一致することですが、おそらく論理的に再編成したいですか?

1
doubleを32ビットintに丸める高速な方法の説明
Luaのソースコードを読んだとき、Luaはa macroを使用してa doubleを32ビットに丸めることに気付きましたint。を抽出するmacroと、次のようになります。 union i_cast {double d; int i[2]}; #define double2int(i, d, t) \ {volatile union i_cast u; u.d = (d) + 6755399441055744.0; \ (i) = (t)u.i[ENDIANLOC];} ここでENDIANLOCは、リトルエンディアン、ビッグエンディアンのエンディアンネスとして定義されています。Luaはエンディアンを慎重に処理します。またはのような整数型を表します。01tintunsigned int 私は少し調査しましたがmacro、同じ考えを使用するより簡単な形式があります。 #define double2int(i, d) \ {double t = ((d) + 6755399441055744.0); i = *((int *)(&t));} またはC ++スタイルで: inline int double2int(double d) …


2
パブリックフレンドスワップメンバー機能
copy-and-swap-idiomへの美しい答えには、少し助けが必要なコードがあります。 class dumb_array { public: // ... friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // ... }; そして彼はメモを追加します タイプにstd :: swapを特化し、自由関数スワップと並んでクラス内スワップを提供する必要があるという他の主張があります。しかし、これはすべて不必要です。スワップの適切な使用は、修飾されていない呼び出しによるものです。 、そして私たちの機能はADLを通じて発見されます。1つの関数が行います。 でfriend、私は「非友好的」という用語には少しだ、私は認めなければなりません。だから、私の主な質問は: 無料の関数のように見えますが、そのクラス本体の内部ですか? なぜこれはswap静的ではないのですか?明らかにメンバー変数を使用しません。 「スワップを適切に使用すれば、ADL経由でスワップが見つかります」?ADLは名前空間を検索しますよね?しかし、それはクラスの内部も調べますか?それともどこからfriend来るのですか? 副質問: C ++ 11では、をでマークする必要swapがありnoexceptますか? C ++ 11とすると、範囲のために、私は配置する必要がありますfriend iter begin()し、friend iter end()クラス内の同じように?friendここでは必要ないと思いますよね?

3
「= default」はデフォルトのコンストラクタとデストラクタの「{}」とどう違うのですか?
もともとはデストラクタについての質問としてこれを投稿しましたが、今はデフォルトのコンストラクタの考慮を追加しています。元の質問は次のとおりです。 クラスに仮想のデストラクタを与えたいが、それ以外はコンパイラが生成するものと同じである場合は、次のように使用できます=default。 class Widget { public: virtual ~Widget() = default; }; しかし、空の定義を使用して入力を減らすことで同じ効果を得ることができるようです: class Widget { public: virtual ~Widget() {} }; これらの2つの定義が異なる動作をする方法はありますか? この質問に投稿された回答に基づくと、デフォルトのコンストラクタの状況は似ているようです。デストラクタの「=default」と「{}」の意味にほとんど違いがないことを考えると、デフォルトのコンストラクタのこれらのオプションの意味にも同様にほとんど違いはありませんか?つまり、そのタイプのオブジェクトが作成されて破壊されるタイプを作成したいと仮定すると、なぜ私は言いたいのですか? Widget() = default; の代わりに Widget() {} ? 元の投稿後にこの質問を拡張すると、SOのルールに違反することになります。デフォルトのコンストラクタについてほぼ同じ質問を投稿することは、あまり望ましくない選択肢であると私を思いました。

8
クラスコードをヘッダーとcppファイルに分離する
単純なクラスの実装と宣言のコードを新しいヘッダーとcppファイルに分離する方法について混乱しています。たとえば、次のクラスのコードをどのように分離しますか? class A2DD { private: int gx; int gy; public: A2DD(int x,int y) { gx = x; gy = y; } int getSum() { return gx + gy; } };
169 c++  oop  class 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.