アル中プログラマの備忘録

酔いどれまさになう

新しく分割しました

スポンサーサイト

このエントリーをはてなブックマークに追加
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[C++]初めてのクラス

このエントリーをはてなブックマークに追加
さて、いよいよ初めてC++でクラスを書いてみた。
日本語については賛否あるけど、今回は勉強なので気にせずコメントがわりに使った。
三角形のクラスに面積を求めるメソッドをを持たせることにした。
書いたクラスは以下のとおり。
#include <iostream>
using namespace std;

class 三角形
{
private:
	int	底辺;
	int 高さ;
public:
	三角形(int, int);
	~三角形();
	double 面積を求める(void);
};

三角形::三角形(int 底辺, int 高さ)
{
	三角形::底辺 = 底辺;
	三角形::高さ = 高さ;
	cout << "三角形が生まれた\n";
}

三角形::~三角形()
{
	cout << "三角形がお亡くなりになった\n";
}

double 三角形::面積を求める()
{
	double ret = 1.0 / 2 * (底辺 * 高さ);
	cout << "三角形の面積は" << ret << "だ\n";
	return ret;
}

void main()
{
	三角形 a(10, 10);
	三角形 b(20, 30);
	cout << "aの面積は" << a.面積を求める() << "だ\n";
	cout << "bの面積は" << b.面積を求める() << "だ\n";
}
構文を知ればそれほど難しくはなかったけど、C#と比べると色々違う。
ざっと気づいた点を列挙すると以下の通り。
なるほど。そもそもC++とC#ではnewも違うみたい。
本当に構造体がメンバーに関数も持つようになったみたいな状態だし、なれないと違和感がある。

ちなみにC#で破棄したいものがあるときはIDisposableを実装してDispose()を使うので、
デストラクタを書くイメージがあまりないのだけど、C++だとどうなのかな?

[おまけ]
実行結果
三角形が生まれた
三角形が生まれた
三角形の面積は50だ
aの面積は50だ
三角形の面積は300だ
bの面積は300だ
三角形がお亡くなりになった
三角形がお亡くなりになった
スポンサーサイト
続きを読む
  1. 2012/07/10(火) 22:22:43|
  2. C++
  3. | トラックバック:0
  4. | コメント:2

[C++]newとdelete

このエントリーをはてなブックマークに追加
C++でのメモリー確保についてやってみた。(Cだとmallocとかfreeってやつ)
間違ってたら教えて。
#include <iostream>
using namespace std;

struct Data
{
	int num;
	char *message;
};

void main()
{
	//newでヒープ領域を割り当てる
	const int size = 10;
	Data** dataList = new Data*[size];
	for(int i = 0; i < size; i++)
	{
		Data *data = new Data;
		data->num = i;
		data->message = "test";
		dataList[i] = data;
	}

	//表示してみる
	for(int i = 0; i < size; i++)
	{
		Data* data = dataList[i];
		cout << data->num << ' ' << data->message << '\n';
	}

	//使い終わったらdeleteで開放
	for(int i = 0; i < size; i++)
	{
		delete dataList[i];
		dataList[i] = NULL;
	}
	delete [] dataList;
	dataList = NULL;
}
「new」で割り当てて「delete」で開放する。「new」は確保に失敗したらNULLを返すらしい。これはmallocとかと一緒だ。(今回はチェックしてない)
それと、配列を「new」したら「delete」じゃなくて「delete []」ってやるのが作法らしい。コレはすごく忘れそう。なんとなく先頭だけ開放されて、他の部分が残るのかなという印象だけど、言語仕様まで調べてない。

本題と違うところでも気になるところがある。構造体の形をtypedefしなくてもstructなしで使えるし、coutへの<<はたくさん繋げれる(しかも違う型で)。

2つ実験してみた。
1.複数回「delete」すると怒られるか?
#include <iostream>
using namespace std;
void main()
{
	int *num = new int;
	*num = 10;
	cout << *num;
	delete num;
	delete num;
}
やっぱり2回目のdeleteで実行時エラーになった。納得(エラーになってくれないほうが不安だ)。

2.NULLポインタを「delete」すると怒られるか?
#include <iostream>
using namespace std;
void main()
{
	void *none = NULL;
	delete none;
}
コチラは何も怒られなかった。言語仕様上安全が保証されているらしい。英語だったので真剣に読んでない。
普段他の言語(CのfreeやC#のDispose)のあとでよくやるように解放後はNULLを代入しといてやればひとまず安心できそう。

以上。 続きを読む
  1. 2012/07/07(土) 17:12:22|
  2. C++
  3. | トラックバック:0
  4. | コメント:2

C++でHellow World

このエントリーをはてなブックマークに追加
C++(Visual Studio 2010 Express)でHello Worldを書いてみた。
#include <iostream>
using namespace std;

void main()
{
	cout << "Hello World";
}
coutってのに「<<」ってやると標準出力されるらしい。
標準エラー出力もやってみた。
#include <iostream>
using namespace std;

void main()
{
	cerr << "Hello World";
}
coutをcerrに変えるだけだった。(cはC++のcなのかなぁ?)
次に標準入力。コレはcinってのを使うらしい。
#include <iostream>
using namespace std;

void main()
{
	char name[32];
	cin >> name;
	cout << "Hello " << name;
}
これで、入力した文字が出る。(エラー処理の仕方はまだわからないので何もしてない)
これらを見るとなんとなくストリームに矢印の向きに流してるように見えて、次のを試してみたけど、コンパイルエラーだった。(知ってる人が見たら相当アホなことしてるんだろうw)
#include <iostream>
using namespace std;

void main()
{
	"Hello" >> cout;
	char name[32];
	name << cin;
}
「<<」と「>>」は別の演算子で、それぞれ使うことのできるオペランドがあるらしい。
おまけで関数呼び出しと「printf」を使ってみた。
#include <iostream>
using namespace std;

char* getMessage(void)
{
	return "Hello World\n";
}

void main()
{
	cout << getMessage();
	printf("%s", getMessage());
}
当然だけど、動いた。まだまだC言語ぽいままだ。C++はやらずにC→C#、Javaと覚えたので難しくて面倒くさいイメージがあるけど、強力な言語なので触れるようになりたい。


[おまけ]
古い本を見ながらやってみたけど、Visual Studioを使うと次の点が違って、最初困った。

以上。 続きを読む
  1. 2012/07/07(土) 12:34:22|
  2. C++
  3. | トラックバック:0
  4. | コメント:0

おすすめ

プロフィール

アル中プログラマ

Author:アル中プログラマ
ハイボ○ル?
いいえ
ジンジャーエールです。

検索

Translate

カテゴリ

未分類 (28)
セミナー・勉強会 (34)
読書 (12)
プログラム (8)
環境構築 (16)
C++ (3)
Java (7)
C# (1)
Tips (1)
食べ物 (14)
TED (3)
マイホーム (0)
プロマネ (1)

RSSリンクの表示

おすすめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。