C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の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 friendなら、その人のプライベートにアクセスできる。それだけの意味。 ある人のfriendなら、その人のプライベートにアクセスできる。 >>531
>>522 をどうかよろしくお願いいたします. >>530
強引にpublic・・・で憶えやすいならそれでいいんじゃね?
ちな俺の憶え方はメンバでないものをどうやってprivateにするんだ、だ あるクラスX内部のstaticでpublicな関数fは、Xのインスタンスの存在に関係なくX::fという名前でアクセスできる。
あるクラスX内部のfriendな関数gは、X内部のプライベートなメンバーm_aにアクセスできる。 >>534
確かに friend 関数は「メンバーじゃない」ですか‥main() と同じような普通の関数なわけですね‥ friendは他のクラスのメンバかも知れない
そういうときも俺の憶え方なら動揺せずに済む メンバ関数より、メンバでもfriendでもない関数を使おう
って誰かが言ってた 欲しい機能がメンバでない関数で使えないとなれば
それはクラスの設計ミスないしはダサい設計だかんな
クラックできちまうのと違う提供すべき機能の欠落 >>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の力でそれができ、めでたくビルドできて動く。
細かい話は規格の人がフォローして☆ホスイ >(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による つまりクラスの外で定義された関数をイメージすればいい
struct A { friend void operator+(A,A) {/**/} };
↓
struct A { friend void operator+(A,A); };
void operator+(A,A) { /**/ } // ただしADLが無いと見えない ドット拡張とかすればいいのにね
int static_value.fanction() = 0; // function専用
vid functionx.function(char*p){} // function専用
ファイル内スコープなんて今時ほとんど使わないから無視するか識別子重なったら同一と見做すかして
ついでにドット型はファイル内の前方参照も無くし宣言を省けるようにするとかさ >>541
>friendがつくことでoperator+()はCのメンバ関数ではなく、グローバルな関数として宣言された
なるほど,そんなところだろうと >>528 で考えておりました.
件のライブラリもどきでは,operatorX のみクラス外に公開できればいいので,friend 関数で公開しておりました
その他は(基本的に)(公開すらしたくなかったため)static メンバ関数でのprivate 宣言となりました.
そうしたいようにそう書けばいいのですが今一つ統一感を見えてなかったかもしれません.
>>540
すみません >>522
static関数とfriendは全然違うし似てるとこなんてない >>546
みなさんこれが典型的ななんの役にも立たない回答の好例です >>546
static 関数をpublic に置くか,friend 関数にするかの判断がよくわからないのです.
なにか指針があればうれしいのですが 呼ぶときにクラス名を書きたいか書きたくないかで判断
コンパイルした結果には大した差はない クラスの外の関数とオーバーロードさせたければfriend
https://ideone.com/Bfcfbq staticはメンバを触れない。friendは触れる。
それくらいしか違いないけどなぁ。
俺、フレンド関数はほとんど書いたことない。 違ったっけ。
staticってthisもってないんじゃなかった? https://ideone.com/qDEfdG
勘違いやったわ。ごめんなさい。
一個勉強になった。 メンバ変数をprotectedにする人ってなんなの?露出狂なの? そういう人が日本に一人二人いるかも知れないけど、気にするだけ損だよ 継承しても触れるようにするためだけど。継承自体がほとんどない。 クラス内に定義されたstatic関数は、そのクラスのオブジェクトが存在しなくても使える関数ってのが本来の意味。
動的なオブジェクト状態には依存せず、静的なクラス構造のみに依存するからstaticね。
対してfriendは、自分をさらけ出す人を指定するめのもの。
stream のから呼び出されるオペレーターを定義する時には、既に完成している stream (だけ)に対して自オペレーターをさらけ出してしまうのがいろいろな意味で最も効率的。
以上から、friend関数は、静的ポリモーフィズムを関数レベルでお手軽に実現したいときに使うと思っている。 表層的に言うと
staticはグローバル関数をクラススコープにして、かつアクセス制御も効くようにしたもの
friendは>>531の通り
ただそれだけのこと >>561
なんで素っ裸でコートきてんの?露出狂なの?って聞かれて
コート脱いだらちんこ見えるようにする為だよって答えてんのと同じだぞ
まったく…露出狂は社会に出ちゃいけない存在なんだから、もう二度とプログラミングするんじゃないぞ >>565
うまい事言うなあ
friendは「なんで俺にだけ素っ裸見せんの?露出狂なの?」と聞かれて
「だってお前友達じゃん。だからお前にだけ俺の裸見せてやんよ」と言ってるわけだしな」 あれだろ
日本語のガールフレンドと
英語のgirl friendじゃ意味が違うというアレ >>565
あんたに決められる筋合いはねー。災いあれ。 friendはクラスの役割を適当に分担しながら実装の隠蔽を図るのにはまあ妥当な仕組みだろうな 継承をほとんど使わないってどんな分野だろう
俺んとこではポートを叩くときのプロトコルが
似ているようで少しずつ違うなんての普通にあるし 複数のクラスのfriendが可能
staticは1個だけ >>567
親しき仲にも礼儀あり。
アクセサぐらい用意するよね。 >>565
>もう二度とプログラミングするんじゃないぞ
わかりました,もう止めます‥ C++のfriendが現実世界の友達と違うのは、最初に決めたやつ以外にfriendを増やすことは全く好ましくない、
という点だろう >>569
publicにしてあるほうが、まだかわいげがあるよ
もう、これからはすべてpublicにしなさい friendじゃなくfamilyが良かった気がする >>578
#define family friend
で行ける? printf("We are the World."); ←わかる
cout << "We are the World" <<endl; ←わからない
printfは「関数」だからわかります。
coutの<<はシフト?よくわからないです。
なぜC++はこんな文字の出力のさせ方にしたんでしょうか?関数じゃダメだったんですか? >>583
<<は演算子オーバーロードだけどcoutなんて使う必要ないよprintfでOK >>583
それはまさにC++の作者(以下、禿)が
彼の著書でアピールしていたことだ
coutとは何か? <<とは何か?
記号と意味はどこでどのように関連付いているのか
意味は関数で表記することにしよう
<<の意味を表記する関数の関数名をoperator<<としよう
プログラム言語の命令とデータは動詞と目的語だ
動詞は関数と1対1対応でよいが目的語の定義は動詞の蓄積だ
・・・てな具合 >>583
シフト演算子を全く別の意味に使う
ひどい設計だと思う cout.<<("We are the World"). <<(endl);
があれば少しはマシだったかね。 >>583
演算子のオーバーロードのよいお題ということで無理矢理ねじこんだんじゃないかな using namespace std;
double value = 1.23;
cout << "value = " << value << endl; >>587
お約束を破っているが流し込んでる感が出ているので芸術点高い +-*/と違って<< がシフト演算子なんて決まってないから「本来と違う」なんて意味なさない vectorオブジェクトが破棄されるとき、要素の解放順は要素順であることは保証されていますか? >>593
いや決まってる
ライブラリを抜きにした純粋な言語ではシフトの意味しかない
元の言語のC言語も同じ
* の方がいろいろな意味で使われている >>596
べつにc/c++の話じゃなく、一般に<<をIOの意味で使ってもなんとも思わんでしょ
+-*/はさすがに刷り込まれている 数学の演算子とプログラム言語の演算子のことじゃないかな。
+ - は数学とプログラム言語で一致
* / は数学と違うけど文字セットに乗除の記号がないし妥当な代用
<< をシフトに使うのはC系プログラム言語の独特の使い方
だったら << が出力になってもええじゃないか、という話。 向きは違うけどbashみたいなイメージだと思ってた 数学では、比較してずっと小さい、ずっと大きいという意味で<<、>>を使うことがあるみたいだが。 >>595
ありがとうございます
保証するにはどうすればいいですか?
ググってstackoverflowとか見たんですが、できないという人もいたり
clear()を使えという人もいてよくわかりません 禿が言い出した<<と
おまいらが言い出す<<では
悪いが社会への影響度がまるで違う
大勢のPGが<<はI/Oだと素直に従うかどうかでだ
新しい言語に旧来の言語と似た記号が出てきたからって
同じ意味でなければならないという法はどこにもない ローテート命令が演算子化されてないのは何故なんだぜ? 自己解決しました
>>604
必要な場面がありまして printfをモダンにアレンジして新規格作ればいいのに。 >>605
それな
俺も時々欲しくなるんだけど
キャリーを含む/含まないとかCHAR_BITの違いとかで
移植性が確保しにくそうだよな
記号を何にするかなんて後から決めりゃいいことだ >>605
ローテートなんて頻繁に使うものじゃないから
ビットが立ってる数を数えるとか、
ビットが立ってる位置を調べるとか、
バイト単位の並び替えとか、
小数から整数へ四捨五入とか、
他にいくらでも足したいものはある 誰がこんなクソ言語つくったんだよ
作者はたぶんバチが当たって禿げてるはず だいたい最初にアスタリスクを乗算演算子にした奴は誰だよ。 operator:=とかoperator!?とか定義できるようにしてくれたら
お前らが度肝を抜くような使い方して見せるのに、残念でならない。 operator?:ならマジで提案してみそ
あわよくば大手柄だぞ >>613
コンパイルエラーになろうが、ソース書くだけなら現状でもできるだろうから、度肝を抜いてくださいな。 >>618
BASICのように=の意味が文脈で変わるべきだと? いやっすいやっす!代入に2タイプも使うのいやっす! >>623
勝手に変えたらどう?
数学はコンパイル不要だから、最初に定義さえすればお前の使いたい記号を好きなだけ使えるよ 自民党の恐怖の言論弾圧が迫る!
売国安倍は憲法改正で国民主権と基本的人権
を奪うつもりだ。 ← 民主主義の崩壊
http://www.data-max.co.jp/280113_ymh_02/
↑ マスコミは 9条しか報道しないが 自民案
の真の恐さは21条など言論の自由を奪うこと
自民案が通ると 政府批判しただけで逮捕されるぞ!
https://www.youtube.com/watch?v=h9x2n5CKhn8
上のビデオで 自民党は 日本人に基本的人権
は必要ないと 異常なことを平気で言う。
http://xn--nyqy26a13k.jp/archives/31687
↑ 都民ファーストも安倍と同じく 憲法改正で 人権
無視の大日本帝国憲法に戻すつもりだから
絶対に投票してはだめだ。 民主主義が崩壊する
http://blog.goo.ne.jp/ngc2497/e/8899f65988fe0f35496934dc972e2489
↑ ネトウヨ= 安倍サポーター工作員はネットで国民を騙す。
https://dot.asahi.com/aera/2016071100108.html?page=3
http://blog.goo.ne.jp/kimito39/e/c0dd73d58121b6446cf4165c96ebb674
↑ 安倍自民を操るカルト右翼「日本会議」は国民主権否定。
国民投票や選挙では自民党、維新、小池新党に絶対に入れるな。 2003年8月の第1回から2007年3月の第6回までいずれも中国北京で計9次の会合が行なわれた
話し合いで解決しなかった
原爆、弾道ミサイルの開発にカネ、時間を与えてしまった
軍事力でつぶすしかないのに、まだこんなこといってる
,,-―--、
|:::::::::::::;;;ノ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::::::::::( 」 < 対話で解決しよう
ノノノ ヽ_l \______________
,,-┴―┴- 、 ∩_
/,|┌-[]─┐| \ ( ノ
/ ヽ| | バ | '、/\ / /
/ `./| | カ | |\ /
\ ヽ| lゝ | | \__/
\ |  ̄ ̄ ̄ |
⊂|______|
|l_l i l_l |
| ┬ >>623
数学は、最初に定義さえすれば自由にしていいんだよ。 プログラミング勉強し始めた初心者ですが
手詰まりになったので質問させてください
ttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_C&lang=jp
この問題をやっていますが、以下のコードで「Time Limit Exceeded」となってしまいます
他の正解者のコード見てもやってることは同じな気がするのですが
なにがいけないのでしょうか?
C++14コード
ttp://codepad.org/2Yxb33Ab ■ このスレッドは過去ログ倉庫に格納されています