質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1708閲覧

基本的な文なのですが分かりません。教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/04/10 12:07

この2つのコードでコンパイル自体はうまくいくのですが、すべて表示されません。
どうすれば表示されますか?

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
//carクラスの宣言
class Car {
private:
int num;
double gas;
char* pName;
public:
Car(const char* pN, int n, double g);
~Car();
void show();
};

//Carクラスメンバ関数の定義
Car::Car(const char* pN, int n, double g)
{
pName = new char[strlen(pN) + 1];
strcpy(pName, pN);
num = n;
gas = g;
cout << pName << "を作成しました。\n";
}
Car::~Car()
{
cout << pName << "を破棄します。\n";
delete[] pName;
}
void Car::show()
{
cout << "車のナンバーは" << num << "です。\n";
cout << "ガソリン量は" << gas << "です。\n";
cout << "名前は" << pName << "です。\n";
}

//Carクラスの利用
int main()
{
Car car1("mycar", 1234, 25.5);
car1.show();

return 0;
}
表示したい文字:
mycarを作成しました
車のナンバーは1234です
ガソリンの量は20.5です
名前はmycarです←ここまで表示される
mycarを破棄します

サンプル3
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
//Carクラスの宣言
class Car {
private:
int num;
double gas;
char* pName;
public:
Car(const char* pN, int n, double g);
~Car();
Car(const Car& c);
Car& operator=(const Car& c);
};

//Carクラスメンバ関数の定義
Car::Car(const char* pN, int n, double g)
{
pName = new char[strlen(pN) + 1];
strcpy(pName, pN);
num = n;
gas = g;
cout << pName << "を作成しました。\n";
}
Car::~Car()
{
cout << pName << "を破棄します。\n";
delete[] pName;
}
Car::Car(const Car& c)
{
cout << c.pName << "で初期化します。\n";
pName = new char[strlen(c.pName) + strlen("のコピー1") + 1];
strcpy(pName, c.pName);
strcat(pName, "のコピー1");
num = c.num;
gas = c.gas;
}
Car& Car::operator=(const Car& c)
{
cout << pName << "に" << c.pName << "を代入します。\n";
if (this != &c) {
delete[] pName;
pName = new char[strlen(c.pName) + strlen("のコピー2") + 1];
strcpy(pName, c.pName);
strcat(pName, "のコピー2");
num = c.num;
gas = c.gas;
}
return *this;
}

int main()
{
Car mycar("mycar", 1234, 25.5);

Car car1 = mycar;

Car car2("car2", 0, 0);
car2 = mycar;

return 0;
}
表示したい文:
mycarを作成しました
mycarで初期化します
car2を作成しました
car2にmycarを代入します←ここまでうまくいく
mycarのコピー2を破棄します
mycarのコピー1を破棄します
mycarを破棄します

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

サンプル3のコードについてですが、この環境では問題なく出力されており、単にスコープの問題だと思います。
環境によっては出力されるようですが、main関数の終了後、デストラクタでの標準出力への出力結果がコンソールに出ていないようです。
以下のように明示的にスコープで囲むと出力されると思います。

C++

1// 略 2int main() 3{ 4 { // 追加 5 Car mycar("mycar", 1234, 25.5); 6 Car car1 = mycar; 7 Car car2("car2", 0, 0); 8 car2 = mycar; 9 } 10 return 0; 11}

投稿2018/04/10 12:41

編集2018/04/10 12:46
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/11 12:51

私はvisualstudio2017を使っているのですが、なぜでないと考えられますか?
can110

2018/04/11 12:55

実装については把握、確認していませんが、プログラム終了後に閉じられた標準出力に出力しているからと考えてます。
episteme

2018/04/11 13:00 編集

僕とこ(VS2017)ではちゃんと最後まで出力されます。 main終了"直前"にデストラクトされるのでそれはないと思う。
can110

2018/04/11 13:31 編集

うーん、デストラクト時のstd::cout << 呼出結果が出力先(コンソールなど)にちゃんと出ると保証されているのか?が分かりません。 この部分が出力先の実装によると考えています。 そういえば、プログラム終了時の標準出力の挙動(結果)について、この一年以内にteratailで見たような気が…
episteme

2018/04/11 13:35

...改行によってストリームがフラッシュされなければ、出力されぬまま終了は有りうるかもですね。
can110

2018/04/11 14:00

flushされなければ出力されず捨てられても仕方がないですね。 コメントありがとうございます。
episteme

2018/04/12 08:38

そーゆーわけで、各行の出力を cout << "~\n" 改め cout << "~" << endl; に置き換えて試してみておくれ。
can110

2018/04/12 12:13

今更ながらVS2017で試してみたらちゃんと出力されますた。 質問者様の確認手順が気になるけど、デバッグ実行で「return 0;」行にブレークポイント貼ってたというオチと推測。
episteme

2018/04/12 12:16

あー。それじゃデストラクタ動かんわな。
can110

2018/04/12 12:17

ですね~
guest

0

まず、質問の最初のコードを見ましょう。

各コードの行の下に、何が行われるかコメントしてみます。

int main() // メイン(主)ルーチンで、ここに書かれている通りに実行されます。 { Car car1("mycar", 1234, 25.5); // car1というCar型のオブジェクトを作るコンストラクタ。 // Car関数の ”cout << pName << "を作成しました。\n";”の部分で、「mycarを作成しました」と表示されます。 car1.show(); // show関数では、ナンバー、ガソリン、車の名前が表示されます。 return 0; // おしまい。 あれ? 「破棄します」を表示してないまま終わってる。。。。 }

どこにも「mycarを破棄します」と表示する部分がありませんから、表示されないのです。
車の名前の後に「mycarを破棄します」と表示させたいのですから、表示させるための関数を呼び出すのはreturn文の前ですよね。

そして、「mycarを破棄します」と表示するのは、"cout << pName << "を破棄します。\n";"という行を含む ~Car関数です。(コードの中で"破棄"という文字列が使われているのは、~Car関数の中だけですから、見逃しようがないと思います)

このように考えていくと、どこに、何を追加すれば望んでいるような表示がされるかが判ると思います。

追加してみたコード;

int main() // メイン(主)ルーチンで、ここに書かれている通りに実行されます。 { Car car1("mycar", 1234, 25.5); car1.show(); // 下の1行を追加します。 Car1.~Car(); return 0; }

2つ目のコードも、~Car関数を呼び出していないので「破棄します」が表示されないというのは同じですから、修正の仕方も同様です。
やってみてください。

投稿2018/04/10 12:35

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2018/04/11 20:40

...デストラクタを"わざわざ"呼ぶんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問