この記事の主な内容は、コンストラクター、匿名オブジェクト、および内部クラスの暗黙的な型変換です。お役に立てれば幸いです。
より高品質なコンテンツにジャンプします:
目次
コンストラクターの暗黙的な型変換
1. 単一パラメータコンストラクタの暗黙的な型変換
以下のコードを見てください
#include<iostream>
using namespace std;
class A
{
public:
A(int x)
{
_a = x;
}
private:
int _a;
};
int main()
{
A a = 3;
return 0;
}
ここにこのコード
A a = 3;
この場合、コンパイルは完全に正しく行われ、オブジェクトのメンバー変数 _a は 3 に初期化されます。何故ですか?
原則: 上記のステートメントを実行すると、コンパイラは等号の右側の型を自動的にチェックします。型が一致しない (int) ため、3 は暗黙の型変換が行われます。このとき、右側は等号の は A(3) と同等であり、一時オブジェクトを生成し、このオブジェクトを使用して a をコピーして構築します。
もちろん、これは原則であり、コンパイラは最適化します。オブジェクトを直接構築するには 3 を使用します。
2. マルチパラメータコンストラクターの暗黙的な型変換
次のコードを見てください
#include<iostream>
using namespace std;
class A
{
public:
A(int x,int y)
{
_a = x;
_b = y;
}
private:
int _a;
int _b;
};
int main()
{
A a = { 3,4 };
return 0;
}
ここにこのコード
A a = { 3,4 };
a オブジェクトのメンバー変数 _a と _b は 3 と 4 に初期化されます。3、4 を使用してオブジェクトを直接構築します。
複数のパラメータは { } で囲む必要があります。
匿名オブジェクト
クラス内のメンバメソッドを一度だけ呼び出したい場合は、特別にオブジェクトを作成する必要があり、そのオブジェクトでメンバメソッドを使用するのは非常に面倒です。
#include<iostream>
using namespace std;
class A
{
public:
void print()
{
cout << "hello cpp" << endl;
}
private:
int _a;
};
int main()
{
A a;//专门创建一个对象
a.print();
return 0;
}
このとき、匿名のオブジェクトがデビューします。名前が示すように、匿名オブジェクトは名前のないオブジェクトです。
#include<iostream>
using namespace std;
class A
{
public:
void print()
{
cout << "hello cpp" << endl;
}
private:
int _a;
};
int main()
{
A().print();//A()是匿名对象
return 0;
}
匿名オブジェクトの特徴: 定数、ライフサイクルに 1 行のみ、行の最後でデストラクターが自動的に呼び出されます。
例えば:
A() 匿名オブジェクトは定数であり、等号の左側はアクセス許可の増幅を伴うタイプ A の参照であるため、このようなコードはエラーを報告します。
上の図は権限を翻訳したものです。
内部クラス
概念:クラスが別のクラス内で定義されている場合、その内部クラスは内部クラスと呼ばれます。内部クラスは独立したクラスであり、外部クラスに属しておらず、ましてや外部クラスのオブジェクトを通じて内部クラスのメンバーにアクセスすることはできません。外部クラスには、内部クラスへの特権アクセスがありません。
特徴:内部クラスは外部クラスのフレンド クラスです。フレンド クラスの定義を参照してください。内部クラスは、外部クラスのオブジェクトを通じて外部クラスのすべてのメンバーにアクセスできます。ただし、外部クラスは内部クラスのフレンドではありません (外部クラスは、内部クラスのメンバーにアクセスするための内部クラス オブジェクトを定義できません)。
#include<iostream>
using namespace std;
class A
{
public:
class B
{
public:
void funcb()
{
A a;//内部类创建对象访问外部类可无视权限(天生是外部类的友元类)
a._a=2;
}
private:
int _b;
};
private:
int _a;
};
int main()
{
A:: B b;//内部类对象的创建
b.funcb();
return 0;
}
今日の共有は以上です。皆さんの役に立ったら、忘れずにブックマークしてください。プログラマの皆様には、次の 3 回をサポートしていただき、引き続き知識を共有していただければ幸いです。読んでくれてありがとう!