C++相談室 part131 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
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
264デフォルトの名無しさん (ワッチョイ ca32-2x4P)
垢版 |
2017/08/24(木) 11:04:12.57ID:h3Bt5TkH0
プロパティじゃないと出来ないことってなになの
2017/08/24(木) 11:21:59.10ID:ItTZCijS0
見た目だけじゃね?
266デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/24(木) 11:45:56.43ID:VdsYrxcW0
IDEがやれば済むこと
わざわざ言語に入れる必要なし!
2017/08/24(木) 12:19:36.07ID:TzTK1OIfM
メンバ変数と関数の呼び出し統一化。
いらんというのは同意。
2017/08/24(木) 14:05:25.76ID:5zDLSTW70
オブジェクトの状態と操作の区別
関数でも代用できてしまうけど、変数のように扱えるってのが大きい
変数のような使い方で処理を挟める、これはPublicなメンバ変数では出来ない
269デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/24(木) 14:20:51.13ID:VdsYrxcW0
できるよバーカ
C++98より前、ARM C++の時代から
2017/08/24(木) 17:42:35.34ID:hLrI3YRl0
たしかに、operator()とoperator=があればできそうではある
2017/08/24(木) 18:28:45.68ID:dK94ZXMf0
>>269
どうやって?コードよろ
2017/08/24(木) 18:48:22.87ID:hLrI3YRl0
ARMだとテンプレートないから、メンバ変数にしたい型ごとにラッパークラス作らないいけないから大変そう
2017/08/24(木) 18:52:57.63ID:4nWMkj3x0
質問ですが
std::string str("abcdefghi"); // (*1)
str.resize(8); // (*2)
size_t len = strlen(str.c_str()); // <-- "abcdefgh\0"の長さが返る (*3)
となるのですが、(*3)の時点でできる終端NUL文字"\0"って、
いつのタイミングでどこの領域に確保されるのですか、
2017/08/24(木) 18:54:42.67ID:4nWMkj3x0
訂正
×:、(*3)の時点でできる
○:、(*3)の時点でできている
2017/08/24(木) 19:23:39.06ID:hLrI3YRl0
ARMテンプレートあったわ。失礼
2017/08/24(木) 20:00:39.22ID:kJk0ElnZ0
>>270
そのスマートオブジェクトをメンバ変数にした場合、一々親へのポインタをそのスマートオブジェクトに記憶してやらんといけないからすごく面倒なのだよ
プロパティはその点何の束縛もないから良いのだ
277デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/24(木) 20:11:18.34ID:VdsYrxcW0
>>272
アフォwww
template と try catch それと typeid はARMで新設されたんだよ
おまえ多重継承だけだと思ってんだろ
2017/08/24(木) 20:14:15.85ID:G5OnAPYO0
>>273
*1の時点であるよ
2017/08/24(木) 20:17:27.08ID:LSCbdyW40
>>273
(*2)の時点で 'i' があった場所に置かれる、

