C++初心者のための0保証の有無

このQ&Aのポイント
  • Cの開発経験のみで、C++に関しては初心者です。
  • 下記のサンプルコードで、main()関数にてobj1.xとobj2.yの初期値設定をしているのですが、obj1.yは不定な値をインクリメントすることにはならない(0保証される)のでしょうか?
  • 結果論で片付けるのはイヤなので、出力結果を見ると0が入っていたと認識できるんですが、
回答を見る
  • ベストアンサー

【C++】0保証の有無

Cの開発経験のみで、C++に関しては初心者です。 下記のサンプルコードで、main()関数にてobj1.xとobj2.y の初期値設定をしているのですが、 obj1.yとobj2.xに関しては何も設定していません。 obj2.xはobj1.xの値をコピーしているので問題ないと思いますが、 obj1.yは不定な値をインクリメントする事には ならない(0保証される)のでしょうか? (出力結果を見ると、0が入っていたと認識できるんですが、 結果論で片付けるのはイヤなので・・・) 以下、サンプルコード ---------------------------------- #include<iostream> using namespace std; class POINT { public: long x; long y; void operator ++(int n) { x++; y++; } POINT operator ++() { ++x; ++y; return *this; } } obj1 , obj2 ; int main() { obj1.x = 10; obj2.y = 5; obj2 = ++obj1; obj2++; cout << "x = " << obj1.x << "\ty = " << obj1.y << '\n'; cout << "x = " << obj2.x << "\ty = " << obj2.y << '\n'; return 0; } ----------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • koyadi
  • ベストアンサー率36% (7/19)
回答No.1

c++で初期化を行わない変数の値は 自動変数とレジスタ変数の場合ごみ値がはいりますが 静的変数と外部変数は0が入ります。 このサンプルではobj1、obj2がグローバルのスコープで宣言されていますので0でメンバが初期化されますが、POINTクラスをローカルで宣言した場合はごみ値が入ります。

akiyousan
質問者

お礼

そういう区切りがあるわけですね。 試しにPOINTクラスをローカルで宣言してみたら、 確かにゴミ値が入る事が確認できました。 回答ありがとうございます。

