X



C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 3b96-ov1m)
垢版 |
2017/07/29(土) 11:28:28.97ID:o30VDF4g0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part130
http://mevius.2ch.net/test/read.cgi/tech/1490917669/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1478440682/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0503デフォルトの名無しさん (ワッチョイ cf51-tIp8)
垢版 |
2017/09/02(土) 17:03:12.44ID:Vkplowcj0
>>501
すみませんでした
こっちで質問してみます
0505デフォルトの名無しさん (ワッチョイ fff0-6h2J)
垢版 |
2017/09/02(土) 18:45:42.87ID:qDvIb2f40
ちがう
一般的にはフィールドたるメンバ変数の方が先に来る

学習の都合で、メンバ変数を先に説明した方が、どう考えてもラク
メンバ関数を先に説明すると、入門書を読むレベルの初心者は間違いなく混乱するので、そんな参考書はまず見かけない

そもそもメソッドの中で使う変数は始めに宣言しておかないと使えない

結論としてはあなたが用語の取り違えをしてる……としか
0510デフォルトの名無しさん (ワッチョイ 2304-k/3h)
垢版 |
2017/09/02(土) 21:02:43.47ID:EU1kDRi00
普通アクセス修飾子の順じゃなくてフィールド→メソッドの順じゃないの
カプセル化するから変数なんてほとんどprivateだろうし
変数は変数でまとめて書いてもらわないと混乱する
0511デフォルトの名無しさん (ワッチョイ ff32-X0kF)
垢版 |
2017/09/02(土) 21:08:20.92ID:Wuw432Mc0
ユーザーにとって重要な項目から順に書く
つまり、public→protected→privateで
ユーザーに見せる必要のないprivateは一番下で
0512デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
垢版 |
2017/09/02(土) 21:13:48.77ID:FGRVT/X40
変数の宣言と関数の宣言の順序がどうでも良いのは自明
メンバ関数の定義がメンバ関数内で使用するメンバ変数の宣言に先行する場合も実験する限り合法
(規格に具体的にどういう文言で規定してあるのかは知らん

まあ定義時点で不完全な型やら値やらはテンプレートの定義で頻出するから
あんま定義と宣言の順序にこだわらない処理系の作りなのだと納得しておく

しかしなぜかテンプレートの引数でない型の定義(または宣言)と使用には厳格な順序を求められる…
次のコードはビルドが通らない
class Baz {
// struct Bar; // 左のコメントアウトを外したら逝ける
 void foo(Bar& b);
 struct Bar { int x, y; }
};
多分Cとの互換性のために仕様がワケワカメになった例
0516デフォルトの名無しさん (ワッチョイ 7f89-eV1K)
垢版 |
2017/09/02(土) 22:01:20.86ID:VLpwNclp0
コンストラクタ実行時のメンバ変数の初期化の実行順が、初期化子の記述順ではなくクラス定義での並び順に従うっていうのがあった気がするけど、新しい規格では変わったんだっけ?
0518デフォルトの名無しさん (オッペケ Src7-mvsT)
垢版 |
2017/09/02(土) 22:21:28.04ID:MiX3UcgLr
>>516
微妙な表現以外、特に変わったという話は聞いたことがない

C++03 12.6.2/5
Then, nonstatic data members shall be initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).

C++20 draft 15.6.2/(13.3)
Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).
0523はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff15-X0kF)
垢版 |
2017/09/03(日) 15:42:16.65ID:XXf7E2cS0
あ〜、そんなこと考えたことなかったけど、クラス (メンバ関数) 内部から見たら近いっちゃ近いのかも?
クラスを定義する側じゃなくてそのクラスを使う側の気持ちで考えて。
0526デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
垢版 |
2017/09/03(日) 16:12:00.06ID:5WRYI1ZX0
何度も宣伝するようで気が引けますが,前に書いたのは >>158
演算子のオーバーロードに絡むものは基本 friend で,内輪で使うものは private の static メンバ関数で,
くらいの線引きをしています.
書いてみてわかったのは「自明」という感じはしないこと,かな,考えてみれば friend 関数って他の言語にはなさそうです
0527デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 16:48:05.14ID:jXGwZqzU0
何で? operatorはグローバルに出さなくても多重定義候補に挙がるぞ
俺は別の理由でoperatorをグローバルにする傾向があるが
0529デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 17:23:08.48ID:jXGwZqzU0
何が不思議?
friendを外すとメンバoperator+に過剰な仮引数となりエラー
friendは「メンバではない」のでアクセス指定は無関係
1点だけ気になるのが、friendは当該クラス自体と同じスコープに新しい識別子を導入しないはず・・・
識別子はoperator+で、これのみは某か標準のヘッダで既に宣言されているということか?
0530 ◆QZaw55cn4c (ワッチョイ 7fef-6h2J)
垢版 |
2017/09/03(日) 17:29:26.39ID:5WRYI1ZX0
>>529
>operator+に過剰な仮引数となりエラー
つまり operator+ の >>528 とは違うもう一つの呼び出し書式にしないといけないわけですね.
でもこの場合は private に置くとコンパイルできない
http://codepad.org/RLo9fKuI

