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;
}
新版明解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;
}
新版明解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) になる。
*/
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6748419
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック