第VI章のC ++プライマー第五版

第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返回函数类型,不返回指针
公開された19元の記事 ウォンの賞賛0 ビュー1250

おすすめ

転載: blog.csdn.net/qq_35459198/article/details/105342814