と素朴に思ってた
280デフォルトの名無しさん
垢版 |
2017/08/24(木) 20:39:47.98ID:oFKMCsHnd
🐒
2017/08/24(木) 21:28:30.26ID:YTCHjYE8M
>>273
(*2) の時点で新規領域に abcdefgh をコピーしてその後に \0 を置く
2017/08/24(木) 21:29:59.02ID:G5OnAPYO0
新規領域もコピーもないでしょ
2017/08/24(木) 21:33:49.00ID:4nWMkj3x0
コピーが生じないんだとしたら、
std::string::size()はいつも1バイトだけサバを読んだ値を返すってこと?
2017/08/24(木) 21:34:29.37ID:G5OnAPYO0
せやで
2017/08/24(木) 21:35:38.05ID:4nWMkj3x0
なのか
2017/08/24(木) 22:02:35.81ID:oFKMCsHnd
プロパティはこれじゃアカンの?
https://wandbox.org/permlink/a1fqVzyPCHgFeNjc
2017/08/24(木) 22:12:47.64ID:4nWMkj3x0
Windows Phoneの開発で使うC++/CXにはpropertyが構文でサポートされているで
ていうかpropertyがあることが存在意義な感じ?(ネイティブなC++は別にあってそれはそれで利用可能
2017/08/24(木) 22:15:25.24ID:4nWMkj3x0
データメンバ直アクセスでなくてpropertyにすると良いことがあるというのは
マーシャリングを裏で勝手にやって来る点
2017/08/24(木) 22:28:47.63ID:TzTK1OIfM
メンバ関数でいいじゃん。ということだろ。
2017/08/24(木) 22:34:36.32ID:4nWMkj3x0
  |
  | ('A`) .oO(名前考えるのマンドクセ
 / ̄ノ( ヘヘ ̄ ̄ ̄
2017/08/24(木) 22:54:26.67ID:TzTK1OIfM
0変数:getter, 1変数:setter, 尻尾付き:メンバ変数
とかは良くやるな
2017/08/25(金) 00:06:28.73ID:w8QRZZ7K0
>>287
それ以前のVC++/CLIからサポートされてる。

>>286
駄目。
propertyは新規機能ではなく、見た目だけの問題だから、
逆に言えば、見た目がpropertyで書いた時より分かりにくいようなら駄目なんだ。
ほぼ同じ事はラムダとファンクタでもそうだけど。
2017/08/25(金) 00:10:22.03ID:hVYhQQjP0
>>268
オペレーターのオーバーライドとにたような感じになると思うけど、その挟み込む処理の重さが隠蔽されてしまうという問題があって、一般には、非推奨だとおもうのだけど今はかわってきてるのかね?

たとえば、代入しているだけだとおもったら、実はファイルアクセスまでしてたとかかな。
2017/08/25(金) 00:19:32.01ID:4dE2HuPo0
>>293
>258理論によれば、老害じゃなければ一目で処理の重さがわかるんじゃね
もっとも処理の重さに関するC++の不透明さに警戒を抱くことを老害とするならば、
カーニハンやリッチーも老害にカテゴライズされてしまうが
2017/08/25(金) 00:49:30.90ID:w8QRZZ7K0
>>294
K&Rというか生Cが嫌っている理由は「余計なことをするな」だ。
適切に使っている限りC++は不透明ではない。それでも彼等は嫌うだろ。

>>293
横だが結局は使い方次第だよ。C++はいくらでも読みにくいコードを書けるから。
ただ、きちんと使えば有用な機能だよ。
演算子オーバーロードについてはgoogleは「慎重にやれ」だね。
https://ttsuki.github.io/styleguide/cppguide.ja.html#Operator_Overloading

どうでもいいが、何故演算子は「オーバーロード」なんだ?
言われてみれば「オーバーライド」の方が適切な気がする。
2017/08/25(金) 02:45:57.11ID:g+9HiqWa0
>>293
それは言語機能の問題じゃなく実装の問題じゃない?

propertyってメンバ変数がどうなっているかに関わらずオブジェクトの状態を表すもの
言語機能の話をしているのであって
既存の機能をやりくりして似たことは出来るって言われてもって感じ
2017/08/25(金) 04:18:10.56ID:4FaT6XJy0
「処理の重さを隠蔽するな」なんて思想がそもそもあるのかね?
298デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 05:23:39.04ID:RGmsOxnq0
>>295
オーバーロードは新設で、たいていのoperatorがこっち
オーバーライドは変更で、代入やnewが本当はこっち
2017/08/25(金) 06:02:53.19ID:sj2/Y28y0
property ってパブリック変数とどう違うの?
2017/08/25(金) 06:53:00.86ID:s9vD7wq8M
>>294
> >258理論によれば、老害じゃなければ一目で処理の重さがわかるんじゃね
どこにも「わかる」って書いてないのにどんなアホ解釈したらそんな結論になるんだよ w
2017/08/25(金) 06:55:30.90ID:s9vD7wq8M
>>295
> どうでもいいが、何故演算子は「オーバーロード」なんだ?
> 言われてみれば「オーバーライド」の方が適切な気がする。
オーバーロードとオーバーライドの違いもわかってないの?
まあ>>298も色々おかしいが
2017/08/25(金) 07:02:27.63ID:g3SOHHgl0
オーバーロードってモモンガ
2017/08/25(金) 07:24:58.66ID:crVCqQ4J0
https://ideone.com/CUMjUp
http://qiita.com/a-beco/items/7709ab80a05ea2d09ea8#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%BC%95%E6%95%B0%E3%81%AB%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B
なんか通った。プロパティですよ?
こんなかんじでいいのかな?
何で動いてるのかよくわからん。Orz
2017/08/25(金) 07:49:18.88ID:4dE2HuPo0
>>300
>>254>>258の流れをa=1;の実行速度が一目見てわかるのかどうかという問題提起の意味に解釈すた、
パフォーマンスを読みきるには何の言語であれボトルネック(ループ回数×1回の実行時間が最大の処理)の特定が必要だが
C++は演算子のオーバーロードとかインライン展開とかテンプレートがそれ以前の障害として立ちはだかる点がCより重症
パフォーマンスを上げるための手段を豊富に提供してプログラムを書く人の選択に委ねているみたいな?
つまりC++はソースコードのROM専はお断りな言語

>>295
スマン言いたかったのはK&Rではなくてカーニハンとロブ・パイクやったorz
『プログラミング作法』の第7章「性能」のところにC++の特性について(CやJavaとの比較が)書かれていた希ガス、
(目次)ttps://tatsu-zine.com/books/practice-of-programming
ちな本は売ったから手元に無い

>>297
本来のK&Rがまさにそれなのでは…
Unixの移植目的で作られた言語なので、移植性と意図通りのアセンブリコードに落ちること
(ソースコードからアセンブリコードが透けて見えること)の両立が着手時点の第一優先だったはず
故に生ポインタが言語の前面に出てきてインクリメント/デクリメントがそれぞれ2種類あった
305デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/25(金) 08:42:44.14ID:XasQqnRJ0
>>298
いや、new もオーバーロードでしょ。
2017/08/25(金) 08:51:39.36ID:crVCqQ4J0
newはオペレーターじゃないの?
2017/08/25(金) 08:53:26.21ID:mWX/padLd
いやいや、newは新しいって意味
2017/08/25(金) 09:08:17.73ID:crVCqQ4J0
新しくメモリのようなものを持って来るってことでしょ。
言語上ではオペレーターじゃないの?
2017/08/25(金) 09:09:11.80ID:mWX/padLd
オペレーターかどうかの議論なんて誰もしてない
2017/08/25(金) 09:11:08.77ID:crVCqQ4J0
オペレータはオーバーロードするもんじゃね?
まぁいいか。
311デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 09:52:04.11ID:RGmsOxnq0
>>305
「本当は」って書いてるだろ

# 流れを読んでない近視眼的なアフォどもは無視
2017/08/25(金) 09:54:07.34ID:mWX/padLd
「本当は」とは?

C++の規格?
本来の英語の意味?
2017/08/25(金) 09:55:05.21ID:mWX/padLd
突然「本当は」とか書いても、どういう意味でどういう意図で書いたかなんてわからんぞ
314デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 10:21:51.52ID:RGmsOxnq0
わかんなくていい
バカ以外とさえ話せれば
2017/08/25(金) 12:45:56.08ID:s9vD7wq8M
>>304
ごちゃごちゃ書いてるけどどこから
> 老害じゃなければ一目で処理の重さがわかるんじゃね
が出てくるのかさっぱりわからん
316デフォルトの名無しさん (ブーイモ MMf1-E8CI)
垢版 |
2017/08/25(金) 12:58:22.38ID:BrjL74izM
>>311
いや、グローバルのオペレーターに対して、型特化を新設するんだから、newも代入も、オーバーロードでいいんだよ。って話。

c++の実現方法(クラス内定義)でイメージしちゃうから、オーバーライドと思っちゃう気持ちはわかるけど。
2017/08/25(金) 13:22:21.09ID:2fWpITWD0
operatorを仮想関数にしたことないや
2017/08/25(金) 13:27:32.63ID:a70Vb5yP0
そうか。
319デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 14:12:03.69ID:RGmsOxnq0
::operator newは新設か?
ユーザー定義するとビルトインを置き換えるだろ
2017/08/25(金) 14:14:35.88ID:11RxMW0L0
>>319
だからオーバーライドだというの?
2017/08/25(金) 21:42:16.87ID:0c3f6Usc0
そういえば昔C++のoperator批判を見たなと思って探してみたらこれだった。
http://local.joelonsoftware.com/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
2017/08/25(金) 22:11:25.23ID:IbGqUCQq0
operatorをオーバーライドしてる人いるみたいだけど、operatorを仮想関数にするのってどういう時なの?
2017/08/25(金) 22:17:04.37ID:M7y+0IYNd
>>322
ポインタから多態を利用じゃねーの?
2017/08/25(金) 22:28:47.46ID:M7y+0IYNd
ポインタじゃなくてC++参照ね。
2017/08/25(金) 22:37:18.66ID:IbGqUCQq0
>>323
具体的には何のoperatorをオーバーライドしてるの?
2017/08/25(金) 22:39:23.28ID:11RxMW0L0
遺伝子
2017/08/25(金) 22:45:02.30ID:M7y+0IYNd
operator==を仮想化したら、多態性が必要な状況であれこれはかどるだろう。
Numberクラスを基底として、RealクラスやらComplexクラスを作ったりしたら、同値確認にoperator==を使いたくなるだろう。
2017/08/25(金) 22:47:00.20ID:g+9HiqWa0
男はオーバーロード
女はオーバーライド
2017/08/25(金) 23:16:33.27ID:11RxMW0L0
>>327
それってダブルディスパッチの問題起きないの?
2017/08/25(金) 23:29:12.56ID:M7y+0IYNd
>>329
お馬鹿で済みません。
2017/08/25(金) 23:44:46.18ID:11RxMW0L0
2017/08/25(金) 23:58:05.92ID:w8QRZZ7K0
よく分からん揉め方をしているが、
俺は>>298の表現は極めて的確で分かりやすいと思うぞ。
俺はあれで納得だ。サンクス。一応言っておく。
333デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/26(土) 00:07:55.23ID:NVd9gXan0
>>327
RealクラスとComplexクラスを比較した時の振る舞いが直感的じゃなくね?
2017/08/26(土) 00:16:33.84ID:m69mKCvsr
はてoverloadとoverrideは排他的な存在だっただろうか
ちなみに規格で::newはreplace, displace
overrideとは言わない
2017/08/26(土) 00:17:51.21ID:HPL6ZAk0d
>>333
その場合はオーバーロードよりも強力なダブルディスパッチを使うのが妥当だった。すまね。
2017/08/26(土) 00:20:52.21ID:kchnKiPS0
まだおまいらオーバーなんちゃらで言い争っているのかw
2017/08/26(土) 00:39:36.17ID:HPL6ZAk0d
http://qiita.com/ShirakawaYoshimaru/items/058484a8fb584eb452b2
これを貼るだけだったな。
2017/08/26(土) 03:28:35.80ID:KpMB1a9f0
>>332
operator newって仮想関数にできなくない? なんでオーバーライドが的確なの?
339デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/26(土) 08:56:30.09ID:jcvKb5O50
>>336
言い争ってなんかいねえぜ
一部のアフォどもをこっちはスルーしてるんで争いになってない
2017/08/26(土) 17:00:12.26ID:dtKp7Pu80
>>334
排他的くねなぜならシグネチャが変わらないオーバーロードは無いしシグネチャが変わるオーバーライドもこれまた無いからだ
2017/08/26(土) 17:19:10.37ID:XR3UemNVr
そうか?
https://ideone.com/VOwt42
これはオーバーロードかつオーバーライドだと思うが
オーバーロードは特定の関数について言及しているのではなく同一スコープに同一の名前が複数存在する状態を指すものだと思っとりました
2017/08/26(土) 18:47:41.02ID:O53zOlu10
>>341
それは
上の方はオーバーライド

下の方はオーバーロード(を追加している)
でしょ
関数単位で見たら排他だと思う
2017/08/26(土) 19:44:51.20ID:dtKp7Pu80
>>342
あー左様かvoid B::f(int)のオーバーライドとf()のオーバーロードが同時にありえるのか、
完全に排他的(背反)というわけでもないな

ただしそれぞれ独立な概念とは言える
なぜなら下記の4通り全ての組み合わせが有り得、互いの成立要件に他方の成立の真偽が関係しないだから、
1. オーバーライド∧オーバーロード
2. オーバーライド∧¬オーバーロード
3. ¬オーバーライド∧オーバーロード
4. ¬オーバーライド∧¬オーバーロード
2017/08/26(土) 19:47:02.66ID:dtKp7Pu80
訂正
△: ただしそれぞれ独立な概念とは言える
○: ただしそれならそれでそれぞれ独立な概念とは言える
2017/08/26(土) 23:26:52.66ID:rkE5GYva0
同じ名前の関数で、引数が同じならオーバーライド、 引数が違えばオーバーロードだよ?

そんなに難しい話じゃないはずだった気がしたんだけどな。
2017/08/26(土) 23:42:30.55ID:eHXsO5oX0
>>345
usual な operator new は、いつも
void* operator new(std::size_t);
というシグネチャなのに、なぜオーバロードなのか

という話題だったのでは?
2017/08/27(日) 00:10:24.07ID:NCmIfXRWr
「同じ名前の関数で、引数が同じならオーバーライド、 引数が違えばオーバーロードだよ?」
これまた珍説を
2017/08/27(日) 00:50:06.39ID:Cp6PBSjn0
>>347
>引数が違えばオーバーロードだよ?
演算子のオーバーロード
2017/08/27(日) 00:54:36.33ID:DagGpBhC0
おまいらのアタマがオーバーフロー
350デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/27(日) 02:06:53.19ID:99717IEt0
みんな人に説明できるだけのまともな言語能力を備えてから来てくれ
あとクソみたいな反論をするのもやめよう
2017/08/27(日) 07:10:35.78ID:NCmIfXRWr
>>348
それは>>298>>319を読んだ上で物申してるのかね
2017/08/27(日) 10:16:57.94ID:FD5yZ+sq0
2010年にも同じような話あったみたいね
https://cpplover.blogspot.jp/2010/08/overloadoverridehiding.html
2017/08/27(日) 13:59:49.66ID:nap9vlyD0
constオブジェクトのデストラクタって
一般に中で非constメソッドを呼んでいるのに
なんで合法に呼び出されるの?
それとも合法に見えるのはVC++固有?
プロセスが死ぬまで破棄されないのが正しいロジックなんじゃないの
2017/08/27(日) 15:08:55.59ID:hmah67i90
const の考え方には logical const と bitwise const があって、
logical const を実現するために言語としては bitwise const を基本として要求してる感じ。
logical const ってのは論理的な const 性で、
bitwise const ってのはビットパターンとして不変ってことね。

mutable キーワードを付ければ const なメンバ関数からも操作できるデータメンバを
作れるけど、これは bitwise const でなくてもよくなるだけで
logical const であることは要求される。
(その性質を満たすようにプログラマが配慮しないといけない。
コンパイラは面倒みてくれない。
reinterpret_cast と同じくらいには危険で面倒くさいと思う)

寿命が尽きたオブジェクトにはアクセスは許されないから
もはや logical も bitwise も関係なく const 性は無意味になる。
2017/08/27(日) 15:29:34.75ID:nap9vlyD0
>>354
>寿命が尽きたオブジェクトにはアクセスは許されないから
>もはや logical も bitwise も関係なく const 性は無意味になる。
これはだいたいワカタ

前半はわからん
bitwise const でないオブジェクトがROMに割り付けられたり、とか、
bitwise const でないオブジェクトがmemcpy()的手段で同じビットパターンに繰り返し上書きされるみたいな
処理があったりするとbitwise constでないことは致命的だが
それ以外のケースではconstといいつつクラス内部ではmutableな扱いであっても全く実害無いんじゃ…
ていうかそもそもC++の非PODオブジェクトに対するconstはbitwise constなのかかなり疑問が、、
2017/08/27(日) 16:21:07.86ID:hmah67i90
>>355
logical const であれば性質として充分だよ。
だけど、それをコンパイラがチェックすることは出来ないから、
原則としては bitwise const を要求して、
それがちゃんとできてなけりゃエラーも出す。

だけど、 bitwise でなくても logical に出来る場面では
プログラマの責任でやるよっていうのを mutable キーワードで表すってわけ。
2017/08/27(日) 16:23:29.96ID:Pcpci17F0
ルールを増やせば増やすほど使ってもらえない。
358デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/27(日) 16:50:02.45ID:99717IEt0
しかし現実には使われているもよう
2017/08/27(日) 16:52:16.64ID:OhTIHz5/0
おい、mutableなんてキーワード初めて知ったぞw
ググってみたらC++11から導入されてたんだな知らんかった、、、
2017/08/27(日) 16:55:16.46ID:7+G8dT33M
またまたご冗談を
2017/08/27(日) 17:26:13.10ID:hmah67i90
>>359
ANSI で規格化された最初から有ったがな (´・ω・`)
362デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/27(日) 19:19:01.73ID:+rBIMmXP0
>>359
いやいやおいおい…
2017/08/27(日) 22:57:23.47ID:epttQBO0r
「C++の非PODオブジェクトに対するconstはbitwise constなのかかなり疑問が」
標準レイアウトではないconstexprなオブジェクトはビットレベルでconstなのだろうか
constexpr struct A { constexpr A()=default; int m=1; private: int n=2; } a;
確かに疑問だ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況