著者:Ma Zhifeng
リンク:https://zhuanlan.zhihu.com/p/23782715
出典:
著者がほぼ著作権を所有していることを知ってい ます。商用の再版については、著者に連絡して許可を得てください。非商用の再版については、出典を示してください。
リンク:https://zhuanlan.zhihu.com/p/23782715
出典:
著者がほぼ著作権を所有していることを知ってい ます。商用の再版については、著者に連絡して許可を得てください。非商用の再版については、出典を示してください。
ステートメント:
- 記事の内容は「C ++ Primer Chinese Edition(5th Edition)」から収集・編集されたものであり、著作権は原本に帰属します。
- オリジナルの本はより詳細で素晴らしい解釈を持っています、学習のために本物の本を購入してください。
- この記事は学習とコミュニケーションのみを目的としており、いかなる形式の転載も禁止されています
値を返す方法は、変数または仮パラメーターを初期化する方法とまったく同じです。
呼び出し初期化ポイントの一時的な量の戻り値、一時的な量は関数呼び出しの結果です
ローカルオブジェクトへの参照またはポインタを返さない
const string &manip()
{
string ret;
if( !ret.empty() )
{
return ret;
}
else
{
return "Empty";
}
}
上記の2つの返品は間違っています
- retはローカル変数であり、関数の実行後に破棄されるため、参照できません
- 「空」は、呼び出しサイトの一時的な量を初期化するために使用されます。一時的な量は関数呼び出しの結果です。同様に、一時的な量を参照することはできません。
メンバーへの直接アクセス
関数がポインタ、参照、またはクラスオブジェクトを返す場合は、関数呼び出しの結果を使用して、結果オブジェクトのメンバーにアクセスできます。
auto sz = shortString( s1, s2 ).size();
- 一方では、それは呼び出し元の演算子の優先順位と結合性に関連しています
- 一方で、一時的な金額と関係があるはずですが、メンバーが一時的な金額を訪問しているとのことですが、正しいですか?
参照は左辺値を返します
関数が参照型のオブジェクトを返す場合は、関数呼び出しの結果を直接割り当てることができます
getVal( s, 0 ) = 'A';
参照によってバインドされたオブジェクトに実際に値を割り当てます
リストの初期化
vector<string> process()
{
return {"Hi", "bye"};
}
Leetcode01をブラッシングしたときにこれを使用しました
mainの戻り値
main関数がreturnステートメントを記述しない場合、コンパイラーは自動的に0を返すreturnステートメント
を追加しますが、追加することをお勧めします。
再帰
自分自身を呼び出す関数
int fac( int val )
{
if( val > 1 )
{
return fac( val - 1 ) * val;
}
reutrn 1;
}
再帰呼び出しを含まないパスがあることを確認するには、ifが必要です。そうでない場合、無限ループで終了します。
配列ポインタを返す
配列はコピーできないため、関数は配列を返すことができません。ただし、配列へのポインタまたは参照を返すことはできます
配列へのポインタの以前の定義を思い出してください
int (*p2)[10] = &arr;
配列ポインタを返す関数の宣言も複雑です
Type (*function(parameter_list)[dimension]
ただし、形式は配列へのポインタの定義に似ています
int (*func(int i))[10];
この書き方は必然的に少し複雑で、間違えやすいです。簡単にする方法は3つあります。
- タイプエイリアス
- テールリターンタイプ
- decltype
タイプエイリアス
typedef int arrT[10];
arrT *func( int i );
テールリターンタイプ
C ++ 11の新しい標準
auto func( int i ) -> int(*)[10];
decltype
int odd[] = { 1, 3 };
int even[] = { 2, 4 };
decltype(odd) *arrPtr( int i )
{
i;
return &odd;
}
この方法の使用範囲が限られていることを確認するのは難しくありません