C++ コンストラクタに参照を渡す
スポンサーリンク
このドキュメントの内容は、以下の通りです。
C++言語で「メンバに参照を持つクラス」をメンバに持つクラスを初期化する方法について。C はデータクラスです。
X は、C の参照をメンバに持つクラスです。
Y は、X をメンバに持つクラスです。
Y は、X のために、C もメンバに持ちます。
X のコンストラクタは、C の参照を受け取ります。
これを値渡しにするとデストラクタが起動されて、意味不明なことになります。だから、参照が渡されるように & を忘れてはいけません。
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
class C
{
public:
string progname;
string conf;
C (string p, string c) : progname (p), conf (c)
{
cout << __PRETTY_FUNCTION__ << endl;
//cout << progname << endl;
//cout << conf << endl;
}
~C () {
cout << __PRETTY_FUNCTION__ << endl;
}
C (const C& o) {
cout << __PRETTY_FUNCTION__ << endl;
progname = o.progname;
conf = o.conf;
//cout << progname << endl;
//cout << conf << endl;
}
void p () {
cout << __PRETTY_FUNCTION__ << endl;
cout << progname << endl;
cout << conf << endl;
}
};
class X
{
C &c;
public:
X (C &c1) : c (c1) {
cout << __PRETTY_FUNCTION__ << endl;
}
~X () {
cout << __PRETTY_FUNCTION__ << endl;
}
void p ()
{
cout << __PRETTY_FUNCTION__ << endl;
c.p ();
}
};
class Y
{
C c;
X x;
public:
Y ( string p, string conf ) : c(p,conf), x(c) {
cout << __PRETTY_FUNCTION__ << endl;
}
~Y () {
cout << __PRETTY_FUNCTION__ << endl;
}
void p () {
cout << __PRETTY_FUNCTION__ << endl;
x.p ();
}
};
void t (char *argv[])
{
string progname = argv[0];
string conf = "foo.conf";
Y y ( progname, conf );
y.p ();
}
int
main (int argc, char *argv[])
{
t (argv);
exit (EXIT_SUCCESS);
}
コンパイル
コンパイル方法は、以下の通り。
g++ foo.cc
実行例
プログラムを実行すると以下のようにクラスが作成され、破棄されます。
オブジェクトが作られた順番と逆に破棄されます。
C::C(std::string, std::string) X::X(C&) Y::Y(std::string, std::string) void Y::p() void X::p() void C::p() ./a.out foo.conf Y::~Y() X::~X() C::~C()
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12