次スレを立てる時は本文の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
探検
C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 3b96-ov1m)
2017/07/29(土) 11:28:28.97ID:o30VDF4g0494はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff15-X0kF)
2017/08/31(木) 23:59:46.91ID:Ev17QaWq0 イテレータに限らないけど抽象化されたものは抽象化されたままで扱わないと抽象化した意味がなくて、
(内部の実装を意識しなきゃならないのなら抽象化の甲斐が無い。)
一方では、その抽象化を作る側になることもあるので抽象化が出来上がるまでは抽象化の内側も知ってなきゃいけない。
つまり、層を積み重ねるたびに抽象化の壁を作っていくってのがプログラムを構成する基本的なやり方だろう。
だから、プリミティブな方から積み重ねながらその抽象化が意味するところを学ぶってのは普通の方法だと思う。
そういう意味で >>493 に賛成。
抽象化の内側を知ってしまった人が抽象化の壁の向こうを忘れて抽象化されたものとしてだけ
扱うってのはそれなりにセンスがいるんじゃないかとも思うんだけど、
C/C++ の背景にあるセマンティクスは良くも悪くも機械の理屈なんで、
どうあがいても高級アセンブラだと割り切って泥臭いポインタの側から学ぶのがいいと私は思うよ。
その泥臭いところを頑張って隠してるのが C++ ってもんなんで、
泥臭いところを知ったら C++ の色んな機能が「あー、こういうの欲しかったわー」ってなってありがたみを感じる。
(内部の実装を意識しなきゃならないのなら抽象化の甲斐が無い。)
一方では、その抽象化を作る側になることもあるので抽象化が出来上がるまでは抽象化の内側も知ってなきゃいけない。
つまり、層を積み重ねるたびに抽象化の壁を作っていくってのがプログラムを構成する基本的なやり方だろう。
だから、プリミティブな方から積み重ねながらその抽象化が意味するところを学ぶってのは普通の方法だと思う。
そういう意味で >>493 に賛成。
抽象化の内側を知ってしまった人が抽象化の壁の向こうを忘れて抽象化されたものとしてだけ
扱うってのはそれなりにセンスがいるんじゃないかとも思うんだけど、
C/C++ の背景にあるセマンティクスは良くも悪くも機械の理屈なんで、
どうあがいても高級アセンブラだと割り切って泥臭いポインタの側から学ぶのがいいと私は思うよ。
その泥臭いところを頑張って隠してるのが C++ ってもんなんで、
泥臭いところを知ったら C++ の色んな機能が「あー、こういうの欲しかったわー」ってなってありがたみを感じる。
495デフォルトの名無しさん (ワッチョイ 33e4-p7en)
2017/09/01(金) 00:30:44.48ID:oWX+X4Ay0 ストラウストラップが言うにはC++は
低レイヤーにアクセスできる機能とオーバーヘッドが無く使いやすいように隠蔽できる機能を持っている言語というようなことを言っていて
低レイヤーの部分を知らなくていいとは言っていない
低レイヤーにアクセスできる機能とオーバーヘッドが無く使いやすいように隠蔽できる機能を持っている言語というようなことを言っていて
低レイヤーの部分を知らなくていいとは言っていない
496デフォルトの名無しさん (ワッチョイ 334d-6h2J)
2017/09/01(金) 01:02:22.22ID:E+DzN2Xf0 アセンブラの代替言語なのだから当たり前だ。用途もOSやドライバ、マイコン向けばかりだ。
COBOL、FortranやPerl、C#やJavaの代わりに使う人などいない。
低層を隠蔽する機能などお呼びではない。
COBOL、FortranやPerl、C#やJavaの代わりに使う人などいない。
低層を隠蔽する機能などお呼びではない。
497デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/01(金) 02:01:03.59ID:2msaHTP30 いやCOBOLの代わりには使うぞ
Fortranの代わりつーとCな客はいたねえ
Fortranの代わりつーとCな客はいたねえ
498デフォルトの名無しさん (ワッチョイ cf51-tIp8)
2017/09/02(土) 16:34:51.42ID:Vkplowcj0 http://opencv.jp/cookbook/opencv_img.html#image-resize
ここのソースコードをコピペしてコンパイルしようとしたのですが
関数 `cv::Mat::release()' 内:
test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): `cv::Mat::deallocate()' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
このようなエラー文が出てしまいます
使っているOSはdebian stretchです
/usr/include/opencv2には必要なファイルはありました
どのようにコンパイルすればいいのでしょうか
ここのソースコードをコピペしてコンパイルしようとしたのですが
関数 `cv::Mat::release()' 内:
test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): `cv::Mat::deallocate()' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
このようなエラー文が出てしまいます
使っているOSはdebian stretchです
/usr/include/opencv2には必要なファイルはありました
どのようにコンパイルすればいいのでしょうか
499デフォルトの名無しさん (ワッチョイ 6309-8f0a)
2017/09/02(土) 16:50:32.70ID:8FAKxNXu0 環境依存すれってなくなったの?
501片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd1f-dw5s)
2017/09/02(土) 17:01:02.17ID:bEjlZdoBd >>500
【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]??2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1500329247/
【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]??2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1500329247/
502デフォルトの名無しさん (ワッチョイ 6309-8f0a)
2017/09/02(土) 17:02:35.03ID:8FAKxNXu0 ないすー。
503デフォルトの名無しさん (ワッチョイ cf51-tIp8)
2017/09/02(土) 17:03:12.44ID:Vkplowcj0504デフォルトの名無しさん (スプッッ Sd1f-WnLs)
2017/09/02(土) 18:03:57.34ID:qkqtxzLpd c++に限った話じゃないんだけど参考書
とかだとメソッドの後にフィールドが
書かれてる事が多いようだけど、それが
一般的なの?
とかだとメソッドの後にフィールドが
書かれてる事が多いようだけど、それが
一般的なの?
505デフォルトの名無しさん (ワッチョイ fff0-6h2J)
2017/09/02(土) 18:45:42.87ID:qDvIb2f40 ちがう
一般的にはフィールドたるメンバ変数の方が先に来る
学習の都合で、メンバ変数を先に説明した方が、どう考えてもラク
メンバ関数を先に説明すると、入門書を読むレベルの初心者は間違いなく混乱するので、そんな参考書はまず見かけない
そもそもメソッドの中で使う変数は始めに宣言しておかないと使えない
結論としてはあなたが用語の取り違えをしてる……としか
一般的にはフィールドたるメンバ変数の方が先に来る
学習の都合で、メンバ変数を先に説明した方が、どう考えてもラク
メンバ関数を先に説明すると、入門書を読むレベルの初心者は間違いなく混乱するので、そんな参考書はまず見かけない
そもそもメソッドの中で使う変数は始めに宣言しておかないと使えない
結論としてはあなたが用語の取り違えをしてる……としか
506デフォルトの名無しさん (ワッチョイ ffaa-6h2J)
2017/09/02(土) 19:04:41.89ID:4lafg32N0 クラスのレイアウトの話じゃなくて?
507デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
2017/09/02(土) 19:23:47.80ID:FGRVT/X40 レイアウト、というとデータの並び順の意味にとられかねず語弊がある
508デフォルトの名無しさん (ワッチョイ ffaa-6h2J)
2017/09/02(土) 19:28:16.32ID:4lafg32N0 じゃあ宣言の順序
509デフォルトの名無しさん (ワッチョイ 33e4-73wU)
2017/09/02(土) 19:57:46.29ID:l0rE+2Xa0 public、protected、privateの順に書いていくと
自然と変数はpublic関数の次に来るわ
自然と変数はpublic関数の次に来るわ
510デフォルトの名無しさん (ワッチョイ 2304-k/3h)
2017/09/02(土) 21:02:43.47ID:EU1kDRi00 普通アクセス修飾子の順じゃなくてフィールド→メソッドの順じゃないの
カプセル化するから変数なんてほとんどprivateだろうし
変数は変数でまとめて書いてもらわないと混乱する
カプセル化するから変数なんてほとんどprivateだろうし
変数は変数でまとめて書いてもらわないと混乱する
511デフォルトの名無しさん (ワッチョイ ff32-X0kF)
2017/09/02(土) 21:08:20.92ID:Wuw432Mc0 ユーザーにとって重要な項目から順に書く
つまり、public→protected→privateで
ユーザーに見せる必要のないprivateは一番下で
つまり、public→protected→privateで
ユーザーに見せる必要のないprivateは一番下で
512デフォルトの名無しさん (ワッチョイ 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との互換性のために仕様がワケワカメになった例
メンバ関数の定義がメンバ関数内で使用するメンバ変数の宣言に先行する場合も実験する限り合法
(規格に具体的にどういう文言で規定してあるのかは知らん
まあ定義時点で不完全な型やら値やらはテンプレートの定義で頻出するから
あんま定義と宣言の順序にこだわらない処理系の作りなのだと納得しておく
しかしなぜかテンプレートの引数でない型の定義(または宣言)と使用には厳格な順序を求められる…
次のコードはビルドが通らない
class Baz {
// struct Bar; // 左のコメントアウトを外したら逝ける
void foo(Bar& b);
struct Bar { int x, y; }
};
多分Cとの互換性のために仕様がワケワカメになった例
513デフォルトの名無しさん (ワッチョイ 53e3-KFeJ)
2017/09/02(土) 21:17:46.72ID:RAQSA3Kg0 ルールが存在してwell documentedで、ガバナンスがきいていることが重要
お前らのオレオレ哲学なんかどうでもいい
お前らのオレオレ哲学なんかどうでもいい
514デフォルトの名無しさん (ワッチョイ 2304-k/3h)
2017/09/02(土) 21:19:59.11ID:EU1kDRi00 ああそっか、プロトタイプ宣言しなきゃいけないんだっけC++は
C#の脳で考えてたわ
C#の脳で考えてたわ
515デフォルトの名無しさん (オッペケ Src7-mvsT)
2017/09/02(土) 21:51:57.26ID:MiX3UcgLr >変数の宣言と関数の宣言の順序がどうでも良いのは自明
自明かねぇ
C++11は問題になる例が思いつかないがC++98,03,14はどうでも良くない
自明かねぇ
C++11は問題になる例が思いつかないがC++98,03,14はどうでも良くない
516デフォルトの名無しさん (ワッチョイ 7f89-eV1K)
2017/09/02(土) 22:01:20.86ID:VLpwNclp0 コンストラクタ実行時のメンバ変数の初期化の実行順が、初期化子の記述順ではなくクラス定義での並び順に従うっていうのがあった気がするけど、新しい規格では変わったんだっけ?
517デフォルトの名無しさん (ワッチョイ bf91-b8Mh)
2017/09/02(土) 22:10:24.95ID:pFkNGMyF0518デフォルトの名無しさん (オッペケ 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).
微妙な表現以外、特に変わったという話は聞いたことがない
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).
519デフォルトの名無しさん (ワッチョイ 637f-6h2J)
2017/09/02(土) 22:37:32.53ID:i6uhqYA10 >C++11は問題になる例が思いつかないがC++98,03,14はどうでも良くない
とか書いてるから何か制約が無くなるような変更があったのかと思って聞いたんでない?
とか書いてるから何か制約が無くなるような変更があったのかと思って聞いたんでない?
520デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
2017/09/02(土) 22:39:43.42ID:FGRVT/X40 ちな漏れがどうでもよい(どんな順序でも問題ない)と言ったのは
変数の宣言と関数の宣言の順序(どちらを先にするか)だからな
これ豆な
変数の宣言と関数の宣言の順序(どちらを先にするか)だからな
これ豆な
521デフォルトの名無しさん (オッペケ Src7-mvsT)
2017/09/02(土) 23:00:05.29ID:MiX3UcgLr C++11でもこれがあったか
struct A {
int m;
decltype(m) /*←mは先に宣言が必要*/ f() { return m; /*←mは後でもいい*/ }
};
C++11で緩和されたのは11章のどっか(忘れた)
struct A {
int m;
decltype(m) /*←mは先に宣言が必要*/ f() { return m; /*←mは後でもいい*/ }
};
C++11で緩和されたのは11章のどっか(忘れた)
522デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
2017/09/03(日) 15:24:44.62ID:5WRYI1ZX0 static メンバ関数と friend 関数の使い分けについて教えてください
どちらも似た機能だと思ってしまうのですが‥
どちらも似た機能だと思ってしまうのですが‥
523はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff15-X0kF)
2017/09/03(日) 15:42:16.65ID:XXf7E2cS0 あ〜、そんなこと考えたことなかったけど、クラス (メンバ関数) 内部から見たら近いっちゃ近いのかも?
クラスを定義する側じゃなくてそのクラスを使う側の気持ちで考えて。
クラスを定義する側じゃなくてそのクラスを使う側の気持ちで考えて。
524デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
2017/09/03(日) 15:47:48.54ID:5WRYI1ZX0 friend 関数は public で,static メンバ関数は private で,て感じでこの前は書きました
普通はどうするものかをお聞きしたいところです
普通はどうするものかをお聞きしたいところです
525はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff15-X0kF)
2017/09/03(日) 15:55:23.63ID:XXf7E2cS0 すまんけど自明すぎてどう使い分けるとか説明できない。
使い分け以前にそもそも理解できているか怪しいと思う。
使い分け以前にそもそも理解できているか怪しいと思う。
526デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
2017/09/03(日) 16:12:00.06ID:5WRYI1ZX0 何度も宣伝するようで気が引けますが,前に書いたのは >>158
演算子のオーバーロードに絡むものは基本 friend で,内輪で使うものは private の static メンバ関数で,
くらいの線引きをしています.
書いてみてわかったのは「自明」という感じはしないこと,かな,考えてみれば friend 関数って他の言語にはなさそうです
演算子のオーバーロードに絡むものは基本 friend で,内輪で使うものは private の static メンバ関数で,
くらいの線引きをしています.
書いてみてわかったのは「自明」という感じはしないこと,かな,考えてみれば friend 関数って他の言語にはなさそうです
527デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/03(日) 16:48:05.14ID:jXGwZqzU0 何で? operatorはグローバルに出さなくても多重定義候補に挙がるぞ
俺は別の理由でoperatorをグローバルにする傾向があるが
俺は別の理由でoperatorをグローバルにする傾向があるが
>>527
http://codepad.org/8Z3c2obA
ほー,これは不思議だなあ‥
friend をはずすとコンパイルできない
friend をつけてしまうと public に置こうが private に置こうが関係ない,という認識であっていますか?
http://codepad.org/8Z3c2obA
ほー,これは不思議だなあ‥
friend をはずすとコンパイルできない
friend をつけてしまうと public に置こうが private に置こうが関係ない,という認識であっていますか?
529デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/03(日) 17:23:08.48ID:jXGwZqzU0 何が不思議?
friendを外すとメンバoperator+に過剰な仮引数となりエラー
friendは「メンバではない」のでアクセス指定は無関係
1点だけ気になるのが、friendは当該クラス自体と同じスコープに新しい識別子を導入しないはず・・・
識別子はoperator+で、これのみは某か標準のヘッダで既に宣言されているということか?
friendを外すとメンバoperator+に過剰な仮引数となりエラー
friendは「メンバではない」のでアクセス指定は無関係
1点だけ気になるのが、friendは当該クラス自体と同じスコープに新しい識別子を導入しないはず・・・
識別子はoperator+で、これのみは某か標準のヘッダで既に宣言されているということか?
>>529
>operator+に過剰な仮引数となりエラー
つまり operator+ の >>528 とは違うもう一つの呼び出し書式にしないといけないわけですね.
でもこの場合は private に置くとコンパイルできない
http://codepad.org/RLo9fKuI
friend はアクセス制御如何にかかわらず「強引にpublic にする」ように見えますね‥わからない‥
>operator+に過剰な仮引数となりエラー
つまり operator+ の >>528 とは違うもう一つの呼び出し書式にしないといけないわけですね.
でもこの場合は private に置くとコンパイルできない
http://codepad.org/RLo9fKuI
friend はアクセス制御如何にかかわらず「強引にpublic にする」ように見えますね‥わからない‥
531片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd1f-dw5s)
2017/09/03(日) 17:31:44.96ID:zmbOaeS6d friendなら、その人のプライベートにアクセスできる。それだけの意味。
532片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd1f-dw5s)
2017/09/03(日) 17:33:29.06ID:zmbOaeS6d ある人のfriendなら、その人のプライベートにアクセスできる。
533デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
2017/09/03(日) 17:36:12.98ID:5WRYI1ZX0534デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/03(日) 17:39:19.97ID:jXGwZqzU0535片山博文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にアクセスできる。
あるクラスX内部のfriendな関数gは、X内部のプライベートなメンバーm_aにアクセスできる。
536デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
2017/09/03(日) 17:42:36.39ID:5WRYI1ZX0 >>534
確かに friend 関数は「メンバーじゃない」ですか‥main() と同じような普通の関数なわけですね‥
確かに friend 関数は「メンバーじゃない」ですか‥main() と同じような普通の関数なわけですね‥
537デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/03(日) 19:02:31.58ID:jXGwZqzU0 friendは他のクラスのメンバかも知れない
そういうときも俺の憶え方なら動揺せずに済む
そういうときも俺の憶え方なら動揺せずに済む
538デフォルトの名無しさん (ワッチョイ ff32-X0kF)
2017/09/03(日) 19:05:08.53ID:/S0gLPFy0 メンバ関数より、メンバでもfriendでもない関数を使おう
って誰かが言ってた
って誰かが言ってた
539デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/03(日) 19:11:23.65ID:jXGwZqzU0 欲しい機能がメンバでない関数で使えないとなれば
それはクラスの設計ミスないしはダサい設計だかんな
クラックできちまうのと違う提供すべき機能の欠落
それはクラスの設計ミスないしはダサい設計だかんな
クラックできちまうのと違う提供すべき機能の欠落
540デフォルトの名無しさん (ワッチョイ ff90-D/08)
2017/09/03(日) 19:52:56.95ID:yMO/rU630 またクズが暴れてるのか・・・
541デフォルトの名無しさん (ワッチョイ 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の力でそれができ、めでたくビルドできて動く。
細かい話は規格の人がフォローして☆ホスイ
(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の力でそれができ、めでたくビルドできて動く。
細かい話は規格の人がフォローして☆ホスイ
542デフォルトの名無しさん (オッペケ 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による
最も近い(内側の)名前空間の関数になる(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による
543デフォルトの名無しさん (オッペケ 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が無いと見えない
struct A { friend void operator+(A,A) {/**/} };
↓
struct A { friend void operator+(A,A); };
void operator+(A,A) { /**/ } // ただしADLが無いと見えない
544デフォルトの名無しさん (ワッチョイ b3e4-7rWm)
2017/09/03(日) 21:38:57.90ID:ipvja13x0 ドット拡張とかすればいいのにね
int static_value.fanction() = 0; // function専用
vid functionx.function(char*p){} // function専用
ファイル内スコープなんて今時ほとんど使わないから無視するか識別子重なったら同一と見做すかして
ついでにドット型はファイル内の前方参照も無くし宣言を省けるようにするとかさ
int static_value.fanction() = 0; // function専用
vid functionx.function(char*p){} // function専用
ファイル内スコープなんて今時ほとんど使わないから無視するか識別子重なったら同一と見做すかして
ついでにドット型はファイル内の前方参照も無くし宣言を省けるようにするとかさ
546デフォルトの名無しさん (ワッチョイ 636f-U1rl)
2017/09/04(月) 06:46:46.49ID:bUZLYHBF0 >>522
static関数とfriendは全然違うし似てるとこなんてない
static関数とfriendは全然違うし似てるとこなんてない
547デフォルトの名無しさん (スップ Sd1f-TajK)
2017/09/04(月) 08:11:17.30ID:6a+3L2fAd >>546
みなさんこれが典型的ななんの役にも立たない回答の好例です
みなさんこれが典型的ななんの役にも立たない回答の好例です
548デフォルトの名無しさん (ドコグロ MM47-2CmY)
2017/09/04(月) 08:13:10.29ID:t0m5bmxTM 煽ることしかできない奴乙
549デフォルトの名無しさん (スップ Sd1f-sFCB)
2017/09/04(月) 08:17:12.97ID:MR3pz7f3d >>546
共通点はある
共通点はある
551デフォルトの名無しさん (スップ Sd1f-sFCB)
2017/09/04(月) 08:37:44.08ID:MR3pz7f3d 呼ぶときにクラス名を書きたいか書きたくないかで判断
コンパイルした結果には大した差はない
コンパイルした結果には大した差はない
552デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/04(月) 08:51:25.02ID:EfQNUMljd staticだとADLに引っ掛からないとか?
553デフォルトの名無しさん (ワッチョイ ff4b-Tcdr)
2017/09/04(月) 09:10:00.24ID:s4lmvNao0 クラスの外の関数とオーバーロードさせたければfriend
https://ideone.com/Bfcfbq
https://ideone.com/Bfcfbq
554デフォルトの名無しさん (ササクッテロル Spc7-/nQp)
2017/09/04(月) 10:13:49.53ID:roJHcSrip なんでこんなどうでもいいことで30も消費してんの
555デフォルトの名無しさん (ワッチョイ 6309-8f0a)
2017/09/04(月) 10:38:52.68ID:Ly8n+qhB0 staticはメンバを触れない。friendは触れる。
それくらいしか違いないけどなぁ。
俺、フレンド関数はほとんど書いたことない。
それくらいしか違いないけどなぁ。
俺、フレンド関数はほとんど書いたことない。
556デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/04(月) 10:42:45.81ID:EfQNUMljd >>555
?
?
557デフォルトの名無しさん (ワッチョイ 6309-8f0a)
2017/09/04(月) 10:44:19.85ID:Ly8n+qhB0 違ったっけ。
staticってthisもってないんじゃなかった?
staticってthisもってないんじゃなかった?
558デフォルトの名無しさん (ワッチョイ 6309-8f0a)
2017/09/04(月) 11:03:17.00ID:Ly8n+qhB0559デフォルトの名無しさん (ワンミングク MM9f-KFeJ)
2017/09/04(月) 11:51:31.64ID:ByDgWFhHM メンバ変数をprotectedにする人ってなんなの?露出狂なの?
560デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/04(月) 11:55:13.79ID:EfQNUMljd そういう人が日本に一人二人いるかも知れないけど、気にするだけ損だよ
561デフォルトの名無しさん (ワッチョイ 6309-8f0a)
2017/09/04(月) 12:17:47.72ID:Ly8n+qhB0 継承しても触れるようにするためだけど。継承自体がほとんどない。
562デフォルトの名無しさん (ワッチョイ 636f-U1rl)
2017/09/04(月) 12:51:51.83ID:bUZLYHBF0 >>558
勘違いというのが勘違い
勘違いというのが勘違い
563デフォルトの名無しさん (ブーイモ MM1f-Gtnu)
2017/09/04(月) 12:57:07.34ID:KIEUzmnzM クラス内に定義されたstatic関数は、そのクラスのオブジェクトが存在しなくても使える関数ってのが本来の意味。
動的なオブジェクト状態には依存せず、静的なクラス構造のみに依存するからstaticね。
対してfriendは、自分をさらけ出す人を指定するめのもの。
stream のから呼び出されるオペレーターを定義する時には、既に完成している stream (だけ)に対して自オペレーターをさらけ出してしまうのがいろいろな意味で最も効率的。
以上から、friend関数は、静的ポリモーフィズムを関数レベルでお手軽に実現したいときに使うと思っている。
動的なオブジェクト状態には依存せず、静的なクラス構造のみに依存するからstaticね。
対してfriendは、自分をさらけ出す人を指定するめのもの。
stream のから呼び出されるオペレーターを定義する時には、既に完成している stream (だけ)に対して自オペレーターをさらけ出してしまうのがいろいろな意味で最も効率的。
以上から、friend関数は、静的ポリモーフィズムを関数レベルでお手軽に実現したいときに使うと思っている。
564デフォルトの名無しさん (ワッチョイ 636f-U1rl)
2017/09/04(月) 13:03:46.35ID:bUZLYHBF0565デフォルトの名無しさん (ワンミングク MM9f-KFeJ)
2017/09/04(月) 13:05:20.90ID:ByDgWFhHM >>561
なんで素っ裸でコートきてんの?露出狂なの?って聞かれて
コート脱いだらちんこ見えるようにする為だよって答えてんのと同じだぞ
まったく…露出狂は社会に出ちゃいけない存在なんだから、もう二度とプログラミングするんじゃないぞ
なんで素っ裸でコートきてんの?露出狂なの?って聞かれて
コート脱いだらちんこ見えるようにする為だよって答えてんのと同じだぞ
まったく…露出狂は社会に出ちゃいけない存在なんだから、もう二度とプログラミングするんじゃないぞ
566デフォルトの名無しさん (ワッチョイ 334d-6h2J)
2017/09/04(月) 13:05:58.55ID:ws3TkDjE0 仕様がグダグダですな。
567デフォルトの名無しさん (ワッチョイ ff90-D/08)
2017/09/04(月) 15:31:51.46ID:xMNR7APW0568デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/04(月) 16:26:06.19ID:pd3pCmCq0 あれだろ
日本語のガールフレンドと
英語のgirl friendじゃ意味が違うというアレ
日本語のガールフレンドと
英語のgirl friendじゃ意味が違うというアレ
569デフォルトの名無しさん (ワッチョイ 6309-8f0a)
2017/09/04(月) 16:40:24.27ID:Ly8n+qhB0 >>565
あんたに決められる筋合いはねー。災いあれ。
あんたに決められる筋合いはねー。災いあれ。
570デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/04(月) 16:58:13.05ID:EfQNUMljd friendはクラスの役割を適当に分担しながら実装の隠蔽を図るのにはまあ妥当な仕組みだろうな
571デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/04(月) 17:07:07.44ID:pd3pCmCq0 継承をほとんど使わないってどんな分野だろう
俺んとこではポートを叩くときのプロトコルが
似ているようで少しずつ違うなんての普通にあるし
俺んとこではポートを叩くときのプロトコルが
似ているようで少しずつ違うなんての普通にあるし
572デフォルトの名無しさん (スップ Sd1f-sFCB)
2017/09/04(月) 17:13:32.82ID:MR3pz7f3d 複数のクラスのfriendが可能
staticは1個だけ
staticは1個だけ
573デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/04(月) 17:15:33.44ID:EfQNUMljd ダックタイピングじゃね?
574デフォルトの名無しさん (ドコグロ MMdf-CPXF)
2017/09/04(月) 18:52:24.45ID:s+p5aXGeM575デフォルトの名無しさん (ワッチョイ a36d-pwmx)
2017/09/04(月) 19:06:46.17ID:CIc3tQw70576デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/04(月) 19:28:25.71ID:EfQNUMljd C++のfriendが現実世界の友達と違うのは、最初に決めたやつ以外にfriendを増やすことは全く好ましくない、
という点だろう
という点だろう
577デフォルトの名無しさん (ワンミングク MM9f-KFeJ)
2017/09/04(月) 19:58:54.95ID:ByDgWFhHM578デフォルトの名無しさん (ワッチョイ d3c9-Rh8o)
2017/09/04(月) 23:34:49.89ID:jzRaTvEE0 friendじゃなくfamilyが良かった気がする
579デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/04(月) 23:45:07.31ID:pd3pCmCq0 そうだね、ニュアンス的にはそっちだ
580デフォルトの名無しさん (ワッチョイ a34b-hEpb)
2017/09/05(火) 10:50:00.46ID:D99g/mXF0581デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/05(火) 12:19:42.29ID:FAzSlJ+ld #define amigo friend
582デフォルトの名無しさん (ワッチョイ ff9f-QSye)
2017/09/05(火) 12:30:05.08ID:eN2J5TsS0 #define brother friend
583デフォルトの名無しさん (ワッチョイ 33e5-6h2J)
2017/09/05(火) 13:50:03.50ID:MHv2cVQ40 printf("We are the World."); ←わかる
cout << "We are the World" <<endl; ←わからない
printfは「関数」だからわかります。
coutの<<はシフト?よくわからないです。
なぜC++はこんな文字の出力のさせ方にしたんでしょうか?関数じゃダメだったんですか?
cout << "We are the World" <<endl; ←わからない
printfは「関数」だからわかります。
coutの<<はシフト?よくわからないです。
なぜC++はこんな文字の出力のさせ方にしたんでしょうか?関数じゃダメだったんですか?
584デフォルトの名無しさん (ワッチョイ bf91-6h2J)
2017/09/05(火) 13:54:25.72ID:5+GcycqS0 方法が増えただけ
以前どおり関数でも大丈夫だよ
以前どおり関数でも大丈夫だよ
585デフォルトの名無しさん (ワッチョイ 636f-U1rl)
2017/09/05(火) 14:03:50.06ID:CTfci4Vl0 >>583
<<は演算子オーバーロードだけどcoutなんて使う必要ないよprintfでOK
<<は演算子オーバーロードだけどcoutなんて使う必要ないよprintfでOK
586デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/05(火) 14:04:00.15ID:5KjI8r3d0 >>583
それはまさにC++の作者(以下、禿)が
彼の著書でアピールしていたことだ
coutとは何か? <<とは何か?
記号と意味はどこでどのように関連付いているのか
意味は関数で表記することにしよう
<<の意味を表記する関数の関数名をoperator<<としよう
プログラム言語の命令とデータは動詞と目的語だ
動詞は関数と1対1対応でよいが目的語の定義は動詞の蓄積だ
・・・てな具合
それはまさにC++の作者(以下、禿)が
彼の著書でアピールしていたことだ
coutとは何か? <<とは何か?
記号と意味はどこでどのように関連付いているのか
意味は関数で表記することにしよう
<<の意味を表記する関数の関数名をoperator<<としよう
プログラム言語の命令とデータは動詞と目的語だ
動詞は関数と1対1対応でよいが目的語の定義は動詞の蓄積だ
・・・てな具合
587デフォルトの名無しさん (スッップ Sd1f-sFCB)
2017/09/05(火) 17:31:12.14ID:LcvSXQg0d588デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/05(火) 18:16:33.48ID:FAzSlJ+ld それほどでもない
589デフォルトの名無しさん (ドコグロ MM1f-CPXF)
2017/09/05(火) 18:16:37.41ID:deDONG/TM cout.<<("We are the World"). <<(endl);
があれば少しはマシだったかね。
があれば少しはマシだったかね。
590デフォルトの名無しさん (ワッチョイ a36d-pwmx)
2017/09/05(火) 18:45:41.20ID:fgaIXgJY0 >>583
演算子のオーバーロードのよいお題ということで無理矢理ねじこんだんじゃないかな
演算子のオーバーロードのよいお題ということで無理矢理ねじこんだんじゃないかな
591デフォルトの名無しさん (ワッチョイ c397-Pjaj)
2017/09/05(火) 18:48:59.76ID:Ol0Fklqi0 using namespace std;
double value = 1.23;
cout << "value = " << value << endl;
double value = 1.23;
cout << "value = " << value << endl;
592デフォルトの名無しさん (ワッチョイ 33e4-73wU)
2017/09/05(火) 19:06:29.40ID:/x4Q9Nfh0 >>587
お約束を破っているが流し込んでる感が出ているので芸術点高い
お約束を破っているが流し込んでる感が出ているので芸術点高い
593デフォルトの名無しさん (スプッッ Sd1f-gM2o)
2017/09/05(火) 19:25:16.50ID:FAzSlJ+ld +-*/と違って<< がシフト演算子なんて決まってないから「本来と違う」なんて意味なさない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【YouTuber】バイク事故で入院のゆたぼん、振込で「お見舞金」募る [muffin★]
- 高市早苗首相、消費税減税に後ろ向き 足かせはレジシステム? 「責任ある積極財政」期待高いが [蚤の市★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 低所得層のマクドナルド離れが深刻に 広がる「ファストフード格差」の真相 米国 [少考さん★]
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★7 [七波羅探題★]
- 「そんなに米国が言う通りにやりたいのか」小泉氏、防衛費増額で立民・後藤祐一氏に反論 [少考さん★]
- 中国がここまで過敏になるのは日本に前科があるから。盧溝橋、満州事変。ジャップの先制攻撃は挙げればキリがないけど [472617201]
- 犬って顔くっつけて寝たがるよな
- 【悲報】JA「全然米が売れなくて倉庫を圧迫してる。助けて!」米卸売り業者「安売りしたら赤字になる…助けて!」 [802034645]
- ひらがなの"ふ"、"な"がかけないFラン新入社員に激怒。学歴フィルターは必要と厳格化に踏み切った企業 [737440712]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ★4 [597533159]
- 実際、朝7~8時の電車通勤は確実にQOL下げてるけど、心に余裕のない社畜にそれ言ったら炎上するよな [315293707]
