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


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

【初心者歓迎】C/C++室 Ver.57【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:39:18 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.56【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1215278693/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

175 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:43:05 ]
VC++で、ソースコードをUTF-8で保存してコンパイルしたら、"文字列" がUTF-8になってくれればいいんだけどね

176 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:50:50 ]
VC++(UCS2)/gcc(UTF-32)での可搬性を考えると、
wchar_t=UCS2と想定するのが良い

UTF-16、UTF-32はC++0xが出てくるまで我慢

177 名前:176 mailto:sage [2008/07/20(日) 23:53:11 ]
もちろん、ICUなどで提供されている型や関数を使っている人は除く

178 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 02:42:01 ]
どーでもいいよそんなの

179 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 08:10:43 ]
>>175
C++0xでUTF-8リテラルが追加される。u8"文字列"

※ime.nu通すと#以降が消えるので
ttp://ja.wikipedia.org/wiki/C%2B%2B0x#.E6.96.B0.E3.81.9F.E3.81.AA.E6.96.87.E5.AD.97.E5.88.97.E3.83.AA.E3.83.86.E3.83.A9.E3.83.AB

180 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 14:04:39 ]
printf("aaa\b\b\b");

とかやってるコードを見かけたのですが、
\b\b\bはどういう意図でやっているのでしょうか?
\bはバックスペースのようですが…

181 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 14:20:49 ]
次に書いた文字がaaaを上書きする。

182 名前:180 mailto:sage [2008/07/21(月) 14:40:00 ]
>>181さんありがとうございます。

ファイルコピーの進捗状態をコンソール上の同じ位置で
パーセント表示する際などに
使うわけですね。なるほど。

183 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 19:36:23 ]
char *p;
char **pp = malloc(sizeof(char*) * 100);

という式はcharのポインタのポインタを100確保したという意味でいいのですか?
pp[0]はpと同じ意味ですか?



184 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 19:42:56 ]
char*を100個格納できるエリアへのポインタを返していて、そのポインタをppに入れている
あくまでも指定されたサイズのエリアを確保しているだけで、ポインタを確保している訳ではありません。

上記コード上ではpとpp[0]には何の関連もないけど、
p = pp[0];ができる?という意味なら、できる。

185 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 22:34:01 ]
>>184
同じ意味とは型が同じかという意味でした。

186 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:08:32 ]
VCで作ってタソーすをgccでコンパイルしようとすると
tchar.hがないってエラーになるんだが、
Linuxでは何てヘッダを読み込めば_TCHARとか_T()とか使える?
自分で定義するしかない?


187 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:17:41 ]
当たり前だ

188 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 04:22:32 ]
そのための_TCHARだ。

189 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 04:24:17 ]
gcc だと何と定義すりゃいいんだろうな。
wchar_t が UCS4 だったりすることもあるんじゃないのか。

190 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:21:02 ]
そもそもAPIにAとWの区別もないのに何の意味があるんだろう。

191 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:28:47 ]
>>190
WしかないAPIもある

192 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:34:56 ]
>>191
そんな話はしていない

193 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 16:50:58 ]
>>189
UCS2でも4でも動くように書くしかないかと
あるいはライブラリを使うか



194 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 17:33:55 ]
wchar_tの中身がUnicode系ではない環境もあるのでよろぴこ。


195 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 20:54:18 ]
>>194
その処理系の名前教えて。
いや、煽りとかじゃなくて普通に知りたいので。

196 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 21:25:07 ]
>>195
Linux以外のほぼすべてのUNIX。
すくなくとも、Solaris FreeBSD NetBSDはUnicodeではなかったはず。




197 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:00:16 ]
そうなのか。dクス

198 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:02:46 ]
LinuxをUNIXと言うと基地外が来襲するので
ちゃんとUNIXライクOSと言いましょう

199 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:11:08 ]
wchar_tマジ使えなさすぎワロタ
ml.tietew.jp/cppll/cppll/article/862

