関数ポインタとオペレータ学習ノートの再ロード
2983 ワード
関数ポインタ
関数ポインタは実際にはメモリ内の関数のエントリアドレスを表し、関数ポインタを正しく定義するには、関数の戻り値タイプと関数のパラメータリストを同時に指定する必要があります.
定義関数ポインタの形式:ReturnType(*pfunc)(var-list);ReturnTypeとは、関数の戻り値タイプ、pfuncとは関数ポインタ、var-listとは関数のパラメータリストのことです.
関数ポインタを使用する例:
関数ポインタが別の関数のパラメータとして渡される場合、関数ポインタの宣言は明示的または暗黙的に行うことができます.
関数ポインタを明示的および暗黙的に呼び出す例:
関数リロードと関数オーバーライドの比較:
1.関数のリロードは同じ役割ドメインの2つの関数の間で発生し、2つの関数のオーバーライドはベースクラスのメンバー関数と派生クラスのメンバー関数の間で発生する.
2.重荷重の2つの関数を形成し、その関数名が同じでなければならないが、パラメータリストが一定に異なり、戻り値のタイプには要求しない.上書きされた2つの関数を形成するには、関数名、パラメータリスト、戻り値のタイプが同じであることが要求されます.
3.クラスの静的メンバー関数は、非静的メンバー関数とリロードすることができ、関数オーバーライドは、ベースクラスの非静的メンバー関数と派生クラスの非静的メンバー関数の間でのみ発生する可能性がある.
4.関数呼び出しが発生した場合、関数のエントリを再ロードした場合にコンパイル時に決定される(静的結合)、虚呼び出しが発生した場合(関数オーバーライドを使用)、関数のエントリアドレスは実行時に決定される(動的結合).
関数オーバーライドの例:
オペレータリロード
1.C++の事前定義されたオペレータセットの操作のみが再ロードされ、プログラマは自分で新しいオペレータを定義することはできません.
2.オペレータは本質的に1つの関数に等しいので、C++オペレータは「オペレータ関数」と理解します.オペレータ関数名はoperatorキーワードの後にオペレータから構成される.
3.オペレータが持つオペランドの個数は変更を許さず、オペレータ間の優先度は変更を許さない.
4.オペレータの再ロードには、次の2つの形式があります.
1つ目は、オペレータ関数を外部関数と見なし、すべての操作数をこの関数のパラメータとします.オペレータ関数はクラスオブジェクトのプライベートメンバーにアクセスする必要があることが多いため、この外部関数は一般的にパラメータタイプの友元関数として宣言されます.
2つ目は、オペレータ関数をクラスのメンバー関数として扱うことです.これは、オペレータの最初のオペランドがクラスのオブジェクトであることに違いありません.
5.基本データ型に対して他の操作を定義することは許されない.言い換えれば、操作数のうち少なくとも1人のユーザがカスタマイズしたクラスタイプまたは列挙タイプが必要である.
6.一部のオペレータでは、リロードが許可されていません.たとえば、.*、:、?:
7.オペレータ関数には2つの呼び出し方式がある:暗黙呼び出しと明示呼び出し、一般的に暗黙呼び出しオペレータ関数を採用する.
8.基本データ型とユーザーがカスタマイズしたタイプを含むタイプを特殊なオペレータ、すなわちタイプ変換オペレータとして使用することができる.あるクラスでこのタイプオペレータをリロードすると、タイプ変換の目的を達成できます.
9は、()オペレータに加えて、他のリロードオペレータにパラメータを提供するデフォルト値が不正です.
オペレータ関数の暗黙的な呼び出しと明示的な呼び出しの例:
タイプオペレータの使用:
関数ポインタは実際にはメモリ内の関数のエントリアドレスを表し、関数ポインタを正しく定義するには、関数の戻り値タイプと関数のパラメータリストを同時に指定する必要があります.
定義関数ポインタの形式:ReturnType(*pfunc)(var-list);ReturnTypeとは、関数の戻り値タイプ、pfuncとは関数ポインタ、var-listとは関数のパラメータリストのことです.
関数ポインタを使用する例:
#include
using namespace std;
class DoubleValue
{
public:
double GetValue()
{
return 6.7;
}
static int ReInt() //ReInt
{
return 3.3;
}
};
//
typedef int (*p)();
//
double operator+(DoubleValue &d, p func)
{
return d.GetValue() + func();
}
int main()
{
DoubleValue obj;
p p1 = obj.ReInt;
cout<
関数ポインタが別の関数のパラメータとして渡される場合、関数ポインタの宣言は明示的または暗黙的に行うことができます.
関数ポインタを明示的および暗黙的に呼び出す例:
#include
using namespace std;
int fun()
{
cout<
関数リロードと関数オーバーライドの比較:
1.関数のリロードは同じ役割ドメインの2つの関数の間で発生し、2つの関数のオーバーライドはベースクラスのメンバー関数と派生クラスのメンバー関数の間で発生する.
2.重荷重の2つの関数を形成し、その関数名が同じでなければならないが、パラメータリストが一定に異なり、戻り値のタイプには要求しない.上書きされた2つの関数を形成するには、関数名、パラメータリスト、戻り値のタイプが同じであることが要求されます.
3.クラスの静的メンバー関数は、非静的メンバー関数とリロードすることができ、関数オーバーライドは、ベースクラスの非静的メンバー関数と派生クラスの非静的メンバー関数の間でのみ発生する可能性がある.
4.関数呼び出しが発生した場合、関数のエントリを再ロードした場合にコンパイル時に決定される(静的結合)、虚呼び出しが発生した場合(関数オーバーライドを使用)、関数のエントリアドレスは実行時に決定される(動的結合).
関数オーバーライドの例:
#include
using namespace std;
class A
{
public:
void useFunc()
{
cout<
オペレータリロード
1.C++の事前定義されたオペレータセットの操作のみが再ロードされ、プログラマは自分で新しいオペレータを定義することはできません.
2.オペレータは本質的に1つの関数に等しいので、C++オペレータは「オペレータ関数」と理解します.オペレータ関数名はoperatorキーワードの後にオペレータから構成される.
3.オペレータが持つオペランドの個数は変更を許さず、オペレータ間の優先度は変更を許さない.
4.オペレータの再ロードには、次の2つの形式があります.
1つ目は、オペレータ関数を外部関数と見なし、すべての操作数をこの関数のパラメータとします.オペレータ関数はクラスオブジェクトのプライベートメンバーにアクセスする必要があることが多いため、この外部関数は一般的にパラメータタイプの友元関数として宣言されます.
2つ目は、オペレータ関数をクラスのメンバー関数として扱うことです.これは、オペレータの最初のオペランドがクラスのオブジェクトであることに違いありません.
5.基本データ型に対して他の操作を定義することは許されない.言い換えれば、操作数のうち少なくとも1人のユーザがカスタマイズしたクラスタイプまたは列挙タイプが必要である.
6.一部のオペレータでは、リロードが許可されていません.たとえば、.*、:、?:
7.オペレータ関数には2つの呼び出し方式がある:暗黙呼び出しと明示呼び出し、一般的に暗黙呼び出しオペレータ関数を採用する.
8.基本データ型とユーザーがカスタマイズしたタイプを含むタイプを特殊なオペレータ、すなわちタイプ変換オペレータとして使用することができる.あるクラスでこのタイプオペレータをリロードすると、タイプ変換の目的を達成できます.
9は、()オペレータに加えて、他のリロードオペレータにパラメータを提供するデフォルト値が不正です.
オペレータ関数の暗黙的な呼び出しと明示的な呼び出しの例:
#include
using namespace std;
class Complex
{
double real;
double image;
public:
Complex(double r = 0.0, double i = 0.0)
{
real = r;
image = i;
}
void Show()
{
cout<
タイプオペレータの使用:
#include
using namespace std;
class A
{
int m;
public:
A(int i)
{
m = i;
}
void Show()
{
cout<