C++-Primer-Function
时间:2010-08-07 来源:Forge09151111
#include <iostream>
using namespace std; void reSet(int *ip) {//形参是整形指针
*ip = 0;
} void reSetcp(const int* ip) {//形参是整形指针指向const对象
//*ip = 4;
} void reSetpc(int *const ip) {//形参是const整形指针
*ip = 0;
} void reSetr(int &ip, int &iq) {//整形引用
int tmp = ip;
ip = iq;
iq = tmp;
} int main() {
int i = 42;
int j = 43;
int *p = &i;
const int* q = &j;
cout<<"i: "<<*p<<'\n';
reSet(p);
cout<<"i: "<<*p<<endl;
reSetpc(p);
cout<<"i: "<<*p<<endl;
reSetr(i, j);
cout<<i<<endl<<j<<endl;
return 0;
}
1.函数形参实际是实参的拷贝, 如果实参过大,可以使用指针或者引用形参,指针形参只是实参地址的拷贝,但是只能影响实参的赋值, 使用引用可以避免大型对象的复制。 2.如果不希望拷贝或者实参的更改, 可以使用const修饰形参。 3.函数不能直接传递数组,所以将形参写成数组的形式如 int[],int[10], 看做指向数组元素的指针。 4.函数传递数组时任何对于数组的长度都是假设的如 void paintValues(int ia[10]){} 应为编辑器只会检查数组形参关联实参的类型而不会检查长度。 5.但是如果数组形参定义为引用时, 将对实参类型和长度进行检查: #include <iostream>
using namespace std; void printValues(int (&arr)[10]) {//引用数组形参 长度为10
for(int i=0; i<10; i++) {
cout<<arr[i];
}
} int main() {
int k[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
printValues(k);
return 0;
} 0123456789 6.在函数中使用static局部变量可以在调用函数后不会被撤销 #include <iostream>
#include <conio.h>
using namespace std; int countCalls() {
static int size = 0;
return ++size;
} int main() {
for(int i=0; i<10; i++) {
cout<<countCalls();
}
getch();
return 0;
}
12345678910 7.函数重载时编辑器将对形参进行分析,类型和数量将是区分重载函数的特征 int lookup(const Account &acct) int lookup(const Account&) 以上2个函数的声明实际是重复声明,应为形参不会被检查命名如同 int lookup(const Phone&) int lookup(const Telno&) 函数重载时,必须考虑作用域,如 void paint(const string &); void fooBar(int ival) { void paint(int); } 在编辑器检查时 一旦检查到fooBar中的paint函数将屏蔽其他paint函数。 其次,在重载时, 编辑器将参考类型装换的'优劣规则'如 void ff(int); void ff(short); ff('a'); char类型(8)可以提升为int型(16)但是相比提升为short型(8)为'优'所以将调用ff(int)。
using namespace std; void reSet(int *ip) {//形参是整形指针
*ip = 0;
} void reSetcp(const int* ip) {//形参是整形指针指向const对象
//*ip = 4;
} void reSetpc(int *const ip) {//形参是const整形指针
*ip = 0;
} void reSetr(int &ip, int &iq) {//整形引用
int tmp = ip;
ip = iq;
iq = tmp;
} int main() {
int i = 42;
int j = 43;
int *p = &i;
const int* q = &j;
cout<<"i: "<<*p<<'\n';
reSet(p);
cout<<"i: "<<*p<<endl;
reSetpc(p);
cout<<"i: "<<*p<<endl;
reSetr(i, j);
cout<<i<<endl<<j<<endl;
return 0;
}
1.函数形参实际是实参的拷贝, 如果实参过大,可以使用指针或者引用形参,指针形参只是实参地址的拷贝,但是只能影响实参的赋值, 使用引用可以避免大型对象的复制。 2.如果不希望拷贝或者实参的更改, 可以使用const修饰形参。 3.函数不能直接传递数组,所以将形参写成数组的形式如 int[],int[10], 看做指向数组元素的指针。 4.函数传递数组时任何对于数组的长度都是假设的如 void paintValues(int ia[10]){} 应为编辑器只会检查数组形参关联实参的类型而不会检查长度。 5.但是如果数组形参定义为引用时, 将对实参类型和长度进行检查: #include <iostream>
using namespace std; void printValues(int (&arr)[10]) {//引用数组形参 长度为10
for(int i=0; i<10; i++) {
cout<<arr[i];
}
} int main() {
int k[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
printValues(k);
return 0;
} 0123456789 6.在函数中使用static局部变量可以在调用函数后不会被撤销 #include <iostream>
#include <conio.h>
using namespace std; int countCalls() {
static int size = 0;
return ++size;
} int main() {
for(int i=0; i<10; i++) {
cout<<countCalls();
}
getch();
return 0;
}
12345678910 7.函数重载时编辑器将对形参进行分析,类型和数量将是区分重载函数的特征 int lookup(const Account &acct) int lookup(const Account&) 以上2个函数的声明实际是重复声明,应为形参不会被检查命名如同 int lookup(const Phone&) int lookup(const Telno&) 函数重载时,必须考虑作用域,如 void paint(const string &); void fooBar(int ival) { void paint(int); } 在编辑器检查时 一旦检查到fooBar中的paint函数将屏蔽其他paint函数。 其次,在重载时, 编辑器将参考类型装换的'优劣规则'如 void ff(int); void ff(short); ff('a'); char类型(8)可以提升为int型(16)但是相比提升为short型(8)为'优'所以将调用ff(int)。
相关阅读 更多 +