friend はアクセス制御如何にかかわらず「強引にpublic にする」ように見えますね‥わからない‥
0534デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 17:39:19.97ID:jXGwZqzU0
>>530
強引にpublic・・・で憶えやすいならそれでいいんじゃね?
ちな俺の憶え方はメンバでないものをどうやってprivateにするんだ、だ
0535片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd1f-dw5s)
垢版 |
2017/09/03(日) 17:40:51.54ID:zmbOaeS6d
あるクラスX内部のstaticでpublicな関数fは、Xのインスタンスの存在に関係なくX::fという名前でアクセスできる。
あるクラスX内部のfriendな関数gは、X内部のプライベートなメンバーm_aにアクセスできる。
0537デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 19:02:31.58ID:jXGwZqzU0
friendは他のクラスのメンバかも知れない
そういうときも俺の憶え方なら動揺せずに済む
0538デフォルトの名無しさん (ワッチョイ ff32-X0kF)
垢版 |
2017/09/03(日) 19:05:08.53ID:/S0gLPFy0
メンバ関数より、メンバでもfriendでもない関数を使おう
って誰かが言ってた
0539デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 19:11:23.65ID:jXGwZqzU0
欲しい機能がメンバでない関数で使えないとなれば
それはクラスの設計ミスないしはダサい設計だかんな
クラックできちまうのと違う提供すべき機能の欠落
0541デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
垢版 |
2017/09/03(日) 19:55:19.54ID:eN0Ud7+B0
>>530
(1) friendが無い場合
「z = x + y;」に出くわしたコンパイラは
 1. インスタンスxに対しするC::operator+(y)(1引数)の呼び出し
 2. グローバルな関数C operator+(C const& a, C const& b)(およびその亜種)の呼び出し
のあてはめを順次試みるがどちらの関数も宣言が存在しないからあてはまるものが無くエラーになる

(2) friendがある場合
friendがつくことでoperator+()はCのメンバ関数ではなく、グローバルな関数として宣言されたことになる
このとき「z = x + y;」に出くわしたコンパイラは、上の1、2の順で当てはめを試み、
グローバルな関数C operator+(C const& a, C const& b)の呼び出しと解釈する。
本来この関数はクラスCのprivateメンバにアクセスできないが、friendの力でそれができ、めでたくビルドできて動く。

細かい話は規格の人がフォローして☆ホスイ
0542デフォルトの名無しさん (オッペケ Src7-mvsT)
垢版 |
2017/09/03(日) 21:08:24.75ID:Kvjfvtnar
>(2) friendがある場合
最も近い(内側の)名前空間の関数になる(11.3/6-7)
friend関数がメンバーではないことがC++14に明記されていなかったようで、C++17ドラフトに追記された模様(N4659 12.2/2)

<おまけ>
宣言の場所がクラス内という事情により、リンカーはともかくコンパイラーから存在が見えにくい関数となる
この関数を使うには
・名前空間スコープで明示的に宣言し直す
 C operator+(C const& a, C const& b);
・ADL(argument dependent lookup)でクラススコープの検索を発動させる
 >>541でoperator+が呼び出せているのはADLによる
0543デフォルトの名無しさん (オッペケ Src7-mvsT)
垢版 |
2017/09/03(日) 21:36:42.85ID:Kvjfvtnar
つまりクラスの外で定義された関数をイメージすればいい
struct A { friend void operator+(A,A) {/**/} };
 ↓
struct A { friend void operator+(A,A); };
void operator+(A,A) { /**/ } // ただしADLが無いと見えない
0544デフォルトの名無しさん (ワッチョイ b3e4-7rWm)
垢版 |
2017/09/03(日) 21:38:57.90ID:ipvja13x0
ドット拡張とかすればいいのにね
int static_value.fanction() = 0; // function専用
vid functionx.function(char*p){} // function専用

ファイル内スコープなんて今時ほとんど使わないから無視するか識別子重なったら同一と見做すかして
ついでにドット型はファイル内の前方参照も無くし宣言を省けるようにするとかさ
0545 ◆QZaw55cn4c (ワッチョイ 7fef-pwmx)
垢版 |
2017/09/04(月) 01:15:45.54ID:rnM3x3Xp0
>>541
>friendがつくことでoperator+()はCのメンバ関数ではなく、グローバルな関数として宣言された
なるほど,そんなところだろうと >>528 で考えておりました.
件のライブラリもどきでは,operatorX のみクラス外に公開できればいいので,friend 関数で公開しておりました
その他は(基本的に)(公開すらしたくなかったため)static メンバ関数でのprivate 宣言となりました.