200 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:40:13 ]
その辺に載ってる話はさすがに古くねえか?
gcc 2.xだろ?

201 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:55:17 ]
gccのwchar_tは昔からうんこ
あまりにも有名すぎる話

202 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 23:37:26 ]
>>201
いやその、今のgccはinput-charsetだのexec-charsetだのwide-exec-charsetだの
指定できるだろ?

203 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 01:49:03 ]

*i |= 3;

はちゃんと

*i = *i | 3;

に展開されるのでしょうか?




204 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 02:26:54 ]
いいえ、前者と後者では意味が違います。

205 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 02:32:22 ]
>>203
「展開される」の意味が分からない

Cだと結果は動作は等しくなる
C++だとoperatorのオーバーロードがあるのでなんともいえない

206 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:02:00 ]
class test {
string* p;
public:
test() { p = new string; }
~test() { delete p;}
}

main() {
test obj1;
test obj2 = obj1;
}

2度目のdeleteにてセグメンテーション違反で落ちるコードです
教科書ではコピーコンストラクタを上書きして
ポインタの指す先までコピーするようにしてるのですが
delete時にチェックする方法はあるんでしょうか?
実用性は考えていませんが、興味があります

環境:
Linux kernel 2.6-686
GNU C++ compiler 4.1.1

207 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:07:15 ]
ローカル変数とは定義された順にスタックに積まれるのですか?

208 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:42 ]
>>206
obj2.pはobj1.pと同じだから落ちて当たり前。
何がしたいのか分からないけど、ポインタにNULLポインタを入れておけば
それがdeleteされても問題なく動く。

209 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:50 ]
>>206
> delete時にチェックする方法はあるんでしょうか?

参照カウンタをどこかに持つとか。



210 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:18:20 ]
あー、参照カウンタにしても、けっきょくコピーコンストラクタをオー
バーライドしなきゃいけないか。





211 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:25:16 ]
>>208
どこでNULLをセットすればいいですか?

>>209
なるべく簡単な方法がいいんですよね

catchしちゃえばいいのかな
このアドレスは使っちゃ駄目みたいなのは
カーネルに聞けば教えてくれるのかなと思ったんですが

212 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:33:33 ]
>>206
あくまでチェックしたいってことなら、方法は無い。
ヌルをセットするとかして、とにかく落ちないようにするなら auto_ptr でも使っとくのが簡単。

#include <memory>
#include <string>
using std::string;
using std::auto_ptr;

class test {
auto_ptr<string> p;
public:
test() : p(new string) {}
};

int main() {
test obj1;
test obj2 = obj1;
}

213 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 11:37:38 ]
>>207
規格ではスタックが使われるのかすら決まってなかった気がする



214 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 12:39:32 ]
>>211
string*ではなくstringをメンバに持たせる

215 名前:デフォルトの名無しさん [2008/07/23(水) 16:25:27 ]
class hoge{
private:
int fuga;
public:
void setfuga(int a){ fuga = a; }
int getfuga(){ return fuga; }
};

class foo{
private:
std::vector<hoge> var;
public:
void sethoge(hoge hage){ var.push_back(hage); }
std::vector<hoge> getvar(){ return var; }
};

int main(){
foo foo0;
hoge hoge0;
hoge0.setfuga(1);
foo0.sethoge(hoge0);

std::vector<hoge>::iterator itr;
itr = foo0.getvar().begin();
std::cout << foo0.getvar().at(0).getfuga() << std::endl;
std::cout << (*itr).getfuga();
return 0;
}
これを実行すると、一つ目のcoutは正常に出力(1)されますが、二つ目はでたらめな値が出ます。
itr = foo0.getvar().begin()はfoo0.getvar().at(0)を指すiteratorだと思うので、同じ結果になると
思っているのですが…。どなたかお教えいただけると助かります。

