第 6 章 C++: 関数の基本と応用
第 6 章 関数
関数は、関数を呼び出すことによって対応するコードを実行する、名前付きのコード ブロックです。
関数の基本
関数は call 演算子 (call 演算子) で実行します。その形式は一対の括弧です。
関数の呼び出しにより、次の 2 つのタスクが完了します。このとき、メイン呼び出し関数 (呼び出し関数) の実行は一時的に中断されます。および呼び出された関数 (呼び出された関数) の実行を開始します。
- #関数に対応する仮パラメータを実パラメータで初期化します。
- 呼び出された関数に制御を移します。
- return ステートメント:
- return ステートメントで値を返す
- 呼び出した関数から呼び出した関数に制御を戻す
- 名前にはスコープがあり、オブジェクトには
Lifecycle(ライフタイム)
自動オブジェクト(自動オブジェクト): このオブジェクトは、関数の制御パスが変数定義ステートメントを通過するときに作成されます。 . それが定義されているブロックの終わりに達したら、それを破棄します。
ローカル静的オブジェクト: プログラムの実行パスが初めてオブジェクト定義ステートメントを通過するときに初期化され、プログラムが終了するまで破棄されません。
- ローカル変数を
static として定義して取得します。例:
//統計関数 count_calls ( ) 呼び出された回数 <br>size_t count_calls () <br>{ <br>static size_t ctr = 0; //呼び出しが完了した後も、この値は有効です <br>return ctr; <br> } <br>int main () <br>{ <br>for (size_t i = 0; i != 10; i) <br>cout << cout_calls() << endl; <br>return 0; <br>} <br><br>
- 関数プロトタイプ##とも呼ばれます#(関数プロトタイプ)
-
関数の 3 つの要素 (
戻り値の型、関数名、仮パラメータの型 ) は、関数のインターフェイスと形式的なパラメータを記述します。関数宣言ではパラメータ名を省略できます。 関数はヘッダー ファイルで宣言し、ソース ファイルで定義する必要があります。
個別のコンパイル
パラメータの受け渡し
仮パラメータが参照型の場合、対応するパラメータにバインドされます。実パラメータ。それ以外の場合は、実パラメータの値をコピーして仮パラメータに割り当てます。
main 関数が実行可能ファイル prog にあると仮定すると、次のオプションをプログラムに渡すことができます:
prog -d -o ofile data0
これらのコマンド2 つの実行可能ファイルを渡す 選択した仮パラメータが main 関数に渡されます:
int main(int argc, char *argv[]) {...} //或: int main(int argc, char **argv) {...}
実パラメータが main 関数に渡されるとき、argv の最初の要素はプログラムの名前または空の文字列を指します。次の要素は実際のパラメータとして一度にコマンド ラインに渡されます。最後のポインターは要素値をドロップするだけであり、0 であることが保証されます。
- 上記のコマンド ラインを例に挙げます。argc = 5;argv[0] = "prog";argv[1] = "-d";argv[2] = "-o";argv[3] = "ofile";argv[4] = "data0";argv[5] = 0;
C 11 の新しい標準では、さまざまな関数を処理できる関数を作成するための 2 つの方法が提供されています。インスタンスの数 パラメータ関数:
すべての実パラメータは同じ型であり、initializer_list という名前の標準ライブラリ型を渡すことができます。実際のパラメータのタイプが異なる場合は、変数パラメータ テンプレートと呼ばれる特別な関数を作成できます。
- #C 特別なパラメータ タイプである省略記号もあります。これを使用して、可変数の実パラメータを渡すことができます。この関数は通常、C 関数と対話するインターフェイス プログラムにのみ使用されます。
- initializer_list 仮パラメータ
型はヘッダー ファイルで同じように定義されます。 name次の操作を提供します:
- initializer_list
lst; //デフォルトの初期化、T 型要素の空のリスト initializer_list
戻り値の型と戻り値のステートメント//lst は初期値と同じ数の要素を持ちます; lst の要素は対応する初期値のコピーです; リスト内の要素は const lst2(lst) <br/> lst2 = lst //initializer_list オブジェクトをコピーまたはコピーしても、リスト内の要素はコピーされません。コピー後、元のリストとコピーされた要素は共有されます<br/>lst.size() / /リスト内の要素の数<br/>lst.begin() //lstの最初の要素へのポインタを返します<br/>lst.end() //lstの最後の要素の次の位置へのポインタを返します<br/><br/><br/><br/><br/>
参照は左辺値を返し、他の戻り値の型は右辺値を取得します。
- リスト初期化戻り値 : 新しい C 11 標準では、関数が中括弧で囲まれた値のリストを返すことができると規定しています。
main 関数の戻り値 main
main 関数が戻り値を持たないことを許可します (そうでない場合、コンパイラーは暗黙的に return を挿入します) 0)
返回0表示执行成功,其他值依机器而定。
为了使返回值与机器无关,cstdlib头文件定义了两个预处理变量,分别表示成功和失败: <br/>return EXIT_FAILURE; <br/>return EXIT_SUCCESS; <br/>//因为它们是预处理变量,所以既不能在前面加上std::,也不能在using声明里出现。 <br/>
返回数组指针
使用类型别名
<br/>typedef int arrT[10]; //arrT是一个类型别名,它表示的类型是含有10个整数的数组 <br/>using arrT = int[10]; //与上一句等价 <br/>arrT* func(int i); //func返回一个指向含有10个整数的数组的指针 <br/>
声明一个返回数组指针的函数,形式如下
<br/>Type (*function(parameter_list)) [dimension] <br/>//Type表示返回的数组指针指向的数组元素类型 <br/>//dimension表示数组的大小 <br/>//例如: <br/>int (*func(int i)) [10]; <br/>
使用尾置返回类型(C++11)
<br/>auto func(int i) -> int(*)[10]; <br/>
使用decltype
<br/>int odd[] = {1,3,5,7,9}; <br/>int even[] = {0,2,4,6,8}; <br/>decltype(odd) *arrPtr(int i) <br/>{ <br/> return (i % 2) ? &odd : &even; //返回一个指向数组的指针 <br/>} <br/>
函数重载
如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载(overloaded)函数。
不允许两个函数除了返回类型外其他所有要素都相同。
重载与作用域:一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层作用域中的同名实体。
特殊用途语言特性
介绍三种函数相关的语言特性:默认实参、内联函数、constexpr函数。
默认实参
调用包含默认实参的函数时,可以包含该实参,也可以省略该实参。
一旦某个形参被赋予了默认值,它后面所有的形参都必须有默认值。
内联函数(inline)
调用函数一般比求等价表达式的值要慢,内联函数可避免函数调用的开销。
- 将函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开。
constexpr函数
函数的返回类型和所有的形参类型都得是字面值类型。
函数中必须有且只有一条return语句。
constexpr函数被隐式地指定为内联函数。
内联函数和constexpr函数通常定义在头文件中
调试帮助
程序可以包含一些用于调试的代码,但这些代码只在开发程序时使用。当应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两项预处理功能:assert和NDEBUG。
assert预处理宏
#include <cassert>assert(expr);//首先对expr求值,//如果表达式为假(即0),assert输出信息并终止程序的执行。//如果表达式为真(即非0),assert什么也不做。//例如:对一个文本进行操作的程序可能要求所给定单词的长度都大于某个阈值。assert(word.size() > threshold;
NDEBUG预处理变量
assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做。默认状态下没有定义NDEBUG,此时assert将运行执行时检查。
使用#define语句定义NDEBUG,从而关闭调试状态。
很多编译器都提供了命令行选项使我们可以定义预处理变量。
<br/>$ CC -D NDEBUG main.C #微软编译器中用 /D <br/>
这只是调试程序的辅助手段,不能代替真正的逻辑检查,也不能代替程序本应该包含的错误检查。
除了assert以外,也能使用NDEBUG编写自己的条件调试代码:
//如果定义了NDEBUG,#ifndef和#endif之间的代码将被忽略void print(const int ia[], aize_t size) { #ifndef NDEBUG //_ _func_ _是编译器定义的一个局部静态变量,用于存放函数的名字,它是const char的一个静态数组。 cerr << _ _func_ _ << "array size is " << size << endl; #endif}
除了_ _ func _ _之外,还有其它四个名字:
_ _FILE_ _ 存放文件名的字符串字面值 _ _LINE_ _ 存放当前行号的整型字面值 _ _TIME_ _ 存放文件编译时间的字符串字面值 _ _DATA_ _ 存放文件编译日期的字符串字面值
函数指针
bool lengthCompare(const string &, const string &);//pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型。注意圆括号必不可少bool (*pf) (const string &, const string &); //未初始化
当我们把函数名作为值使用时,该函数自动地转换成指针
pf = lengthCompare; //pf指向名为lengthCompare的函数pf = &lengthCompare; //等价赋值语句,&是可选的
调用该函数:
//此三个调用等价bool b1 = pf("hello", "goodbye");bool b2 = (*pf)("hello", "goodbye");bool b3 = lengthCompare("hello", "goodbye");
参考:C++Primer第五版
相关文章:
以上が第 6 章 C++: 関数の基本と応用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









C++ でストラテジ パターンを実装する手順は次のとおりです。ストラテジ インターフェイスを定義し、実行する必要があるメソッドを宣言します。特定の戦略クラスを作成し、それぞれインターフェイスを実装し、さまざまなアルゴリズムを提供します。コンテキスト クラスを使用して、具体的な戦略クラスへの参照を保持し、それを通じて操作を実行します。

Golang と C++ は、それぞれガベージ コレクションと手動メモリ管理のプログラミング言語であり、構文と型システムが異なります。 Golang は Goroutine を通じて同時プログラミングを実装し、C++ はスレッドを通じて同時プログラミングを実装します。 Golang のメモリ管理はシンプルで、C++ の方がパフォーマンスが優れています。実際の場合、Golang コードはより簡潔であり、C++ には明らかにパフォーマンス上の利点があります。

ネストされた例外処理は、ネストされた try-catch ブロックを通じて C++ に実装され、例外ハンドラー内で新しい例外を発生させることができます。ネストされた try-catch ステップは次のとおりです。 1. 外側の try-catch ブロックは、内側の例外ハンドラーによってスローされた例外を含むすべての例外を処理します。 2. 内部の try-catch ブロックは特定のタイプの例外を処理し、スコープ外の例外が発生した場合、制御は外部例外ハンドラーに渡されます。

STL コンテナを反復するには、コンテナの begin() 関数と end() 関数を使用してイテレータ範囲を取得できます。 ベクトル: for ループを使用してイテレータ範囲を反復します。リンク リスト: next() メンバー関数を使用して、リンク リストの要素を移動します。マッピング: キーと値のイテレータを取得し、for ループを使用してそれを走査します。

C++ テンプレートの継承により、テンプレート派生クラスが基本クラス テンプレートのコードと機能を再利用できるようになり、コア ロジックは同じだが特定の動作が異なるクラスを作成するのに適しています。テンプレート継承の構文は次のとおりです: templateclassDerived:publicBase{}。例: templateclassBase{};templateclassDerived:publicBase{};。実際のケース: 派生クラス Derived を作成し、基本クラス Base のカウント関数を継承し、現在のカウントを出力する printCount メソッドを追加しました。

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

C++ STL コンテナ内の要素にアクセスするにはどうすればよいですか?これを行うには、いくつかの方法があります。 コンテナを走査する: イテレータを使用する 範囲ベースの for ループを使用して、特定の要素にアクセスする: インデックスを使用する (添字演算子 []) キーを使用する (std::map または std::unowned_map)

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。
