响应式网站首页,晚上国网app,免费网线,温州论坛大罗山参数传递#xff1a; 形参#xff08;parameter#xff09;和实参#xff08;argument#xff09;#xff1a; int num (int a, int b);
int num (int a, int b){return ab;
}//在函数的声明或者定义里#xff0c;由由0个或多个形参组成的列表。int main(){int n1,m1;co…参数传递 形参parameter和实参argument int num (int a, int b);
int num (int a, int b){return ab;
}//在函数的声明或者定义里由由0个或多个形参组成的列表。int main(){int n1,m1;coutnum(n,m);//我们用调用运算符来执行函数调用运算符形式是个圆括号圆括号内是由逗号隔开的实参列表。我们用实参初始化函数的形参。
}形参的类型决定了形参实参交互的方式如形参是引用类型他将绑定到对应的实参上引用形参是它对应实参的别名。否则将实参的值拷贝后赋给形参。 当形参是引用类型我们说它对应的实参被引用传递passed by reference或者函数被传引用调用called by reference。 当实参的值被拷贝给形参时我们说这样的实参被值传递passed by value或者函数被传值调用called by value。 传值参数 初始化一个非引用类型变量初始值被拷贝给变量对变量的改动不会影响初始值。 int n 0;
int i n;
i 1;
cout n;//输出0i的值改变n的值不变。指针形参指针的行为和其他非引用类型一样当执行指针拷贝操作拷贝的是指针的值。拷贝之后两个指针是不同的指针。因为通过指针我们可以间接访问它所指对象所以通过指针可以修改它所指对象的值。 void reset(int *ip){*ip 0;//只改变了指针所指对象的值。ip 0;//这里改变的只是ip的局部拷贝实参并未改变
}
int i 1;
reset(i);//改变i的值而非i的地址
cout i i endl;//输出i0。
——————————————————————————————————————
//实参类似于下面q
int i 1;
int *q i;
//形参类似于下面p
int n 0;
int *p n;
//实参调用形参类似与下面
p q;//p指向了i
*p 2;//通过p改变了i但是此时q并未改变。传引用参数 对于引用的操作实际上是作用在引用所引的对象上。通过引用形参允许函数改变一个或多个实参的值。 void reset (int i){//形参i仅仅是实参j的又一个名字在reset内部对i的使用即是对实参j的使用。i 0;//改变了i所引对象的值。
}
int j1;
reset(j);//j采用传引用方式因此他的值被改变。
coutjendl;//输出j0。传引用参数当形参是顶层const时传给他常量对象或者非常量对象都是可以的。 const int ci 1;
int i ci;//正确当拷贝ci时忽略了它的顶层const。
int *const p i;//const是顶层的不能给p赋值。
*p 0;//正确通过p改变对象内容是允许的。//在c中允许定义若干具有相同名字的函数不过前提是不同函数的形参列表应该具有明显区别。
void fcn(const int i){}//调用fcn函数时既可以传入const int也可以传入int。
void fcn(int i){}//此时再写一个函数定义会报错误因为重复定义了fcn(int)。传引用参数我们可以用非常量初始化一个底层const对象但无法用一个底层const对象初始化一个非常量。如果形参是一个非常量那么实参不能是一个底层const对象 int i 1;const int *cp i;//正确但是cp不能改变iconst int r i;//正确但是r不能改变iconst int r2 1;//正确int *p cp;//错误p类型和cp类型不匹配int r3 r;//错误r3类型和r类型不匹配int r4 1;//错误不能用字面值初始化一个非常量引用同样的初始化规则应用到参数传递上 void reset(int *ip){...}void reset(int i){...}string::size_type find_char(const string s,char c,string::size_type occurs){...}int i 0;const int ci i;string::size_type ctr 0;reset(i);//正确调用形参类型是int*的reset函数。reset(ci);//错误不能用指向const int对象的指针初始化int*。reset(i);//正确调用形参类型是int的reset函数。reset(ci);//错误不能把普通引用绑定到const对象ci上。reset(42);//错误不能把普通引用绑定到字面值上。reset(ctr);//错误类型不匹配find_char(hello world!,o,ctr);//正确find_char第一个形参是对常量的引用。 尽量使用常量引用 把函数不会改变的形参定义成普通的引用会给函数调用者一种误导即函数可以修改它实参的值。此外使用引用而非常量引用也会极大限制函数所能接受实参类型。不能把const对象、字面值、或者需要类型转换的对象传递给普通的引用形参。 string::size_type find_char(string s,char c,string::size_type occurs){...}
find_char(hello world!,o,ctr);//编译时发生错误因为不能把普通引用绑定到const对象上。应该把string s修改为const string sbool is_sentence(const string s){string ::size_type ctr 0;return find_char(s,.,ctr) s.size() - 1 ctr 1;//编译时发生错误因为s是常量引用但find_char被定义成只接受普通引用。修改的话需要改正find_char的形参应该把find_char形参的string s修改为const string s
}