[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/13 10:33 / Filesize : 185 KB / Number-of Response : 779
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part66



1 名前:デフォルトの名無しさん [2009/01/11(日) 11:21:38 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part65
pc11.2ch.net/test/read.cgi/tech/1230341243/

464 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:12:33 ]
どうでもいいがespがスタックポインタに見えてしょうがない

465 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:50:25 ]
ttp://d.hatena.ne.jp/portown/20090318/1237389062
ここで、
>「デストラクタがヘッダ中に記述されてしまっている」ことにある。
>更に言うと、「deleteがヘッダ中に行われてしまっている」ことが問題であり、
>よりつっこんで言うなら「deleteがCHoge::implの定義と別の場所で行われている」ことが問題なのだ。
>つまり、pimplにスマートポインタを使おうとするなら、デストラクタを必ず明示しなければならないのである。
>それも、implの定義(この場合はhoge.cpp)と同じ場所に、だ。
ってあるんだけど、その意味が分からない。
何でダメなの?
つーかコンパイルは一応通ったんだけど。

466 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:52:21 ]
間抜けな設計に合わせてespのレベルも落としたんだろ

467 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:05:05 ]
>>465
まず、「不完全型(名前だけ分かってるけど完全な定義がまだ見えていない型)のポインタのdeleteは危険」
であることを知ってほしい。これはコンパイルは通るけどきちんと動かないことがある。
(その型に自分で定義したデストラクタやoperator deleteがある場合、ちゃんと呼ばれない。)

class CHogeのデストラクタを記述しない場合、コンパイラが勝手に ~CHoge() を作る。
その中でスマートポインタである pimpl のデストラクタが呼ばれ、不完全型であるimplのポインタをdeleteしようとする。

468 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:13:26 ]
未定義動作だからまともなコンパイラなら警告くらい出すはずだけどな
たまたまデストラクタもdeleteも定義してなかったからスルーしちゃったのかな

469 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:53:18 ]
>>467-468
ありがとう。

「pimplがスマートポインタであるために特殊なdeleteが必要である。
だがコンパイル時にはpimplが不完全型であるためにその特殊なdeleteを呼び出すコードが作られない。」
ってことか。

となると、今回のケースでは
CHoge::~CHoge(){}
を自分で明示的に記述したとしても、それをhoge.hに書いている限りは解消されないんだよね。
hoge.cppのCHoge::implクラスの定義の後に自分で明示的に記述するならOKってことですかい?


470 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:00:43 ]
>>469
前半は違う。スマートポインタであることは本質的な問題ではない。
pimplが単なるポインタであっても、 hoge.h でCHogeの定義の中に
CHoge::~CHoge() { delete pimpl; }
と書いたら、全く同じ問題が生じる。

後半はあってる。とにかく、明示的にであれ暗黙的にであれdeleteが出てくるところでは、
そのdeleteされるものの完全な定義が分かっていなければまずい場合があるということ。

471 名前:469 mailto:sage [2009/04/07(火) 22:25:09 ]
>>470

なるほど。
根本的な問題は「デストラクタが云々」じゃなくて、
「不完全型のポインタのdelete」にあった訳か。

んで、その辺を全部気にせず丸投げしてもいけるのがshared_ptrなのか。
ありがとう。

・・・しかし
>>>468
>未定義動作だからまともなコンパイラなら警告くらい出すはずだけどな
VC++2008で試して見たのだが
>auto_ptrを用いた例ではVC++2008では警告しか吐かれない。
なぜか警告すら出てこなかったなぁ。


472 名前:471 mailto:sage [2009/04/07(火) 22:29:09 ]
>>468
警告でた。
お騒がせしました。

warning C4150: 'CHoge::impl' 型を削除するため delete 演算子が呼び出されましたが、定義がありません。
: 'CHoge::impl' の宣言を確認してください。




473 名前:471 mailto:sage [2009/04/07(火) 22:33:37 ]
追記:

g++でも警告出た。
note: neither the destructor nor the class-specific operator delete will be called,
even if they are declared when the class is defined.

bcc5.5.1では警告でなかった。


474 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:21:08 ]
explicitをデフォルトコンストラクタに付ける意味はありますか?
また、explicitを引数を2つ以上取るコンストラクタに付ける意味はありますか?

