5.1機能を理解します
- 定義で指定された実際の参加機能パラメータ間の関数呼び出し関係
関数ポインタに渡される引数5.2.2
#include <iostream>
using std::cout;
using std::endl;
int incr10(int* num);
int main()
{
int num(3);
int* pnum(&num);
cout<< endl << "Adress passed = " << pnum ;
int result = incr10(pnum); //指针作为实参传递
cout<< endl << "num = "<< num << endl;
return 0;
}
int incr10(int* num)
{
cout << endl << "Adress received = " << num;
*num += 10;
return *num;
}
関数に渡さ5.2.4参照引数
#include <iostream>
using std::cout;
using std::endl;
int incr10(int& num);// lvalue 表示一个内存位置
int main()
{
int num(3);
int value(6);
int result = incr10(num);
cout << endl <<"incr10(num)= "<< result
<< endl << "num = " << num;
result = incr10(value);
cout << endl <<"incr10(value)= "<< result
<< endl << "value = " << value;
return 0;
}
int incr10(int& num)
{
cout << endl << "Value received = " << num;
num += 10;
return num;
}
// 实参的值并没有传递给函数。函数的形参初始化为实参的地址,因此
// 函数中只要使用形参num,就将直接访问调用函数中的实参。
あなたはどのような方法で、このパラメータを変更する必要はありませコンパイラに伝えるためのconstを使用して形状関数のパラメータを与えることができます。
int incr10(const int &num);
引数5.2.7 main()関数
int main(int argc,char* argv[ ]
{// code for main ...}
// 第1个参数:包括程序名在内的命令行上出现的字符串的数量计数;
// 第2个参数:是个数组,包含指向这些字符串的指针,还有一位空值的附加元素
関数の引数の可変数を受け入れるように5.2.8
- 任意の数の引数を受け入れる関数として定義することができます。省略記号(...)で、最後に関数定義のパラメータリストを作成し、呼び出されたとき、可変個の引数を表現するために設けられてもよいです。
int sumValues(int first,...)
{// code for the function...}
// 函数定义中至少有一个普通形参;
// ... 必须放在形参裂变的最后
#include <iostream>
#include <cstdarg> //va_list类型在此头文件中定义
using std::cout;
using std::endl;
int sum(int count,...)
{
if(count <= 0)
return 0;
va_list arg_ptr; //声明一个va_list类型的指针,用来依次指向各个实参
va_start(arg_ptr,count); //va_start宏用来初始化arg_ptr,使其指向列表中的第一个实参
int sum(0);
// for循环用来检索列表中各个实参的值
for(int i = 0;i < count ; i++)
sum += va_arg(arg_ptr,int);
// va_arg宏返回arg_ptr 指向的位置存储的实参值,并使arg_ptr递增,指向下一个实参值。
// 第2个参数:是第1个实参的类型,决定着得到的值和arg_ptr递增方式。
va_end(arg_ptr);
// va_end宏将传递给它的实参(va_list类型的指针)重置成空值
return sum;
}
int main(int argc,char*argv[])
{
cout << sum(6,2,4,6,8,10,12) << endl;
cout << sum(9,11,22,33,44,55,66,77,66,99) <<endl;
return 0;
}
5.3値が関数から返さ
5.3.1リターンポインタ
- アドレスルールを返します:関数からのアドレスのローカル自動変数を返すことはありません。
関数は、関数が終了したときに破壊され、実行を開始するときにローカル変数の関数が作成されますので。このように、ポインタメモリは、もはや変数の元の値が含まれていません。
#include <iostream>
using std::cout;
using std::endl;
double* treble(double data);
int main(void)
{
double num(5.0);
double* ptr(nullptr);
ptr = treble(num);
cout<< endl << "Three times num = " << 3.0*num;
cout << endl << "Result = "<< *ptr;
delete ptr; //不再使用treble()函数返回的指针时,立即释放内存
ptr = 0;
cout << endl;
return 0;
}
double* treble(double data)
{
double* result(new double(0.0));
//使用new 在空闲存储器中创建一个变量,该变量一直存在,直到最终被delete销毁,或程序结束
*result = 3.0*data;
return result;
}
5.3.2参照を返します
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::setw;
double & lowest(double values[],int length);
//返回值double&类型 即 double的引用类型
//第1个参数:double类型的一维数组;第2个参数:int类型的形参用来指定数组的长度
int main()
{
double array[] ={3.0,10.0,1.5,15.0,2.7,23.0,
4.5,12.0,6.8,13.5,2.1,14.0};
int len(sizeof array/sizeof array[0]); //初始化成该数组的长度
cout<<endl;
for(int i = 0; i < len; i++)
cout<< setw(6) << array[i];
lowest(array,len) = 6.9; //在赋值语句的左边使用函数
lowest(array,len) = 7.9;
cout<<endl;
for(int i = 0; i < len; i++)
cout<< setw(6) << array[i];
cout<< endl;
return 0;
}
double & lowest(double a[],int len)
{
int j(0);
for(int i=1; i<len; i++)
if(a[j]>a[i])
j=i; //j包含对应于具有最小值的那个数组元素的索引值
return a[j]; //返回数组元素a[j]的引用,a[j]的地址用来初始化将被返回的引用
}
5.3.3静的変数機能
-
静的なint型のカウント数(0);
関数内で静的変数を初期化した場合にのみ機能への最初の呼び出しを発生します。
5.4再帰関数呼び出し
- 関数が自身の呼び出しが含まれている場合、再帰関数と呼ばれます。
#include <iostream>
using std::cout;
using std::endl;
double power(double x,int n);
int main(void)
{
double x(2.0);
double result(0.0);
for(int index = -3; index<=3 ; index++)
cout<< x << "to the power "<<index << " is "<<power(x,index) <<endl;
return 0;
}
double power(double x,int n) //x的整数和负数次幂
{
if(n<0)
{
x = 1.0/x;
n = -n;
}
if(n>0)
return x*power(x,n-1); //判断是否再次调用自身
else
return 1.0;
}
5.5 C ++ / CLIプログラミング
- CLRプログラム機能パラメータと戻り値は、ハンドル、トレースリファレンス、内部クロスポインタを追跡し、値のクラスタイプであってもよいです。
- パラメータが配列である場合、それはC ++ / CLIは、アレイサイズLengthプロパティに格納されているので、アレイのサイズを指定する別の別個のパラメータを必要としません。
- C ++ / CLIプログラムでは、アレイは、ネイティブC ++でアドレス演算パラメータを行うことができないように、配列のインデックスを使用しなければなりません。
- ヒープに割り当てられたメモリへのハンドルを返し、ガベージコレクタが使用されなくなったもののメモリを解放する責任があるので、CLRには問題ありません。
- 引数のC ++ / CLI可変数の異なるメカニズムは、メカニズムとネイティブC ++プログラムを受けました。
- C ++ / CLIプログラムでは、main()関数は、別のコマンドライン引数機構とローカルC ++をアクセスします。
5.5.1関数の引数の可変数を受け入れます
- C ++ / CLI言語は、それによって可変数の引数を与える配列、配列省略上記の説明のようなパラメータリストを可能にします。
SUMのINT(...アレイ<整数> ^引数)
{
// SUMためのコード
}
SUM()関数は、int型の任意の数の引数を受け付けます。
#include "stdafx.h"
using namespace System;
double sum(... array<double>^ args)
{
double sum(0.0);
for each(double arg in args)
sum += arg;
return sum;
}
int main(array<System::String ^> ^args)
{
Console::WriteLine(sum(2.0,4.0,6.0,8.0,10.0,12.0));
Console::WriteLine(sum(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9));
Console::ReadLine();
return 0;
}
//输出
42
49.5
引数5.5.2 main()関数
- main()関数は^アレイString型の要素であるC ++ / CLIプログラムにおける唯一のパラメータです。したがって、順番にアクセスし、処理C ++ / CLIプログラム・ライン引数は、アレイのアクセス要素のみを簡略化します。
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"There were {0} command line arguments.",args->Length);
Console::WriteLine(L"Command line arguments received are: ");
int i(1);
for each(String^ str in args)
Console::WriteLine(L"Argument {0}: {1}",i++,str);
Console::ReadLine();
return 0;
}
5.8この章の内容
つづく…