216 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 16:35:26 ]
>itr = foo0.getvar().begin();

getvarの戻り値はfoo0.varそのものではなくfoo0.varの一時的なコピーで、次の文に移る前には破棄される
getvarはfoo0.varのコピーを返すのではなくfoo0.varへの参照を返す必要がある

217 名前:デフォルトの名無しさん [2008/07/23(水) 16:38:55 ]
>>216
その通りでした。ちょうど思いついたところでした。
すみません、どうもありがとうございます。

218 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:39:07 ]
HOGEという構造体がtypedefされているとします。


HOGE *hoge;と宣言します。


void function(HOGE *hoge){

}という関数に

function(hoge)と渡すと参照渡しになってますか?

219 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:42:42 ]
>>218
それはC++でいうところの参照ではありません

220 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:44:26 ]
アドレス私ですか?

221 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:46:44 ]


222 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:47:38 ]
アドレス渡しですか?の間違いです

223 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:01:10 ]
「自分宛のレスですか?」という意味だと勘違いしたのは、
俺だけじゃないはず。



224 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:33:45 ]
foo(HOGE fuga){ }
bar(HOGE* pFuga){ }
baz(HOGE& fuga){ }

func()
{
HOGE hoge;
HOGE *pHoge;

// 値渡し
foo(hoge);
// ポインタ渡し(アドレス渡し)
bar(pHoge);
// 参照渡し
baz(hoge);
}


225 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:40:34 ]
foo(HOGE fuga)
foo(HOGE &fuga)

HOGE hoge;
foo(hoge);

この場合どっちが優先されますか?

226 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:43:00 ]
>>225
自分でコンパイルしてみては?

227 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:40 ]
自分で試してください。

俺は試しました。VC++2005EE

XXX.cpp(19) : error C2668: 'foo' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
XXX.cpp(11): 'void foo(HOGE &)' の可能性があります。
XXX.cpp(7): または 'void foo(HOGE)'
引数リスト '(HOGE)' を一致させようとしているとき

228 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:44 ]
もし環境依存だったら自分で試しただけでは分からないし

229 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:50:02 ]
それは試してうまくいった後に質問すべきこと。

230 名前:デフォルトの名無しさん [2008/07/23(水) 22:08:24 ]
g++でプリコンパイル済みヘッダが使えないって聞いたんだが、
stdafx.hみたいに一つのヘッダファイルでSTLやboostとかのヘッダ
全部読み込むのはやめたほうがいい?


231 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 22:44:37 ]
いつのg++の話?

232 名前:デフォルトの名無しさん [2008/07/23(水) 23:54:09 ]
>>224
225は自分じゃないです。

ポインタ渡しした場合はbar関数の中で値を書き換えても、元には影響ないんですか?

233 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:03:05 ]
>>232
ポインタを引数に指定しないとだめか、そうでないかの違いで、影響あることには変わりないよ



234 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:10:51 ]
225は違う人だったのか…

ポインタ渡しは影響する
参照渡しも影響する
値渡しだけは影響しない

235 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:21:32 ]
クラスは参照型なのでゴニョゴニョ

236 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:23:12 ]
>>232
bar(HOGE* pFuga){
  *pFuga = ...; //影響する
  pFuga = ...; //影響しない
}

237 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 02:02:44 ]
>>230
そういう理由もあるだろうし、依存関係は最小限にしたほうがいいと思うよ。

g++ でもプリコンパイル済みヘッダ自体は使えたような気がする。使い方が
全然違ったはずだけど。

238 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 09:04:36 ]
>>235
嘘をつくな

239 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:36:21 ]
あれ?
クラスもコピーコンストラクタ呼ばれて値渡しされるよね?

240 名前:デフォルトの名無しさん [2008/07/24(木) 13:39:58 ]
コピーコンストラクタ呼ばれて値渡しされるし、逆にコピーコンストラクタが定義されていないと
コンパイルできないはず

