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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/12/11(木) 03:51:37
C++/CLI使えばいいお
953デフォルトの名無しさん:2008/12/11(木) 10:33:35
reference countっていうidiomがあります
で、それを実装に利用したのがスマートポインタなんですねーこれが
954デフォルトの名無しさん:2008/12/11(木) 12:19:49
>>947
初めて知ったぜ畜生・・・
955デフォルトの名無しさん:2008/12/11(木) 13:19:41
>>947
なんでそんな仕様なの?
956デフォルトの名無しさん:2008/12/11(木) 13:38:14
>>955
未初期化の結果生まれる不定値は危険なバグの元だから。
初期化処理を省きたければ C と同じように書けばいいわけで、
逆に初期化しない理由が無い。
957デフォルトの名無しさん:2008/12/11(木) 16:45:37
switchの中で配列を作ると↓と言われて動かないです。
どうすればいいですかー?

error C2361: 'items' の初期化が 'default' ラベルによって行われませんでした。
958デフォルトの名無しさん:2008/12/11(木) 16:46:18
caseの中身を{}でブロック化し、その中で変数を宣言する。
959デフォルトの名無しさん:2008/12/11(木) 16:47:53
case 0:
{
  int a[100];
}
みたいに{}でくくるとうまくいかないか?
960デフォルトの名無しさん:2008/12/11(木) 16:48:19
ブロック
961デフォルトの名無しさん:2008/12/11(木) 16:48:24
わぁお被った
962デフォルトの名無しさん:2008/12/11(木) 16:49:56
できたです。どーもです。
963デフォルトの名無しさん:2008/12/11(木) 17:31:39
自分はこれがイヤだから、switchではなくifで分けるほうが多いな。
964デフォルトの名無しさん:2008/12/11(木) 19:40:11
>>956
C++/CLIはどうか知らんが、int型にデフォルトコンストラクタなんて
ないし、クラスのコンストラクタで初期化していないのだから、C++
の言語仕様では0にはならんだろ。