475 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 00:39:21 ]
1.デフォルト引数が付いてて、結果的に引数1個で呼べるなら意味がある
2.付けても害はないのでとりあえずコンストラクタには全部付けるポリシーにして付け忘れを防ぐ

476 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 01:14:57 ]
explicitを付けさせる仕様でなく、
implicitを付けさせる仕様にすべき

477 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 03:43:39 ]
>>476
いまさら仕様変更されても困るから、そうなってたらいいな、って話にしかならん。

478 名前:474 mailto:sage [2009/04/08(水) 07:09:56 ]
>>475
なるほど。ありがとう。

479 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:07:19 ]
copy-and-swapイディオムってすげーのな。
これって自作クラスのoperator=のオーバーロードの定義以外に使い道ある?

480 名前:デフォルトの名無しさん [2009/04/08(水) 19:11:38 ]
何がすごいの?

481 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:24:53 ]
>>480
例外安全なところ。


482 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:39:37 ]
>>479
コピーしないでスワップするだけなら、
参照型の引数で値を戻す場合にも。
void foo(hoge_t& result)
{
hoge_t x;
//xにあれこれ手を加える
swap(x, result);
}
まあ、何も考えなくていいときには、resultを直接いじることもあるけど。



483 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 20:12:23 ]
全部正常に終わるまで変更を反映させたくない処理全般に使えるよね。

484 名前:479 mailto:sage [2009/04/08(水) 20:21:49 ]
>>482-483
ほほー
ありがとう。

485 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:10:57 ]
オーバーロードしたoperator=を
コピーコンストラクタの定義で使っても大丈夫?


486 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:34:30 ]
よゆー
operatorほにゃららは普通の関数と全く同じように呼び出して可。

487 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:38:45 ]
>>482
ドラゴン・スゴイコビッチ!(とてもすごいの意)

用件としては、自作クラスに swap 関数を装備することと、
その swap が例外を投げないようにすること?


488 名前:485 mailto:sage [2009/04/08(水) 21:49:40 ]
>>486
ありがとう。
コピーコンストラクタ(に限らずコンストラクタ一般)から
メンバ関数を呼び出す時、
construct中なのにメンバ関数を呼び出しても
大丈夫なのだろうかと思ったのだ。。。


489 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:51:32 ]
>>488
virtualなら気をつけないといかんかもしれんが
そうじゃないなら大概大丈夫

490 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:54:37 ]
大丈夫

491 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:56:15 ]
>>489
>virtualなら気をつけないといかんかもしれんが
ああ、
基底クラスのconstruct中にvirtualなメンバ関数呼ぶと
その基底クラスでの対応するメンバ関数が呼ばれるってやつね。
ありがとう。

>>490
ありがとう。

492 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:03:58 ]
C++0xは本当に後 数ヶ月で策定されるんだろうか。
されたとして、ちゃんと動作するコンパイラが出て来るのはいつだろうか。

・・・うむ、心配だ。



493 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:35:04 ]
別に心配することじゃない。
まともなコンパイラが出てから考えればいいこと。
早く出てくれないと困る事情でもあるのか?

494 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:50:26 ]
すまぽとかは早く表順になってほしいなぁ。
もうすまぽを書くために何リットルのインクを消費したことやら。
(インク?)

495 名前:492 mailto:sage [2009/04/08(水) 22:52:55 ]
>>493
>早く出てくれないと困る事情
いや、全然ないw
g++が速いかVCが速いか。

496 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:00:35 ]
>>493
IntelC++は既にlambda関数がサポートされてるんだけど、IntelC++はコンパイル遅いんでdebugはVCでreleaseはIntelでやってるとlambda関数は使えなくて残念。
boost::lambda使えば済む話ではあるんだけど。


497 名前:492 mailto:sage [2009/04/08(水) 23:12:20 ]
現在のTR1のライブラリ達は、正直なところ十分動作することが
確認されるまでは使わない方がいいんではないかと思うんだが。
それまではboostのが安心かなぁ。

でも標準に入ってる方が使うのは(気分的に)もっと楽になる事は確か。


498 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:56:20 ]
class A{
public: virtual ~A() = 0;
};

class B :public A {};

class C :public B
{
public: ~C(){};
};