関連するQ&A

  • C言語/プログラミング

    int Trianglearea(int x, y) { return x * y / 2; } int main() { int x, y, ans; cout << "底辺を入力してください。\n"; cin >> x; cout << "高さを入力してください。\n"; cin >> y; cout << "三角形の面積は" <<Trianglearea(x, y) << "です。\n"; return 0; } これで、実行したらエラー発生しました。エラーを治す方法を教えてください。

  • +演算子オーバーロード

    こんにちは。お世話になっております。 // +演算子オーバーロード CPoint CPoint::operator+(CPoint& obj) //~(1) { CPoint tmp; tmp.m_x = m_x + obj.m_x; tmp.m_y = m_y + obj.m_y; return tmp; } int main() { CPoint point1( 100, 150 ); CPoint point2( 200, 50 ); std::cout << "x:" << point1.getx() << "y:" << point1.gety() << std::endl; point1 = point1 + point2; // オーバーロードされた+演算子が呼び出される std::cout << "x:" << point1.getx() << "y:" << point1.gety() << std::endl; point1 += point2; // オーバーロードされた+=演算子が呼び出される std::cout << "x:" << point1.getx() << "y:" << point1.gety() << std::endl; return 0; } 某サイトで上のようなサンプルプログラムがあるのですが これはc++で書かれた「+演算子オーバーロード」の定義で、動作としては 「point1 = point1.operator+( point2 ); // point1 = point1 + point2; と同じ」というような動作です。 それで疑問が出てきたのですが、イコールの右側で足す数が↓のような3つの場合、ans = a + b + c;です。 これだと(1)のところの引数を2つをとる関数を別に作らないとだめでしょうか?それとも、ans = ((a + b) + c);というふうに優先順位で自動的に計算してくれる+演算子オーバーロードのプログラムを教えてくれませんか?↑式のカッコは便宜上付けただけで、出来ればans = a + b + c;だけで計算出来るプログラムを教えてください。

  • C++ 関数プロトタイプと値渡し・参照渡しについて

    次のコードは、入門書にあった値渡しのサンプルです。 値渡しなので、a=5 ,b=10が出力されます。 void swap(int x,int y); //←抜けていた int main(){ int a=5; int b=10; swap(a,b); cout<<"a="<< a << "\n"; cout<<"b="<<b<<"\n"; } void swap(int x,int y){ int tmp=x; x=y; y=tmp; } しかし、自分で入力したところ何故かa=10,b=5が出力されました。 (VisualC++2008で実行しました。) よく見てみると、上記1行目の関数プロトタイプが抜けていました。 入門書を読んだ限りでは、次の2点が理解できません。 (1)main関数の後ろにswap関数があり、関数プロトタイプが無いのでコンパイルエラーになるはずなのにならない (2)値渡しのはずなのに参照渡しと同じ結果になる よろしくお願いします。

  • 【C++】関数からクラスに変更するには?

    いつも大変お世話になっています。 VC++初心者です。 関数をクラス化していきたいのですが、具体的にどのようにしたら良いか ご指導頂けませんでしょうか。 例えば、このようなソースがあった場合、どのようにクラス化させるのでしょうか。 (また、下記の例ですと、pulsとsubで1つのグループ、 goodMoringとgoodNightで1つのグループにさせる場合には どうすれば宜しいでしょうか。) //======================= //Tool.hの中身 //======================= int plus(int x, int y); int sub(int x, int y); void goodMorning(); void goodNight(); //======================= //Tool.cppの中身 //======================= #include <iostream.h> int plus(int x, int y){ return x + y; } int sub(int x, int y){ return x - y; } void goodMorning(){ cout << "おはよう\n"; } void goodNight(){ cout << "こんばんは\n"; } //======================= //Main.cppの中身 //======================= #include <iostream.h> #include "Tool.h" int main(){ int a = puls(1,1); cout << a <<'\n'; int b = puls(2,1); cout << b <<'\n'; goodMorning(); goodNight(); }

  • C#のインクリメント演算子のオーバーロード(前置きと後置き)

    インクリメント演算子をオーバーロードして、後置きインクリメントの場合に戻り値が演算前の結果を返すようにする方法はありませんか? class Sample {  public int x;  public int y;  public Sample(int x, int y)  {   this.x = x;   this.y = y;  }  public override string ToString()  {   return base.ToString() + " - x = " + x + ", y = " + y;  }  public static Sample operator ++()  {   x++; y++;   return this;  } } class EntryPoint {  public static void Main()  {   Sample sample = new Sample(1, 2);   // 「Sample - x = 2, y = 3」で、期待通り   Console.WriteLine(++sample);   // 「Sample - x = 3, y = 4」で、期待したのはインクリメントされる前の値である「「Sample - x = 2, y = 3」   Console.WriteLine(sample++);  } }

  • C++超初心者質問

    Visual C++ 2008 Express Edition Ver9.0.30729.1 SP を利用し、以下のプログラムを実行するための手順を教えてください。 Visual C++ 6.0では、ファイル>新規作成→ファイルTAB>C++ソースファイルのように、上記の場合はどのように進んだらよいのでしょう? ファイル>新規作成>プロジェクト→Win32 コンソール アプリケーション??? とすると、↓のエラーが出てしまいます。尚、VC2008をインストールしてから何も触っていません。 http://okwave.jp/qa4665322.html ソース #include<iostream> using namespace std; class coord{ int x,y; public: coord(){x=0;y=0;} coord(int i,int j){x=i,y=j;} void get_xy(int &i,int &j){i=x;j=y;} friend coord operator+(coord ob1,int i); friend coord operator+(int i,coord ob1); }; coord operator+(coord ob1,int i){ coord temp; temp.x=ob1.x+i; temp.y=ob1.y+i; return temp; } coord operator+(int i,coord ob1){ coord temp; temp.x=ob1.x+i; temp.y=ob1.y+i; return temp; } int main(){ char c[3]; // 画面固定のため coord o1(10,10); int x,y; o1=o1+10;; o1.get_xy(x,y); cout<<"(o1+10)X:"<<x<<",Y:"<<y<<"\n"; o1=99+o1;; o1.get_xy(x,y); cout<<"(99+o1)X:"<<x<<",Y:"<<y<<"\n"; cout<<"\nエンターで抜けます"<<endl; // 画面固定のため gets(c); return 0; }

  • C++ネットのサイトで独学で勉強してます

    http://wisdom.sakura.ne.jp/programming/cpp/index.html のクラスという所での #include <iostream> using namespace std; class Kitty { private: int point; public: void setPoint(int i); int getPoint(int i); }; void Kitty::setPoint(int i) { point = i; } int Kitty::getPoint(int i) { point += i; return point; } int main() { Kitty obj; obj.setPoint(0); for (int i = 0 ; i < 10 ; i++) cout << obj.getPoint(i) << "\n"; return 0; } についてなんですが、 Kitty obj;というのが説明なしでいきなり出てきたので困ってます。この意味を教えて欲しいです。よろしくお願いします。C言語は一応勉強しました。 ちなみに、できればC++で詳しく書かれていて、理解しやすいサイトを教えて欲しいです。http://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.htmlは見たのですがこのサイトも途中でつまずきました。

  • C++のことで・・教えてください。

    下記のプログラムはコンパイルはできますが、実行するとエラーとなり強制終了させられてしまいます。いつたいなぜなのでしょうか? #include<iostream.h> struct point{ int x; int y; }; struct pairpoint{ point so; point si; }; pairpoint* h = (pairpoint*)malloc(1); int main(){ h[0].so.x = 1;h[0].so.y = 3; h[0].si.x = 5;h[0].si.y = 7; cout << h[0].so.x << "," << h[0].so.y << endl; cout << h[0].si.x << "," << h[0].si.y << endl; }

  • {x = x>y ? x:y; return x;}

    #include <iostream> using namespace std; inline int max(int x, int y){x = x>y ? x:y; return x;} int main() { int num1, num2, ans; cout << "2つの整数を入力して。\n"; cin >> num1 >> num2; ans = max(num1, num2); cout << "最大値は" << ans << "です。\n"; return 0; } の{x = x>y ? x:y; return x;}の部分の意味が解りません。

  • Cのローカル変数でstatic以外の使い方?

    C言語の課題について教えてください [課題] 以下の関数がある。各関数の引数、変数は自由に設定していい ・int main() ・void func() ・Point *get() { /* 構造体のアドレスを返す */ } ・構造体 typedef struct { int x; int y; int h; int w; }Point; 問題 main関数から、func関数を経由して、get関数を経由し値を取得し、表示する 以下が考えたソースになりますが、これだと、 ローカル変数でstaticを使っているので、get関数が固定値ではなく、 取得のたびに値が変わるような場合には、だめだといわれました。 考えたのですがよくわからないので、どういう場合に駄目なのかと、 どのように修正すればいいのか教えてください。 #include <stdio.h> typedef struct { int x; int y; int h; int w; }Point; void func(Point **); Point *get(); int main(void){ Point *get; func(&get); printf("get.x:[%d]\n",get->x); printf("get.y:[%d]\n",get->y); printf("get.h:[%d]\n",get->h); printf("get.w:[%d]\n",get->w); return 0; } void func(Point **pw){ *pw = get(); printf("Wrapper: pw==%p\n",pw); } Point *get(void) { static Point pget; pget.x = 2; pget.y = 2; pget.h = 30; pget.w = 40; return &pget; }

専門家に質問してみよう