241 名前:240 [2008/07/24(木) 13:42:25 ]
値渡しの話だよね?

242 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:43:59 ]
コピーコンストラクタがなければ勝手に丸ごとコピーします。
でないと、struct A a, b; a = b;というC由来のコードがコンパイルできなくなってしまう。

243 名前:240 [2008/07/24(木) 13:44:40 ]
あ、そっか、そうだね、失礼



244 名前:240 [2008/07/24(木) 13:47:05 ]
あ、よくがんがえたら、クラスのメンバーに、コピーコンストラクタが定義されていないオブジェクトが含まれている時と
勘違いしてた。
自分がよくコンパイルエラー出すもんで。。w

245 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:52:09 ]
実際
中間インスタンス生成+コピーコンストラクタ呼んだ後は 参照でわたしてる?

呼び出し元のインスタンスには影響を与えないけど、スタックに実体を積んでいるわけではない
みたいな構造

246 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:53:44 ]
それぞれ想定している状況が違っている悪寒。

247 名前:デフォルトの名無しさん [2008/07/24(木) 13:55:27 ]
VC2008 VC6 BCC MinGW
でboostいれたいんですけど
バイナリ配布しているVC2008しか成功しません
1.35のそれぞれのバイナリ置いてある所無いですか?

248 名前:デフォルトの名無しさん [2008/07/24(木) 14:17:41 ]
www.boost.org/development/tests/release-1_35_0/developer/summary.html

boostてdrwinとvc7以上で主に動くんですね borlandはかなり駄目ですね

249 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 14:39:09 ]
darwinってmacのことだぞ

250 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 19:59:10 ]

 boost::regex で,置換する時に置換フォーマットが $10 だと 10 番目のキャプチャ要素に置換されるんだけれど,
これを一番目のキャプチャ要素 $1 + 0 にするにはどうしたらいいの?

251 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:00:54 ]
>>250
regex を二回呼べばいいんでは?

252 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:09:39 ]

すいません 2 回呼ぶと言うのはどういう意味でしょうか?


253 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:23:33 ]
>>250
簡単な例をplz



254 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:29:02 ]
${1}0でいけたような気がしたけど、どうだったかなあ

255 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:31:59 ]
1.35のregexでいまためしてみた。
"\\10"で大丈夫。sed format string syntaxってやつだ。
"${1}0"はだめ。

#include <iostream>
#include <string>
#include <boost/regex.hpp>
int main()
{
    boost::regex re("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.).*");
    std::string s ="abcdefghijklmn";
    std::cout << boost::regex_replace(s, re, "\\10") << std::endl;
    return 0;
}

256 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:34:49 ]
そういう意味か!

257 名前:250 mailto:sage [2008/07/24(木) 20:38:51 ]
>>255
ありがとう!それでうまくいきました.

258 名前:デフォルトの名無しさん [2008/07/25(金) 10:23:37 ]
boost_serializationを画面やメモリに出力したいのですが教えて下さい
test_classは別に定義してあるとします。これだとファイル出力です

#include <fstream>
#include <string>

int main()
{
std::ofstream fp("XXX.xml");
boost::archive::xml_oarchive oarchive(fp);

test_class Z;
Z.a = 22; Z.b = 7;

oarchive << boost::serialization::make_nvp("Root", Z);

}



259 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:34:45 ]
>>258
よくわからんが
ofstreamのかわりにcoutやsstreamを使えばいいだけなんじゃないの?

260 名前:デフォルトの名無しさん [2008/07/25(金) 10:35:02 ]
追記

型 const boost::serialization::nvp<T>の出力方法がわかればいいのですが

261 名前:デフォルトの名無しさん [2008/07/25(金) 10:36:58 ]
トンクス これでいけました!

xml_oarchive oarchive(fp); → xml_oarchive oarchive(cout);

