const参照を使用してみてください
この関数は、共通の参照として定義されたパラメータを変更しないだけでなく、関数は、引数の値を変更し、また、あまり重大なエラーを引き起こす可能性があることを誤解を招く関数呼び出しをもたらす一般的な間違いであり、 。
int get_size(string& s)
{
return s.size();
}
このパラメータは、共通の関数参照したがって許容できない一定の基準であり、C ++であるため、一定のconst参照によって参照変数Sが違法であろう初期化しようとし、*タイプリテラル文字列のconst char型です。たとえば、次の呼び出しは違法。
get_size("abc"); // 非法
主処理コマンドラインオプション
代わりに、ユーザーの入力の、名前ARGV [0]プログラムを格納し、ARGV内の引数を使用している場合、我々はARGV [1]スタートからオプションの引数を覚えておく必要があります。
// 调用prog -d -o ofile data0
int main(int argc, char* argv)
{
// argc = 5;
// argv[0] == "prog";
// argv[1] == "-d";
// argv[2] == "-o";
// argv[3] == "ofile";
// argv[4] == "data0";
// argv[5] == 0;
}
左の値として、関数の戻り値の場合
関数が戻るとき、値型は、コールが値を残し、残りのケースは正しい値である場合に得られる、参照型です。
int& get_A_i(int* A, int index)
{
return A[index];
}
int main()
{
int A[10];
get_A_i(A, 1) = 1; // 等价于A[1] = 1;
}
彼は特定のライフサイクルを持っているので、修正静的ローカル変数を除き、ローカル変数の注意への参照を返す必要はありません。
int &get_i()
{
static int i = 243;
return i;
}
int main()
{
get_i() = 1; // 执行完毕后i=1;
}
関数へのポインタを宣言する配列を返します
int(*func(int i))[10];
内側から道の下で宣言の意味を理解することができます:
- int型を持つ代表的宣言funcが(int型I)パラメータの関数、関数funcの名前です。
- (*のFunc(INT I))、戻り値の代表は、ポインタ型です。
- (*のFunc(INT I))[10]長さ10の配列へのポインタを表します。
- INT(* FUNC(INT I))タイプ[10]配列内の要素がintで表します。
C ++では、我々はそう簡単に上記の文を理解すること、戻り値の型の11の反対側を使用することができます。
auto func(int i) -> int(*)[10];
上の戻り値の型は - >ポインタが後に、あなたは理解する声明を容易にすることができます。
オーバーロードとパラメータのconst
トップレベルCONSTが割り当て時には要求されないように、例えば、今度は、また利用可能である、int型のconst int型の割り当てを入力することが可能です。我々はトップのconstパラメータを持っており、パラメータのconst区別のトップ層のない1することはできませんので。
int func(int i);
int func(const int i);
int func2(int *p);
int func2(int *const p);
そして、ここでfunc2のFUNC 2つの宣言は等価です。しかし、根本的なconstが、それは、などの区別することができます。
int func(int &i1);
int func(const int &i2);
int func2(int *p1);
int func2(const int *p2);
このとき、I2、P2は、それが自由なタイプとして基本となるのconst、constのint型&i2のない初期型int&I1を切り替えていないので、i2の間、初期化され、I1、constのconstの下ですが、コンパイラの一致を選択する方法があります高機能化は、これはオーバーロード合法的な形です。
デフォルトパラメータについて
ローカル変数はほかに、デフォルト値として機能することはできません。式の型であれば、デフォルト引数式として機能することができる成形パラメータの所望のタイプに変換することができるように。例えば:
int wd = 80;
char def = ' ';
int func() { return 0; }
string screen(int a = wd, char b = def, int c = func())
{
return "";
}
int main()
{
screen(); //相当于screen(wd,def,func())
def = '*';
int wd = 70; // 隐藏外层wd
screen(); // 虽然wd被隐藏,但是局部变量wd与函数的默认参数没有任何关系,所以该语句等价于screen(80,'*',func());
}
デフォルトのパラメータ値はまだ80 WDであるので、ローカル変数WDの定義が外側を隠さWDが、ローカル変数や関数は、デフォルト引数をWDは何の関係もありませんが、特に注目すべきは、第2のスクリーン()の一例です。
デバッグヘルプ
その値はC ++コンパイラ定義__func__変数は、現在のデバッグ機能の名称です。また、プリプロセッサは、名前をデバッグするための4つの便利を定義します。
__FILE__
ファイル名の文字列リテラルを保管してください。__LINE__
現在のプラスチック製の収納リテラル行番号。__TIME__
保存ファイルは、時間の文字列リテラルをコンパイルします。__DATE__
保存するファイルは、日付文字列リテラルをコンパイル。
int main()
{
cerr << "Error: " << __FILE__
<< " : in function " << __func__
<< " at line " << __LINE__ << endl;
}
上記のコード出力:
Error: c:\users\Prosat\source\repos\solution\solution\main.cpp : in function main at line 217
これは、これらの変数は、我々は、コードが間違っを使用することをコンパイラヒントことがわかります。
関数ポインタ
定義、割り当てと使用
例を、私はこのような機能を持っています:
bool lengthCompare(const string &s1, const string &s2)
{
return s1.size() > s2.size();
}
戻り型と正確に一致するパラメータリストが(しないワーク相互に変換することができる)ことを保証する関数ポインタ対応する必要性を定義するために、オーバーロードされた機能のために、私はコールにどの機能を示さなければなりません。
// pf指向一个函数,返回值是bool,形参是const string &s1, const string &s2。
bool(*pf)(const string &s1, const string &s2); // 未初始化
// 赋值
pf = lengthCompare; // 合法,会自动将lengthCompare的地址赋值给pf。
pf = &lengthCompare; // 等价于上面的语句
// 调用
bool b1 = pf("hello", "goodbye");
bool b2 = (*pf)("hello", "goodbye"); // (*pf)括号不能少,否则含义不同。
関数へのポインタを返します。
int(*f3(int i))(int *a, int b);
同様に、我々は道の意味裏返しからの声明を使用することを理解してください。
- 代表F3は、(i int型)関数はint型のパラメータ、関数f3の名前で宣言されています。
- (*のFunc(INT I))、戻り値の代表は、ポインタ型です。
- INT(* FUNC(INT I))(INT *は、INT b)は(INT *、int型B)関数のパラメータへのポインタを表すint型の値を返します。
小指は、戻り値の型の宣言に対応しています。
auto f3(int i) -> int(*)(int *a, int b);
テール個人的な感情は本当にルックスは非常に明確で、戻り値の型は、より理解しやすいですし。