記事のディレクトリ
第VI章機能
返却値
そして、この関数は配列にすることはできません
自動オブジェクト
{}は、オブジェクトのライフサイクル中に存在します
ローカル静的オブジェクト
、一度だけ行っ有効でした。
ビルトイン0に初期化されているローカル静的変数のタイプ。
fun(){
static int i=0;
}
関数の宣言
void fun(int,int);
ソースファイルで定義されたヘッダファイル、関数や変数に関数や変数を宣言します。
[!]ソースファイルは、ヘッダファイルをインクルードするには
ポインタパラメータ
fun(int *p){}//传递的是指向的对象的地址,不是指针的地址
[!]建议用int &来代替指针,避免拷贝,只读用const int &
参照パラメータ
追加情報を返すことができます
constのパラメータ
参加者は、非const型のトップのconstを無視します
void fun(const int i);//只读,可以接受常量和非常量
エラーの書き込み
void fun(const int i);//只读
void fun(int i);//只读
パラメータ割り当てへ
初期化変数のアナロジー
const int &a=42;//字面值可以给const int &
int &a=42;//error字面值不可以给int &
int &i=a;//error,const int &不可以给int &,但是可以给int
一定の基準パラメータ
同じパラメーターが、const参照を可能として宣言されたときに共通の基準パラメータは、以下のタイプを受信することができないので、{constオブジェクトリテラルオブジェクトタイプは、変換が必要}
//如果内层确实无法使用常量引用就创建i的副本i2。
fun1(const int &i){
int i2=i;
fun2(i2){
//fun2 的形参是int&
}
}
配列パラメータ
ポインタとして関数に渡さ
文の形式
fun(int*);
fun(int[]);
fun(int[10]);
配列のサイズ
//传递头尾指针
fun(int*beg,int*en);
//使用标准库
int arr[2]={1,2};
fun(begin(arr),end(arr));
//////////////////////////////////
//字符串,'\0'结束
fun2(char*cp){
if(cp)
while(*cp){*cp++;}
}
//////////////////////////////////
//传递length
配列の参照パラメータ
f(int (&arr)[10]){...}
f(int &arr[10]){...};//error,数组里面有10个引用
ポインタの多次元配列
//二维[10][10]
void print(int (*p)[10],int row){...}
//等价定义
void print(int p[][10],int row){...}
可変パラメータ
initializer_listライブラリタイプ:同じ引数の型を送信
引数の異なる種類:可変長引数テンプレート
C関数との相互作用のための:アポストロフィ
initializer_list<T> lst;//元素是常量
initializer_list<T> lst{a,b,c};
lst2(lst);
lst2=lst;
lst.size();
lst.begin();//auto beg=lst.begin()..遍历
lst.end();
{}引数の配列を渡します
+可変パラメータ一般的なパラメータ
//声明
void fun(ErrCode e,initializer_list<string> lst);
//传递实参
fun(ErrCode(0),{"dwa","dwa"})
楕円パラメータ
C ++とCコードの収束
コードは、標準ライブラリ関数cは可変引数を使用しています
...唯一の決勝で表示されます
void foo(para_list,...);
void foo(...);
リターン
空隙
return;
//可以返回另一个void fun2()
return fun2();
参照を返すことができ、コピーしないでください
(リテラルを含む)ローカル変数を返し、ポインタはしません。関数の両端は、彼らが存在しません。
楽しいことするオブジェクトを返します()。メンバー
楽しいことにするリターンポインタ() - > MEM
参照を返し、それが値を残すことができ
{,,}リストが空であってもよい返します
ポインタの配列を返します。
方法の一つ:エイリアス
//arr是含有10个整数的数组
typedef int arr[10];
//等价写法
using arr =int[10];
//函数声明
arr*fun(int i);//返回值:arr的指针
方法2:声明
int arr[10];
int *p[10];//p是数组,里面元素是指针
int(*p2)[10]=&arr;//指向含有10个整数的数组
int (*fun(int i))[10];//返回值类型,数组int[10]的指针
/*
解读:*fun(int i)函数结果解引用,(*fun(int i))[10]是个数组,int (*fun(int i))[10]数组里面是int
*/
方法3:
auto fun(int i)->int(*)[10]
方法4:
int arr[10];
decltype(arr) * arrfun(int i){return &arr;}
オーバーロード
引数のための手順は、機能は同じを呼び出します。異なるパラメータリスト。
パラメータは、ポインタまたは参照であります
定数パラメータは、オブジェクトに分割し、constのオブジェクトされ
これは、基本となるのconstです
fun(const int&);//接收常量和非常量,非常量可以转化成常量,反之不行
fun(int &);//非常量优先选择这个
fun(const int*);//接收常量和非常量,非常量可以转化成常量,反之不行
fun(int *);//非常量优先选择这个
const_castをとオーバーロード
const_castキャストが使用されている
今、constの戻り値が関数で使用し、戻り値は、非const関数構築物であります
const int &fun(const int &i){return i;}
int &fun(int &i){
auto &r=fun(const_cast<const int&>(i));//向const转型
return const_cast<int&>(i);}//再转回int
オーバーロードとスコープ
(同じ名前の変数と関数を含む)ステートメント名は、内層エンティティは、同じ名前のエンティティを上書きします
デフォルト引数
デフォルトのパラメータ値を考えると、それ以降はデフォルト値を持っています
関数の引数のデフォルト値を呼び出します
デフォルトのパラメータは、固体の尾を省略することができます
デフォルト引数の宣言
これは、複数回宣言したが、二回、引数のデフォルト値が同じになるようにして、宣言することができます。
そして、パラメータのデフォルト値が与えられ、それ以降はデフォルト値を持っています。宣言されたデフォルト値は、intなどの数値のみのタイプを書き込むことができ、書き込むことはできません
最初の引数のデフォルト値
デフォルト引数として使用することはできませんローカル変数
、関数の戻り値は、デフォルト引数を行うことができます
int i=1;
int j=2;
int getnum();
void fun(int =getnum(),int=i,int=j);
fun2(){
i=2;//修改了默认实参i
int j=3;//覆盖外部j,但是局部变量不能作为默认实参
//默认实参j还是2
}
インライン関数のパフォーマンスを向上させます_
シンプルで、頻繁に呼び出し、直接流れ関数は、関数の戻り値に加え、インラインの前身頃を置き換える、関数呼び出しが時間をコンパイルすることができ、代わりに、関数を呼び出しました
constexprの機能_パフォーマンスを向上させます
メンバ関数の呼び出し機能が置き換え
暗黙のインライン関数である
関数パラメータの値は、リテラル型となる戻り、
戻り値は、一定量が非常にすることができることができます
constexpr int fun1(){return 33;}
constexpr int a=fun1();
ヘッダファイルに定義されconstexprのインライン関数と機能
関数ポインタ
関数名を置き換えるためのポインタ
int fun(int i);
//函数指针
int (*p)(int);
//两种定义方法
p=fun;
p=&fun;
//调用的两种方法
p(1);
(*p)(1);
//函数形参是函数指针的两种声明方法
fun2(int (*p)(int));//可以接收fun函数的指针
fun2(int p(int));
//调用fun2
fun2(fun);//函数名fun自动转换为指针
エイリアスを使用してパラメータ
/* 别名_函数类型 */
//取函数fun的类型
typedef int Nname(int i);//Nname是fun的函数类型
//取函数fun的类型的等价形式
typedef decltype(fun) Nname2;//Nname2是fun的函数类型
/* 别名_函数指针 */
typedef int (*pname)(int i);//pname是fun的函数指针
//取函数fun的指针的等价形式
typedef decltype(fun) *pname2;//pname2是fun的函数指针
/* 别名_使用 */
//两种方法,fun4的声明
fun4(Nname);//函数类型自动转换为函数指针
fun4(*pname);
エイリアスを使用して、戻り値
/*返回值是函数指针*/
//类型别名
using F=int(int);//fun函数类型
using PF=int(*)(int);//fun函数指针
//返回值是函数指针的函数声明的两种方式
PF func(int);
F *func2(int);//不会函数类型自动转换为函数指针
//所以要加上*
エイリアスは直接戻り値を宣言しません
この方法の一つ
int fun(int i);
//返回值为指向fun类型函数的指针
int (*func3(int))(int);
//func3(int)是函数声明,
//*返回指针,(*func3(int))(int)最后一个(int)是指针指向函数的形参列表
//第一个int是指针指向函数的返回值类型
方法2:テールセットの戻り値が宣言しました
int fun(int i);
auto fun3(int)->int(*)(int);//返回值为指向fun类型函数的指针
方法3:decltype
decltype(fun) *fun5(int);//返回值为指向fun类型函数的指针
//注意:decltype返回函数类型,不返回指针