gccでundefined reference to B::~B()って怒られるんだけど、Bでd-tor書かないとダメ?

499 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:13:43 ]
ごめん。純粋仮想d-torに定義書くの忘れてた

500 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:17:10 ]
俺としては以下のやり方でMyClassクラスによるstd::swap関数テンプレートの特殊化を行い、
using std::swap;
swap(x,y);
で特殊化したstd::swap<MyClass>が呼び出せるかと思ったのだが、
以下のやり方だとなにか定義がかぶっているようなことを言われてエラーになってしまう。
再現するソースは次のようなもの。
//以下はMyClass.h
class MyClass
{
char *p;
public:
void swap(MyClass &hoge);
MyClass();
~MyClass();
};
//以下はMyClass.cpp
#include <algorithm>
#include "MyClass.h"
MyClass::MyClass():p("pointer"){}
MyClass::~MyClass(){}
void MyClass::swap(MyClass &hoge)
{std::swap(this->p, hoge.p);}
namespace std
{
template<>
void swap(MyClass &lhs,MyClass &rhs)
{lhs.swap(rhs);}
}

501 名前:500 mailto:sage [2009/04/09(木) 00:18:28 ]
//以下はmain.cpp
#include <algorithm>
#include "MyClass.h"
int main()
{
MyClass x,y;

using std::swap;
swap(x,y);

return 0;
}
としたら、g++にて
MyClass.cpp:(.text+0x42): multiple definition of `void std::swap<MyClass>(MyClass&, MyClass&)'
main.cpp:(.text$_ZSt4swapI7MyClassEvRT_S2_[void std::swap<MyClass>(MyClass&, MyClass&)]+0x0): first defined here
collect2: ld returned 1 exit status
というエラーが出る。
どうしたらいい??


502 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:31:28 ]
理由は覚えてないけどstd名前空間の中でswapの特殊化しちゃだめだった気がする。
ちょっと俺も確認してくるか。



503 名前:502 mailto:sage [2009/04/09(木) 00:33:03 ]
別に駄目じゃないか。ごめんスルーしてくれ。

504 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:37:36 ]
>>485
大丈夫だけど、普通operator =ってcopy (construct) and swapで書かない?

ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%A6_swap(Copy-and-swap)

505 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:58:49 ]
>>500
std::swapの特殊化はヘッダに書かないと駄目だろう。
main.cppでは特殊化したstd::swapが見えないから標準のstd::swapが実体化され
MyClass.cppで特殊化した物と衝突してるんだろう。

506 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 06:57:11 ]
>>504
そうか。
コピーコンストラクタの定義に代入演算子を使うと定義が循環しちゃうのか。

507 名前:500 mailto:sage [2009/04/09(木) 06:58:19 ]
>>505
なるほど。
std::swapの特殊化をヘッダに書く場合はinline指定しないと、
そのヘッダをインクルードするたびにまたmultiple definitionってなっちゃうかな?

508 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 08:13:54 ]
>>507
いや、そういう話じゃない。

509 名前:500 mailto:sage [2009/04/09(木) 08:22:57 ]
>>508
(1)main.cppでは特殊化した定義がその前になされていないから通常通り実体化。
(2)MyClass.cppでも特殊化した。

この(1)と(2)でmultiple definitionってことか。
つーことで
MyClass.hにstd::swapの特殊化を書く(1)
main.cppでMyClass.hをインクルード
ってこと?

510 名前:508 mailto:sage [2009/04/09(木) 08:24:06 ]
>>507
あ、ヘッダに書かないといけないのは理解してるのか。ごめん

テンプレートの定義は inline じゃなくてもいいよ。 >500 の場合は inline が
適切だと思うけど。

511 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 08:25:44 ]
これが inline じゃないといけないんなら全部の関数テンプレートが
inline にならないといけなくなるな。

512 名前:インドリ [2009/04/09(木) 10:05:14 ]
blogs.wankuma.com/episteme/archive/2009/04/08/171040.aspx
d.hatena.ne.jp/faith_and_brave/20090408



513 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 10:18:24 ]
>>512
広告ウゼェ
info.2ch.net/kiyaku.html
> ・投稿者は、話題と無関係な広告の投稿に関して、相応の費用を支払うことを承諾します

514 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 10:19:49 ]
しかもマルチかよ。何のつもりだ?

515 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 10:20:30 ]
インドリしゃんに粘着する物好きもいるんですね

516 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:23:10 ]
>>515
粘着の意味わかってんの?

517 名前:デフォルトの名無しさん [2009/04/09(木) 14:28:38 ]
C++でGUIのプログラムを作ろうと思うんだが、お勧め開発環境はなにかないか?

518 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:48:04 ]
また環境も書かんと適当に訊くなあ。

519 名前:デフォルトの名無しさん [2009/04/09(木) 14:51:01 ]
>>518
OS;XP


520 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:00:29 ]
C++Builder(8万円くらいする)
Turbo C++(C++ Builderの無料版 機能が削られていて少し古い)
Qt Creater(マルチプラットフォームのソフトが作れる コンパイルが遅い)

521 名前:デフォルトの名無しさん [2009/04/09(木) 15:08:24 ]
>>520
turbo c++でGUIって開発できるの??

522 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:52:24 ]
できるよ



523 名前:500 mailto:sage [2009/04/09(木) 22:50:09 ]
>>510-511
そういえば関数テンプレートの定義は
ヘッダに書くけど、それは普通の関数の類推で
inlineじゃなきゃいけないなんて考えちゃだめなんだったな。
Effective C++に書いてあったような気がしてきた。。。
ありがとうお二方。

524 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:53:28 ]
「exit(0)で終了するとデストラクタが呼び出されたり呼び出されなかったりする」
っていうC++の仕様について学べるサイトを教えてください。

巻頭言 2000〜
park1.wakwak.com/~y-nagano/200001.html
一応ググったらこんなのがヒットしましたが、これ以外にも何かオススメをご存じであればお願いします。

525 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:10:23 ]
std::powとかhypotとかをスレッドセーフに実行したいんだけど、おみゃーらどうしてる?
軽いに越したことはないずら

526 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:12:13 ]
常識的に考えればスレッドセーフでないわけがない。
って書こうとしたが、errnoとか気にしている?

527 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:16:23 ]
あれ?そうだったの?errnoは気にしてない。
うーん、じゃあ他のところで変な風になってたのかにゃ・・・?
ありがとうござんした

528 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:35:26 ]
>>524 >>333-

529 名前:デフォルトの名無しさん [2009/04/10(金) 08:30:05 ]
errnoを気にするとどうなの?

530 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 11:55:32 ]
>>529
errnoはグローバル変数なので、
errno = 0;
std::pow(x, y);
if (errno != 0) { /* 失敗 */ }
みたいなコードを書いたときに、powとifの間で他のスレッドによってerrnoが変更されてしまう可能性がある
だから、errnoを気にするとpowとかはスレッドセーフじゃなくなる

たいていのコンパイラにはerrnoをTLSに置いてスレッドセーフにするオプションとかがあるけどね

531 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 15:48:35 ]
タクティカルレーザーシステム?

532 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 17:30:34 ]
>>531
いやTrue Love Storyです。

 じゃなくてThread Local Storageです。



533 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 18:05:46 ]
元気でね 頑張ってね
手紙書くね たまに会えるよね
なんでかな 寂しいのに
寂しいよと 言えなかった

534 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 19:06:46 ]
wwwwwwwwwwww

535 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 21:10:40 ]
イイハナシダナー

536 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 22:17:52 ]
>>530
よく分からんがerrornoへの代入って規格的に許されてたっけ?

537 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 22:27:30 ]
18歳以上ならeroero挿入おkだよ

538 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 22:32:32 ]
はいはいエロスエロス

539 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 23:13:49 ]
18歳以上なのに、いつになってもeroeroの値がインクリメントされず初期値のままです。

540 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 00:09:13 ]
>>539
君の中ではその変数は1つだけ存在すれば十分だよね。
俺達他人に迷惑書けて欲しくないから、君の実装から外には出さないで欲しいなぁ。

ってことでeroeroは自動的に0に初期化されてます。

541 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 00:15:47 ]
E2BIGになって困る

542 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 00:39:57 ]
>>540
static変数ってことか。



543 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 01:22:23 ]
>>536
大丈夫です
C99(ISO/IEC 9899:1999)の7.5の脚注170に「むしろそうするべき」って書いてある(C++の規格には「Cの規格を見てね」って書いてある)

544 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:07:03 ]
若干スレ違いな気がして申し訳ないんだが、
C++の書籍(他の言語は知らんけど)って正誤表無いor乏しいの多くない?

『Exceptional C++』を買ったんだけど、1ページ目から
誤植と思われる物があって困る。。。

だれか正誤表作ってくれている人とかコミュニティとか無い??

545 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:34:26 ]
グローバルスコープに
std::string foo();
って書いたら、
std::string型を返す、引数のない、fooという名前の関数の宣言になるの?
それとも
std::string型のfooという変数の宣言とデフォルトコンストラクタ呼び出しになるの?

546 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:35:50 ]
>>545
前者
C++は関数の宣言が優先

547 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:37:26 ]
>>546
なるほど。
ありがとう。

548 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:09:01 ]
一応書いとくけど、ローカルスコープでもクラススコープでも同じだから。
ローカルでも関数の宣言は出来るからね。

549 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:16:46 ]
これもちなみに
強制的に変数の宣言とデフォルトコンストラクタと見なさせるには

std::string (foo());

と書けばよかったような
間違ってたらすまん

550 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:27:27 ]
やってみたけどあかんかった
カッコつけても関数宣言と見なされる

std::string foo("");

と何でもいいからパラメータ付けるしかないな

551 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:47:13 ]
>>544
ぐぐれよかす
ttp://www.gotw.ca/publications/xc++-errata.htm
ttp://www.informit.com/content/images/0201615622/errata%5Cxcerrata.pdf

552 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:49:15 ]
んばば んばんば えらったえらった



553 名前:544 mailto:sage [2009/04/11(土) 23:51:04 ]
>>551
いや、日本語でググったりピアソンエデュケーション社の
Webページで検索してみたりしたんだが英語は見落としていた。

ありがとう、恩に着る。


554 名前:545 mailto:sage [2009/04/11(土) 23:55:38 ]
>>548
ローカルでは関数の宣言だけは出来るけど定義はできないんだよね。
ありがとう。

555 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:57:37 ]
>>550
いや、カッコつけなければいいだけ。

556 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:31:48 ]
>>555
じゃなくてstd::stringのコンストラクタ呼び出したいんだけど

557 名前:555とは別人 mailto:sage [2009/04/12(日) 00:35:04 ]
>>556
だから括弧つけなければいいなじゃないの?
std::string foo;
これでデフォルトコンストラクタ呼び出しになるでしょ?

558 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:36:12 ]
デフォルトコンストラクタの話じゃなかったのか。
デフォルトじゃないなら引き数書くのは当たり前だろ。

559 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:46:26 ]
なんだ?
未来指向なプログラムの話か?

560 名前:まとめ mailto:sage [2009/04/12(日) 00:53:22 ]
要は
1.
std::string str="hogehoge";
ならstrの宣言&"hogehoge"を引数にとるコンストラクタの呼び出しとなる。
2.
std::string str("hogehoge");
って書いてもstrの宣言&"hogehoge"を引数にとるコンストラクタの呼び出しとなる。
3.
std::string str(const char* arg);
ならstd::string型を返し、const char*を引数にとる関数strの宣言となる。

これを引数なしverにすると

1'.
std::string str;
ならstrの宣言&デフォルトコンストラクタの呼び出しとなる。
2'&3'.
std::string str();
ならstd::string型を返し、引数のない関数strの宣言となる。

ってことだよね。
たぶんこのスレのみんなは分かっているけどレスが言葉足らずでカオスになっているだけかと。

561 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 01:17:31 ]
>>556
もし、本当に「デフォルトコンストラクタを呼び出したいだけ(変数は用意したくない)」なら
std::string();
と書けば呼べるだろうね。
もちろん、ソース上には現れない一時変数が用意されるだけだけど。

普通に「デフォルトコンストラクタで初期化される変数を用意したい」ならば
皆が書いているように
std::string str;
とすれば良いだけ。

562 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 15:26:49 ]
純粋なC++で、初心者でもないのにgotoを使う人って見たことある?
やるとしたらスパゲッティにならないで使える人なんだろうけど。





563 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 15:59:10 ]
goto使えば二重三重ループから一気に抜けられるじぇ

564 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:16:02 ]
あなた天才






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<185KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef