アフィリエイト広告を利用しています

広告

posted by fanblog

2017年09月27日

《その52》 オブジェクトの動的な生成(p.279演習7-15,p.285演習7-16,演習7-17)


int型オブジェクトの動的な生成

生成
int* x = new int; 不定値で初期化
int* x = new int(); 0で初期化
int* x = new int(5); 初期化子5 を与えて 5で初期化


破棄
delete x;


int型配列オブジェクトの動的な生成

生成
int* x = new int[10]; 不定値で初期化
int* x = new int[10](); 全要素を 0で初期化


破棄
delete[] x;



新版明解C++入門編 p.279 演習7-15
 double型のオブジェクトを生成して 0.0 で初期化するプログラムを作成せよ。

// p279_演習7-15
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
double* d = new double(); // 0.0で初期化
cout << "*d = " << fixed << setprecision(1) << *d << '\n';
delete d;
}

b07_15.png




新版明解C++入門編 p.285 演習7-16
 double型の配列を動的に生成するプログラムを作成せよ。要素数はキーボードから読み込むこと。
また、生成に失敗した場合の処理も行うこと。

// p285_演習7-16
#include <new> // bad_allocの定義
#include <iostream>
using namespace std;

int main()
{
int asize;
double* a;

cout << "double型配列の要素数 : "; cin >> asize;
try {
a = new double[asize];
}
catch (bad_alloc) {
cout << "配列の生成に失敗!\n";
return 1;
}

for (int i = 0; i < asize; i++)
a[i] = i * 1.11;
for (int i = 0; i < asize; i++)
cout << "a[" << i << "] = " << a[i] << '\n';

delete[] a;
}

b07_161.png

b07_162.png




新版明解C++入門編 p.285 演習7-17
 ポインタ p が指すオブジェクトの先頭 nバイトに v を代入する関数 mem_set を作成せよ。
    void mem_set(void* p, int n, unsigned char v);

// p285_演習7-17
#include <iomanip>
#include <iostream>
using namespace std;

void mem_set(void* p, int n, unsigned char v) {
/*
void* p の部分は受け取る引数のポインタ型を選ばない。
(1), (2) では char*型のポインタをキャスト無しで受け取り、
(3), (4) では int*型のポインタをキャスト無しで受け取っている。

*/
char* q = (char*)p;
/*
void*型をchar*型に代入するときはキャストが必要。
*/
for (int i = 0; i < n; i++) {
*(q + i) = v;
}
}

int main()
{
/**/cout << "(1) ------------\n";
char abc[27]; // 26文字+'\0'
for (int i = 0; i < 26; i++)
abc[i] = char('a' + i);
abc[26] = '\0'; // 文字列の終端

cout << abc << '\n';
mem_set(abc, 10, '#');
cout << abc << '\n' << '\n';

/**/cout << "(2) ------------\n";
char ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

cout << ABC << '\n';
mem_set(ABC, 10, 'z');
cout << ABC << '\n' << '\n';

/**/cout << "(3)------------\n";
int test1[] = { 1, 2 };
int size = sizeof(test1) / sizeof(test1[0]);

for (int i = 0; i < size; i++)
cout << setw(9) << test1[i] << " ";
cout << '\n';

mem_set(&test1, sizeof(int), char(0xFF));

for (int i = 0; i < size; i++)
cout << setw(9) << test1[i] << " ";
cout << '\n' << '\n';
/*
0x00000001( 1) が
0xFFFFFFFF( -1) になる。

*/

/**/cout << "(4) ------------\n";
int test2[] = { 1, 2, 3, 4 };
size = sizeof(test2) / sizeof(test2[0]);

for (int i = 0; i < size; i++)
cout << setw(9) << test2[i] << " ";
cout << '\n';

mem_set(&test2, sizeof(int) * 2, char(0x00));

for (int i = 0; i < size; i++)
cout << setw(9) << test2[i] << " ";
cout << '\n' << '\n';
/*
0x00000001( 1) 0x00000002( 2) が
0x00000000( 0) 0x00000000( 0) になる。

*/

/**/cout << "(5) ------------\n";
int test3[] = {1, 2, 3};
size = sizeof(test3) / sizeof(test3[0]);

for (int i = 0; i < size; i++)
cout << setw(9) << test3[i] << " ";
cout << '\n';

mem_set(&test3, sizeof(int) * 2, char(1));

for (int i = 0; i < size; i++)
cout << setw(9) << test3[i] << " ";
cout << '\n';
/*
0x00000001( 1) 0x00000002( 2) が
0x01010101(16843009) 0x01010101(16843009) になる。

*/
}

b07_17_.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6748419
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。