それに初期値として0が妥当かどうかはケースバイケース。
965デフォルトの名無しさん:2008/12/11(木) 19:53:05
見かけ上であればあるよな
int x(10);とか
int y;
y = int(10;
とか
966デフォルトの名無しさん:2008/12/11(木) 19:53:51
y = int(10);
とか
y = int();
967デフォルトの名無しさん:2008/12/11(木) 20:09:11
だってクラスだもん
968デフォルトの名無しさん:2008/12/11(木) 20:26:59
>>956
その説明では納得できないな。
P p; と P() は両方変数を作成する構文なのに
後者の場合だけメンバ変数まで初期化するのに妥当な理由が見出せない。
仕様のどこに規定されている?
969デフォルトの名無しさん:2008/12/11(木) 20:50:55
>>968
前者は変数を作成する構文で、後者は値を生成する構文。
970デフォルトの名無しさん:2008/12/11(木) 21:17:12
>>969
組み込み型の話をしてないか?
964や967の言うとおりクラスの話なんだが。
両方ともオブジェクトをインスタンス化する構文だろ。
971デフォルトの名無しさん:2008/12/11(木) 21:25:48
>>970
>>968の書いていることが間違っていると指摘しただけなんだが
972デフォルトの名無しさん:2008/12/11(木) 21:32:35
>>971
ん、ごめん。よく分からないな。
P()は一時「変数を作成」する構文だと思ってるのだけど、
「値の生成」なの?
そこがよく分からなかったので、970で、「それは組み込み型の話じゃないの?」って
聞いたんだけど。
973デフォルトの名無しさん:2008/12/11(木) 22:17:01
デフォルトコンストラクタとコピーコンストラクタといってくれ
974デフォルトの名無しさん:2008/12/11(木) 22:19:30
>>972
一時変数ではなくて一時オブジェクトなのだが
975デフォルトの名無しさん:2008/12/11(木) 22:23:23
どう違うの?
976デフォルトの名無しさん:2008/12/11(木) 22:57:18
ウィンドウズのGUIアプリを作りたいんですが、今の主流はなんですか?WIN32API?
977デフォルトの名無しさん:2008/12/11(木) 23:02:37
wpf
978デフォルトの名無しさん:2008/12/11(木) 23:03:42
>>976
フリーソフトやパッケージソフトの類なら、その通りかな
979デフォルトの名無しさん:2008/12/11(木) 23:55:00
#include<iostream>
using namespace std;
struct A{int i;};
A ga;
int main(){
static A sa;
A la;

cout << "ga.i = " << ga.i << endl;
cout << "sa.i = " << sa.i << endl;
cout << "la.i = " << la.i << endl;
cout << "ra.i = " << A().i << endl;
}

結果(VC2008)
ga.i = 0
sa.i = 0
la.i = 2406644
ra.i = 0

普通の変数と一緒だな
980デフォルトの名無しさん:2008/12/12(金) 00:17:33
>>968
5.2.3の2段落目や8.5の7段落目でT()は値初期化するとなっているが、
8.5の9段落目では、デフォルトコンストラクタを持たない型で
初期化子のないオブジェクトは初期化されないと決められている。

newだと両方の書き方ができるので、分かりやすいかもしれない。
new intは初期化子がないので、初期化されない。
new int()は空の初期化子を持つので値初期化(組込型ではゼロ初期化)される。
981デフォルトの名無しさん:2008/12/12(金) 00:25:06
イテレータのポインタへの変換ってやっても大丈夫なの?
とりあえず動いてはいるみたいなんだけど・・・
982デフォルトの名無しさん:2008/12/12(金) 00:40:09
>>981
キャストしての変換だったら駄目ぜったい。

&*itなら、vectorならおk、basic_stringも今度から認められる。
配列へのポインタのごとく足したり引いたりしていい。

それ以外のコンテナでの&*itは、単純にその要素へのポインタとしてしか使えない。
983デフォルトの名無しさん:2008/12/12(金) 02:57:16
cをちょこちょこっとかじってからc++に移行し始め、今まで毎回バグって全然動かなかったDxのプログラムが初めてマトモに動いた

   イィィヤッッッッホオォォォー

    *     +    巛 ヽ
               〒 !   +
         +    。  |  |
      *     +   / /   +
          ∧_∧ / /
         (´∀` / / +
         ,-     f
         / ュヘ    | *
        〈_} )   |
           /    ! +
          ./  ,ヘ  | 
    ガタン ||| j  / |  | |||
   ―――――――――――――

     誰かに届け、この喜び
984デフォルトの名無しさん:2008/12/12(金) 02:59:43
>>964
int にデフォルトコンストラクタがあるとか初期値として 0 が常に妥当だとか、
誰もそんなこと言ってないのになんで偉そうに間抜けを晒すかね。
985デフォルトの名無しさん:2008/12/12(金) 03:05:31
>>982
ありがとう、気をつけるよ
そしてうまくいかないのは別の原因だった罠・・・orz
986デフォルトの名無しさん:2008/12/12(金) 03:07:39
>>983
その気持ち、忘れるなよ。
987デフォルトの名無しさん:2008/12/12(金) 06:35:26
>>984
BASICプログラマは黙ってろ!
988デフォルトの名無しさん:2008/12/12(金) 10:59:59
989デフォルトの名無しさん:2008/12/12(金) 11:10:20
















990デフォルトの名無しさん:2008/12/12(金) 11:38:49
>>987
>>980 が難しくて解らなかったのか、それとも単に読み飛ばしたのか。
991デフォルトの名無しさん:2008/12/12(金) 12:44:45
CString str = _T(test 1 test 2 test 3);
CString in = str.SpanIncluding(_T("1234567890"));

in に 123 がはいりません_T("")になってます。どうしてですか?
992デフォルトの名無しさん:2008/12/12(金) 12:50:16
文字列の最初の文字から始まり、pszCharSet. にない文字が出現するところで終了する
だった解決した
993デフォルトの名無しさん:2008/12/12(金) 16:12:48
>>980
ありがとう。規格を読んで全部ではないが理解できた。
PODでは0初期化されるんだな。

そしてnon-POD class typeではデフォルトコンストラクタが呼ばれるから0初期化されないと。
979でstruct A{int i; virtual void Func(){}}; とすると A().i != 0 となったよ。
俺はPODでもこうなると勘違いしてたよ。勉強になった。
994デフォルトの名無しさん:2008/12/12(金) 18:49:28
しかし、 古いコンパイラだと実際には初期化してくれないことも・・・
995デフォルトの名無しさん:2008/12/12(金) 19:31:30
void func()
{
int i;

cout << i << endl;
}

現実問題、市販フリー問わず現在市場に出回ってるコンパイラで、iの
値が0に初期化されることが保証されるコンパイラってあるのか?

警告レベル上げれば初期化されていない変数を参照しているって警告を
出すけど、ほとんどのコンパイラでiの値は不定だと思うが?
996デフォルトの名無しさん:2008/12/12(金) 19:36:05
セグメント次第
997デフォルトの名無しさん:2008/12/12(金) 23:04:43
つぎすれ だれか たのむ
998デフォルトの名無しさん:2008/12/13(土) 00:17:38
>>995
初期化されると思う方がどうかしている。話題になっているのは、その書き方の話ではない。
999デフォルトの名無しさん:2008/12/13(土) 00:24:06
立てた。
【初心者歓迎】C/C++室 Ver.62【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1229095398/l50

>>8
たぶん何度もコピペされたからだと思う。
1000デフォルトの名無しさん:2008/12/13(土) 00:29:46
千と千尋の金閣寺
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。