262 名前:デフォルトの名無しさん [2008/07/25(金) 10:41:06 ]
メモリに格納したいのでstringにしたらエラーでました。 メモリに入れる良い方法ありませんか?

string s;
boost::archive::xml_oarchive oarchive(s);

1番目の引数を 'std::string' から 'std::ostream &' に変換できません。

263 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:46:46 ]
>>262
つ[stringstream]



264 名前:デフォルトの名無しさん [2008/07/25(金) 10:50:32 ]
トンクス

265 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:06:02 ]
参照を使うべきかポインタを使うべきか悩んでいるのですが、
参照なんて使わない!もしくはできる限り全て参照を使う!って方いますか?
どうもポインタと参照の違いが分かりません(使いどころとして)

266 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:46:14 ]
>>265
C++では、ポインタを使わないといけないケース以外はポインタを使わない。
使うとしても、大抵はイテレータと言う形で使っている。
必要に迫られれば、ポインタを使うこと自体は吝かではない。

267 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:50:08 ]
C++だと関数にヌル終端文字列を渡すときも、const char * とか使わず、
全て const char & とか const std::string & を使うの?

268 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:51:13 ]
const char & を渡してどーすんだ

269 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:58:18 ]
俺は、参照を使わざるを得ないときと、値渡しの代わりとしてコピーのコストを抑えるためにしか、参照を使ってないな
それ以外はポインタ

270 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:08:14 ]
void test(const char& s){
  if(&s==NULL){
    std::cout << "(NULL)" << std::endl;
  }
  else{
    std::cout << &s << std::endl;
  }
}
int main(){
  test(*"aaa");
  test(*static_cast<const char*>(NULL));
  return 0;
}
--結果---
aaa
(NULL)


扱えないことはない。
でもまぁ正直言って、これはないw

271 名前:265 mailto:sage [2008/07/25(金) 14:12:35 ]
値渡しのコピーを省くためなら、参照でなくともポインタでできそうですけど、
それをわざと参照でやる理由はなんでしょう?
c++まだ勉強中で、ざっと見た感じ、以下のようなものしか有用性はないような気がしてます。
ポインタでの煩わしい明示を省ける、視覚的に区別する以外のメリットはあるのでしょうか?

int n;
int &func();

void main()
{
    int i = 0;
    func() = i;
}

int &func()
{
    return n;
}

272 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:29:06 ]
ポインタは参照と違ってNULLを渡すことができるらしいよ。
参照はポインタと違っていい一般保護例外を起こすようなアドレスを排除できるらしいよ。

273 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:35:22 ]
>>271
少なくともread-onlyな引数を、効率のためにconst参照渡しがしたいケースなら、
素直にreference使ったほうが便利だよ

>>272の言うような問題もないし、呼ぶ側としても
ただの値渡しと同じように記述できて、型変換や何かが必要な場合もコンパイラが面倒
見てくれるからな

ユーザ定義演算子などでは、意図した記法を実現したければ、
事実上参照以外に選択肢が無いこともある



274 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:36:21 ]
>>272
やってやれんことはないな
void hoge(double &d) { }
hoge(*(double *)NULL);
hoge(*(double *)123);


275 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:37:23 ]
>>271
const参照になるけど、
・良いかどうかは別にして、コンストラクタの暗黙呼び出しが使える。
・一時オブジェクトが渡せる。
という利点はある。

struct IntX {
  int n;
  IntX():n(0){}
  IntX(int argn):n(argn){}
};
void test(const IntX& a){
  std::cout << a.n << std::endl;
}
void test2(const IntX* a){
  std::cout << a->n << std::endl;
}
int main(){
  test(IntX());
  test(10);
  //test2(&IntX(20)); //左辺値でないのでコンパイル不可
  return 0;
}

あと、>>272がツッコミ入れてくれた通り、
>>270で書いた *static_cast<const char*>(NULL) みたいなネタは
実際のプログラムでやったら(無効な参照を作ったら)駄目だからね。






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

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

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