1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
175 名前:デフォルトの名無しさん [2008/03/02(日) 13:20:54 ] >>174 じゃあ、一行ずつ読みたいなら、getline()でやるしかないですか?
176 名前:デフォルトの名無しさん [2008/03/02(日) 13:25:32 ] 以下のようなとき、 子クラスのオブジェクトから、func(1)を実行すると、 func(const char* ch)を呼んでしまうのですが、 親クラスのfunc(int i)を呼ぶにはどうすればいいのでしょうか? /*****こんな感じ*****/ class Parent{ public: void func(int i); }; class Child : public Parent{ public: void func(const char* ch); }; /*******************/
177 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:29:35 ] >>175 そうなる。 getline した後 istringstream に渡してやるとか。
178 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:39:57 ] >>176 Child ch; ch.Parent::func(1);
179 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:47:37 ] >176 子クラス Child の func() によって親クラス Parent の func() が隠蔽されている。普通にオーバーロードしたいなら class Child : public Parent { public: using Parent::func; void func(const char* ch); }; とすることで Parent での func() も見えるようになる。
180 名前:176 mailto:sage [2008/03/02(日) 14:07:51 ] >>178 >>179 ありがとうございます。
181 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:27:55 ] namespace temp { class Test { private: std::ostringstream oss; public : ~Test() {std::cout << oss.str();} template <typename T> friend Test &operator <<(Test &, T t); }; } template<typename T> temp::Test &operator<< (temp::Test& test, T t) { test.oss << t; return test; } を、temp::Test() << 2; と使うと、「operator << が曖昧です」というコンパイルエラーになります。 名前空間を使わないとコンパイルできるのですが、何が問題なのでしょうか Win2k、VC2005です
182 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:32:37 ] << の実装部も temp 名前空間に入れないと。 temp::Test 内で宣言してる friend 関数は temp 名前空間内に入る。 だから、今は temp::operator<< と operator<< の2つがある状態。
183 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:37:08 ] >>182 なるほど、ありがとうございました!
184 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:39:32 ] あるいは friend のところを ::operator<< にするかだけど、 temp 名前空間内に入れた方がいいと思う。
185 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:50:17 ] コマンド等文字列処理で2重のループから抜けるときに goto文使うのって邪道かな? いつも使ってるんだが。
186 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:50:54 ] 2重ループから抜ける際に goto を使うのは常套手段
187 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:17:28 ] 俺、今まで一度も使ったことが無い。 使いたい衝動に駆られたことはある。
188 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:19:02 ] 小さい関数内なら結構goto使っちゃうなぁ
189 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:23:44 ] 常套手段ではあるけど、 2重ループから抜ける必要があること自体があまりないよね。
190 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:24:49 ] まあ関数は一目でざっと目通せる程度にするもんだしちゃんと考えて使うならぜんぜんいいと思う
191 名前:デフォルトの名無しさん [2008/03/02(日) 15:36:50 ] ポインタを解放した後、安全のためNULLを入れると書いてたんですが、 NULLを入れると何が安全なのでしょうか?
192 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:38:35 ] 解放されているかどうかを NULL チェックで確認できる。
193 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:39:18 ] 二重にdeleteすることが無くなる(delete(NULL)は安全なことが保障されている)
194 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:40:13 ] NULL なら間違って解放後にアクセスした際にエラーになってくれる環境が多い。 NULL じゃない場合は偶然アクセスできるかもしれないが、 メモリ領域を壊したり変な値を取得したりしてしまう。
195 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:41:42 ] 無限ループでポインタインクリメントでもしながら片っ端から表示してみれば良いわけない
196 名前:デフォルトの名無しさん [2008/03/02(日) 15:49:10 ] すみません keybd_eventみたいに プログラムからキーボードを押したことにするのは gccだと何か方法がありますか・・・?
197 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 16:12:32 ] >196 keybd_event は Windows API。gcc はいろんな環境向けがあるコンパイラ。 例えば Windows 上で gcc を使っているなら keybd_event になるわけだしやりたいことをもっと正確に書こう。
198 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:26:18 ] 初心者です。 デフォルトコンストラクタっていうのは、 1.引数なしで呼ばれるコンストラクタ 2.なにも記述してなくてもデフォルトで呼ばれるコンストラクタ のいったいどっちのことなのですか? 1と2の違いは、例えば、引数なしのコンストラクタを 自分で定義したときに、それをデフォルトコンストラクタと いうかどうかという違いになると思うのですが、、、 1と2の説明ともWEB上で見かけますが、 どちらがより正確なのでしょうか?
199 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:29:15 ] 引数無しで呼ばれるコンストラクタ。 自分で定義しようがデフォルトコンストラクタ。
200 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:34:41 ] >>198 引数なしで呼ばれるというよりは引数なしで呼ぶことが可能なと いったほうがいいかもな。デフォルト引数もあるから。 class Widget { public: Widget(int i = 0) {} }; //例えば Widget w; //このsyntaxがデフォルトコンストラクタを要求する。 //Widget::Widget(0)が呼ばれる。
201 名前:198 mailto:sage [2008/03/02(日) 17:35:37 ] >>199 ありがとうございます。 すっきりしました。
202 名前:198 mailto:sage [2008/03/02(日) 17:37:25 ] >>200 おっと行き違いになりました。 そうですか、 それもデフォルトコンストラクタなんですね。 ありがとうございました。
203 名前:196 [2008/03/02(日) 18:15:40 ] >197 すみませんでした OSはDebianでPDFかパワポのようなものを C言語で操作したいのです 具体的には下キーかEnterキーをC言語で押したことにして スライドを進めることを行いたいです
204 名前:191 mailto:sage [2008/03/02(日) 19:36:37 ] >>192 >>193 >>194 ありがとうございます。 具体的によく分かりました。
205 名前:デフォルトの名無しさん [2008/03/02(日) 21:56:29 ] c言語で聞きたいことが1からたくさんあるので、何方かmsnメッセで教えてくれませんか? kamisama6@hotmail.co.jp までお願いします!
206 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:02:14 ] >>205 C言語の個人講習をして欲しい訳だな?しかも無料で! そんな奇特な人は少ないが候補として C言語を覚えたてで自分のために他人に説明する人がいるが そんな人を探すくらいなら良書を買ったほうがいくぶんかマシ C言語をマスターしていながら教えてくれる人がいるとしたら リタイヤした人くらいだろうな
207 名前:デフォルトの名無しさん [2008/03/02(日) 22:08:50 ] string tmp; cin >> tmp; としたとき、改行だけが押されたことを知るにはどうすればいいですか?
208 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:16:47 ] >>207 フォーマット入力はデフォルトでは空白類記号は読み込まれない。
209 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:29:59 ] gcc をつかった 分割コンパイルの仕方がわからないのですが わかりやすく解説したページはないでしょうか?
210 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:33:01 ] gcc -c hoge1.c gcc -c hoge2.c gcc -c hoge3.c gcc -c hoge4.c gcc -o hoge hoge1.o hoge2.o hoge3.o hoge4.o
211 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:55:20 ] >>209 Makefileでググれば、良いと思う。
212 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:35:02 ] namespace Name { class Cls; }
213 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:48:48 ] 丸一日前のレスにレスか
214 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:52:06 ] Makefileとbjamとどっちがいい? やっぱ標準であるmakeは一通りやっとくべきかな?
215 名前:デフォルトの名無しさん [2008/03/03(月) 01:14:07 ] >>208 ありがとうございます。一応自分で書いてみましたが、まだうまく動きません。 noskipwsをした後、おかしくなります。 どうかよろしくお願いします。 std::string filename = "default_file.txt"; while (1) { std::string tmp; cout << "Input file name : (hit return to default: " << filename << ") "; cin >> std::noskipws >> tmp; // 下の(1)でY以外で答えたとき、ここで入力を受け付けてくれない。 if (tmp.empty()) { // リターンキーだけが押された場合に、ここのIF文に入る tmp = filename; } cin.clear(); cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); cin >> std::skipws; cout << "filename : " << tmp << " OK (Y|N) ? "; std::string ans; cin >> ans; // (1) if (ans == "Y") { filename = tmp; break; } }
216 名前:デフォルトの名無しさん [2008/03/03(月) 02:22:41 ] stdlib.hの中で_CRT_DOUBLE_DECと_LDSUPPORTを定義してないとき_CRT_DOUBLE、_CRT_FLOATといった構造体を用意してるようですが、 _CRT_DOUBLE_DECと_LDSUPPORTとこの2つに囲まれた構造体などは何のために用意してるんですか?
217 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:31:37 ] >>215 改行は読み込まないからgetlineがいい。 std::string filename = "default_file.txt"; while (1) { std::string tmp; std::cout << "Input file name : (hit return to default: " << filename << ") "; std::getline(std::cin, tmp); if (tmp.empty()) { tmp = filename; } std::cout << "filename : " << tmp << " OK (Y|N) ? "; std::string ans; std::getline(std::cin, ans); if (ans == "Y") { filename = tmp; break; } }
218 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:43:47 ] C++ってどういう業界の人がつかってるの? GUIでMFCやVCL、Qtさわるくらいはあるが、 ゲーム以外でフルスクラッチで書き上げる人たちって どういう人?
219 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:44:13 ] 趣味
220 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:24:20 ] やっぱそうか。 抽象化なんて考えてる暇あったら別の仕事が 飛んでくるもんね。
221 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:25:01 ] 最近C#なんか使う企業もねえ
222 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:50:36 ] つまりCωの時代がやってくると。
223 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:57:12 ] 時代はwebアプリか・・・
224 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:58:37 ] 業務ソフトなら実際C#とか.NETでもなんら問題なくなってきてるご時世だもの
225 名前:デフォルトの名無しさん [2008/03/03(月) 03:59:03 ] 俺は金融関係だけど、C++使ってるよ。 matlabを使うとこも多いけど。
226 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:00:20 ] 自動車関係企業のシステム部門ってC/C++使うのかなぁ
227 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:01:14 ] いかにも使いそうじゃないか
228 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:05:58 ] >>226 COBOLとか使うと思うんだ、経験則
229 名前:デフォルトの名無しさん [2008/03/03(月) 04:51:56 ] 昨日から色々質問させてもらっているものです。 色々分かってきたのですが、getlineとcinとの併用のときにどう書くべきかわかりません。 #include <iostream> using namespace std; int main() { int a; string s; cout << "int: "; cin >> a; // cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "string: "; getline(cin, s); cout << "int: "; cin >> a; return 0; } 上記のソースでコメントアウトしている箇所がありますが、コメントアウトしたままだと、 真ん中のstringの入力が、1つめのintの入力の改行を拾ってしまうせいで、とばされてしまいます。 そこで質問なのですが、ここにコメントアウトされている行をいれるのは正しいですか?
230 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:00:45 ] >>229 コメントアウトした行を入れてもだめ。 cin >> a; で改行文字がバッファに残るため、それが次のgetlineで 読み取られてしまう。Cで言う所のscanf()とgets()を混在させた問題と同じ。 解決策はgetline(cin, s); をもう一つ付け足して改行文字を読み飛ばす。 もしくはgetline()に統一する。
231 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:37:29 ] 今の所COBOL、PL/I、Java、JS、Access、Rubyを見たことがある
232 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:42:58 ] >>225 金融っていってもmatlab使ってるようなところは 複雑な数値計算やってるだろうからちょっと特殊だな。 車でもカーナビのように限られたリソースでGUI作るようなところは 使ってるだろうが、間違っても制御には使わんと思うんだが。
233 名前:デフォルトの名無しさん [2008/03/03(月) 05:53:38 ] >>230 ありがとうございます。 getline()とcinを混在させないのが一番いいと。でも、cinが便利なので、 基本的にはcinを使いつつ、cinだと改行を扱うのが不便なのでその時だけgetline()を 使う、という風になりそうです。(自分としては) すると、 (1)getline()する前にバッファに改行が残っているか確認して、残っていれば消す。 (2)cinした後には改行を消しておく。 のどっちかになると思うのですが、今回は(1)の方法が分からなかったので、(2)で実装しました。 どっちにしても、cin関係はなんか使いにくい感じ。
234 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:03:00 ] linux のmmapのこと調べてて疑問に思ったので質問。 mmap でファイルを仮想メモリにマッピングしたとき、OSがファイル上のデータを ブロック転送する、アプリがその領域に書き込むとOSがファイルにそれを反映すると 書いてあった。 mmapでマップされた領域に上のあるアドレスに代入したとき、 OSは代入されたことを知っているの? 代入演算子で値を放り込むことと、read write のシステムコールを使うのは 根本的に違いますよね?
235 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:03:27 ] >>218 GEANTは4からC++だよ!
236 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:09:53 ] >>234 C/C++の問題じゃないと思う 多分OSがマッピングした領域は書き込み不可の属性が付いており 書き込んだらCPUに割り込みがかかってそれを利用してファイルに反映してるか そんな所だと思う
237 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:14:44 ] >>236 失礼しました。 環境に依存する内容は避けたほうがよいですね。
238 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:52:21 ] >>237 環境依存OKのスレだから問題ないんだけどC/C++よりも linuxの話になるね ちなみにWindowsの仮想メモリとメモリマップトファイルも似たような 機構で実現している
239 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 07:59:34 ] 複数ある単語から文字列中最初にマッチする物を探す用途で、 こんなのを考えてみたのですが、こういう2分木辞書ってなんて 名前になるんでしょうか? サフィックスツリー?(これよりもっと複雑なようですが) typedef std::map<char, Node> Tree; //char に単語の1文字が入る struct Node { Node *pChild; //次の文字ノード int No; //登録番号、兼、非末端(-1) } 単語がab,ba,ac,abcとあるなら、子ノードの繋がりが下記のようになる。 先頭 <a,-1> <b,-1> / \ / <b,0> <c,3> <a,1> / <c,3>
240 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 08:01:07 ] 訂正 struct Node { Tree *pChild; int No; }
241 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:10:06 ] &ClassName::memberVarName; って演算はいったい何を行っているのでしょうか? 最初オフセット値を得ているのかと思ったんですが、ためしに出力しても、1が出力 されるだけです。 元ソースでは、これを引数にしてメンバ変数のオフセット値を得ているようですが…
242 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:11:38 ] >>241 メンバポインタでぐぐれ
243 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:27:45 ] >>242 ありがとうございます。おかげで理解できました。 メンバポインタからオフセット値を得るには、 &( static_cast<A*>(0)->*memPtr ) で仕様上問題ないでしょうか?
244 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:35:43 ] 単にオフセットが欲しいんなら offsetof を使えばいい
245 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:13:30 ] >>243 実際には動くだろうけど、仕様上は良くないような ちゃんとインスタンスを用意した方がいいんじゃない
246 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:30:26 ] >>243 オフセットは POD 型に対しての offsetof でしか取れないよ。 素直にメンバポインタ通して参照しちゃダメなの?
247 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 12:07:59 ] >>229 仕様上正しい。 以下はJosuttis本の記述の要約。 istream& istream::ignore(streamsize count, int delim) This form ignores up to count characters until delim is extracted and discarded. (ストリームから改行まで抽出されて捨てられる。) ちなみにg++ 4.0では無問題だった。
248 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 12:50:21 ] >>239 トライ木じゃねえの
249 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:03:37 ] >>236 割り込みなんかかからない。 ページング機構を備えるどんなプロセッサでも(俺の知る限り) プロセッサ自体に、書き込まれたかどうかのフラグ (いわゆる、dirty bit と呼ばれるもの)をセットする機構がある。 例えばx86ならば、ページテーブルの該当ページを示すエントリ内にこれがある。 で、ファイルから読み込んだときにOSがこのフラグをリセットしておき OSは、ページが不要になった時やsync要求が来たときにこのフラグを確認して 書き戻すか破棄するかを決定する。
250 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:09:16 ] >>248 それみたいですね。 すっきりしました、感謝。
251 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:48:21 ] >>245 ,246 仕様上ダメですか…違う方法を模索することにします。
252 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 20:58:31 ] >>249 すみません。 read write のようなシステムコールを実行するとOSデバイスドライバが あとは処理してくれますよね? 代入演算子を使ってmmapした領域に書き込むとき、 そのフラグもセットするようにgccが実行ファイルを生成してくれるのでしょうか? でもそれだと操作するアドレスがどこなのかをプログラムソースには書かなくても実行ファイルの中では 毎回見ているということでよろしいのでしょうか?
253 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:15:49 ] dirty bitを立てるのは249に書いてあるとおりCPUの仕事。 特にコンパイラがすることはない。
254 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:47:57 ] 仮想記憶でぐぐればいいと思うよ。
255 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:51:42 ] ちなみに、少し前のLinuxカーネルのバグは この複数からの同一ページへのアクセス時に このフラグをうまく処理しなかったかららしい。 また、少し違うが phenomのバグはキャッシュに対するdirty bitの反映が 高負荷時に滞るというものらしい。
256 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:03:13 ] もう少し補足すると、 普通のページング可能なプロセッサは、 TLBと呼ばれる、ページテーブルのキャッシュを内部に持っている。 (x86以外では呼び方が違うかもしれない) したがって、該当ページへの書き込みがある度に 毎回物理メモリ上のページテーブルに書き込んだりはしない。 (TLB内の情報と変更があった場合のみ、書き込む) で、このTLBの内容を書き戻すときにまずキャッシュに書き込むわけだけど これがうまくいかない場合がある、というのがphenomのバグらしい。 L1とL2の関係もあるとかどっかで読んだが詳しくは覚えてない。
257 名前:デフォルトの名無しさん [2008/03/03(月) 22:37:05 ] enumってプリプロセッサが解釈するのでしょうか??
258 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:41:16 ] いいえ。コンパイラたんがせっせこお仕事します。
259 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:41:58 ] >>258 サンクスでちゅ。
260 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:51:12 ] >>253 ありがとう。 CPUのやるとことまで押さえるのは難しいな。 もちろん仮想記憶で調べたりもしてるんですが、 なかなか自分の知りたいところのたどり着けない。 使い方はソースも含めて載ってたりするんだが。
261 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:31:23 ] >>260 そういうCPUまわりのことを色々知りたいなら、 www.intel.co.jp/jp/download/index.htm ここにあるIA-32なんとかなんとか下巻:システム・プログラミング・ガイドが参考になるかも
262 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:00:20 ] ちょっとお聞きしたいのですが stringクラスの関数でcompareというのがありますが、参考書によると int compare(const string& str) const; のように定義されているとあります。 この定義のconst string& の&ってどういう意味の&なんでしょうか? 最後のconstも、なぜここにconstがあるのか分かりません。 また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか?? 質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。
263 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:15:09 ] >>262 C++をもちっと勉強するといいよん。 &は参照。C++で導入された機能。参照についてはぐぐるよろし。 constは簡単に言うと「この関数はメンバ変数を変更しません」って宣言。 compare関数を呼ぶことで元の文字列を弄られちゃ話にならんだろ?
264 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:15:17 ] たぶん、これからも山ほど疑問が出てくるだろうから 入門書を読んだほうが早いと思う。
265 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:16:31 ] あと定義はstring.hではなくてstringの中だ。 string.hはCのヘッダーだからそりゃないだろうね。
266 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:19:45 ] >>262 > ちょっとお聞きしたいのですが > stringクラスの関数でcompareというのがありますが、参考書によると > > int compare(const string& str) const; > > のように定義されているとあります。 > この定義のconst string& の&ってどういう意味の&なんでしょうか? > 最後のconstも、なぜここにconstがあるのか分かりません。 > > また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか?? > 質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。 例えばcompare(const string str)だとすると引数にstd::string型のオブジェを入れると std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く compare(const string& str) とする理由は引数に参照を取る事となり コピーが働かないので無駄なメモリの消費がなくなる。 最後のconstはメンバ関数を呼び出したオブジェクトを修正できないようにすることです
267 名前:252 mailto:sage [2008/03/04(火) 01:45:56 ] レスくださった方々ありがとうございます。 >std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く >compare(const string& str) とする理由は引数に参照を取る事となり >コピーが働かないので無駄なメモリの消費がなくなる。 なるほど!勉強になります。 あと、compareの宣言ですが、stringやcstringの中も見てみたのですが、みつからないんです。
268 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:54:48 ] >>267 更にstringからインクルードしている先にあるんじゃないか? 例えばcygwinのgccだと/lib/gcc/i686-cygwin/3.4.4/include/c++/bits/basic_string.hにある。
269 名前:デフォルトの名無しさん [2008/03/04(火) 02:19:09 ] >>262 VSならソースコード中に#include <string>として stringの所にカーソルあわせて右クリックでstringを開くを選択すれば 中身は見れるよ
270 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:14:40 ] 適当なcompareのとこで右クリック→定義を参照すれば、basic_string::compare()かなにか出ると思うよ
271 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:15:02 ] あ、VSの話ね
272 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:30:57 ] たまにはBCBとかのことも思い出してね
273 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:34:19 ] grepくらい使えよ(´・ω・`)
274 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:37:41 ] findも使えよと混ぜ返したらDOSのfind.exeと誤解される罠。
275 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:46:55 ] プリプロセッサだけ通したモノにエディタで検索かけるのはダメですか…?