そうしたいようにそう書けばいいのですが今一つ統一感を見えてなかったかもしれません.
>>540
すみません
0547デフォルトの名無しさん (スップ Sd1f-TajK)
垢版 |
2017/09/04(月) 08:11:17.30ID:6a+3L2fAd
>>546
みなさんこれが典型的ななんの役にも立たない回答の好例です
0550 ◆QZaw55cn4c (ワッチョイ a36d-pwmx)
垢版 |
2017/09/04(月) 08:28:42.00ID:CIc3tQw70
>>546
static 関数をpublic に置くか,friend 関数にするかの判断がよくわからないのです.
なにか指針があればうれしいのですが
0563デフォルトの名無しさん (ブーイモ MM1f-Gtnu)
垢版 |
2017/09/04(月) 12:57:07.34ID:KIEUzmnzM
クラス内に定義されたstatic関数は、そのクラスのオブジェクトが存在しなくても使える関数ってのが本来の意味。
動的なオブジェクト状態には依存せず、静的なクラス構造のみに依存するからstaticね。

対してfriendは、自分をさらけ出す人を指定するめのもの。

stream のから呼び出されるオペレーターを定義する時には、既に完成している stream (だけ)に対して自オペレーターをさらけ出してしまうのがいろいろな意味で最も効率的。

以上から、friend関数は、静的ポリモーフィズムを関数レベルでお手軽に実現したいときに使うと思っている。
0565デフォルトの名無しさん (ワンミングク MM9f-KFeJ)
垢版 |
2017/09/04(月) 13:05:20.90ID:ByDgWFhHM
>>561
なんで素っ裸でコートきてんの?露出狂なの?って聞かれて
コート脱いだらちんこ見えるようにする為だよって答えてんのと同じだぞ

まったく…露出狂は社会に出ちゃいけない存在なんだから、もう二度とプログラミングするんじゃないぞ
0567デフォルトの名無しさん (ワッチョイ ff90-D/08)
垢版 |
2017/09/04(月) 15:31:51.46ID:xMNR7APW0
>>565
うまい事言うなあ
friendは「なんで俺にだけ素っ裸見せんの?露出狂なの?」と聞かれて
「だってお前友達じゃん。だからお前にだけ俺の裸見せてやんよ」と言ってるわけだしな」
0568デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 16:26:06.19ID:pd3pCmCq0
あれだろ
日本語のガールフレンドと
英語のgirl friendじゃ意味が違うというアレ
0571デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 17:07:07.44ID:pd3pCmCq0
継承をほとんど使わないってどんな分野だろう
俺んとこではポートを叩くときのプロトコルが
似ているようで少しずつ違うなんての普通にあるし
0579デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 23:45:07.31ID:pd3pCmCq0
そうだね、ニュアンス的にはそっちだ
0583デフォルトの名無しさん (ワッチョイ 33e5-6h2J)
垢版 |
2017/09/05(火) 13:50:03.50ID:MHv2cVQ40
printf("We are the World."); ←わかる
cout << "We are the World" <<endl; ←わからない

printfは「関数」だからわかります。
coutの<<はシフト?よくわからないです。
なぜC++はこんな文字の出力のさせ方にしたんでしょうか?関数じゃダメだったんですか?
0586デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/05(火) 14:04:00.15ID:5KjI8r3d0
>>583
それはまさにC++の作者(以下、禿)が
彼の著書でアピールしていたことだ
coutとは何か? <<とは何か?
記号と意味はどこでどのように関連付いているのか
意味は関数で表記することにしよう
<<の意味を表記する関数の関数名をoperator<<としよう
プログラム言語の命令とデータは動詞と目的語だ
動詞は関数と1対1対応でよいが目的語の定義は動詞の蓄積だ
・・・てな具合
0591デフォルトの名無しさん (ワッチョイ c397-Pjaj)
垢版 |
2017/09/05(火) 18:48:59.76ID:Ol0Fklqi0
using namespace std;
double value = 1.23;
cout << "value = " << value << endl;
0592デフォルトの名無しさん (ワッチョイ 33e4-73wU)
垢版 |
2017/09/05(火) 19:06:29.40ID:/x4Q9Nfh0
>>587
お約束を破っているが流し込んでる感が出ているので芸術点高い
0598デフォルトの名無しさん (ワッチョイ 630d-8qEQ)
垢版 |
2017/09/05(火) 20:04:52.50ID:Xvi9WQb30
数学の演算子とプログラム言語の演算子のことじゃないかな。

+ - は数学とプログラム言語で一致
* / は数学と違うけど文字セットに乗除の記号がないし妥当な代用
<< をシフトに使うのはC系プログラム言語の独特の使い方
だったら << が出力になってもええじゃないか、という話。
■ このスレッドは過去ログ倉庫に格納されています