编程中定义函数,一般三种传递方法,看是简单。想灵活合理选择,还须要大量的编程经验和技巧。 故在这里特意总结一下这三种传递的方法。
根本差别: 函数值传递不改变变量值,假设想改变变量值,须要返回值,然后用变量接收一下这个返回值。 而指针传递和引用传递都能够在函数内改变变量值。不须要通过返回值的形式改变。
浪费大量内存。
所以引用传递更好一些。
引用传递的性质象指针传递,书写形式象值传递,
理由:假设仅仅须要借用一下别名,就不是必需用指针,.
void changeVar(int &myVar,int newValue); // 引用传递
这个函数第一个输入的參数不是一个指针,它是那个将被传递给这个函数的原始变量的一个别名。
在changeVar()函数里对这个參数变量进行的不论什么操作都将反映在changeVar()函数外的那个原始变量身上。这意味着changeVar()函数与原来的一样。
void changeVar(int myVar,int newValue){ //值传递。没有返回值,起不到改变变量的作用
myVar=newValue;
}
这使得这个函数更easy被调用----仅仅须要提供一个变量名;
int main(){
int myNum=20;
changeVar(myNum,90); // 引用和值传递写法一样, 可见引用传递简单,这也是c++新添加的功能,表现了c++的强大
}
这比值传參语法上更简单了。
以“引用传递”方式把參数值传递给一个函数是C++的新增功能,这能够让函数的调用语法更加简单清晰。
提示:1.在定义函数时。还能够让它以“引用传递”方式而不是以“值传递”方式返回: int &myFuntion();
2.除了能够改变有关变量的值,“引用传递”方式的还有一个优点是它的开销相对要小一些:由于不须要在函数里创建暂时变量来容纳那些值。程序的内存占用量当然会小一些。
3.假设想获得“引用传递”方式带来的性能改善,但不想改变某个变量的值,能够把对应的输入參数定义为一个常量:
void myFunc(const int &myNum);
通过这样定义的函数,能够把详细的參数直接传递给它:myFunc(7);
int script_orientation(VOID *dic, unsigned char *im, int w, int h,
RECT roi, int &script_id, // NOLINT
int &orient_id, // NOLINT
float &conf) { // NOLINT
函数调用
const char* model_file = "model.txt";
void* model = CNN_Init(model_file);
cv::Mat image = cv::imread(path, 0);
int script_id, orient_id;
script_orientation(model, image.data, image.cols, image.rows, roi,
script_id, orient_id, confidence);
这里须要script_id, orient_id 两个返回值, 所以这两个定义为应用较好。 调用时就不须要再去定义变量接收 这两个 script_id,
orient_id 两个返回值
以下写一个函数,从函数中把我须要的两个值传出来,因为传出来的值比較多,所以不考虑用return来返回。须要通过參数把改动后的值拉出来供我使用,非常当然的就想到了用指针,可是值就是传不出来。使我对原有的大脑中指针的思维产生混沌感。今天一上午才把函数传递又走了一遍。才明确当中道理(道行还是非常浅),如今整理例如以下:
- BOOL GetStartEndBoxes(BOOL bRow, const SwCrsrShell& rShell, SwTableBox *pStt, SwTableBox *pEnd)
- {
- SwSelBoxes aBoxes;
- ... ...
- pStt = aBoxes[0];
- pEnd = aBoxes[aBoxes.Count() - 1];
- return TRUE;
- }
- 调用:
-
。。。 。。
。 SwTableBox *pStt=0;
- SwTableBox *pEnd=0;
- if ( !GetStartEndBoxes(bRow, *this, pStt, pEnd) )
- return FALSE;
传递一个指针到调用函数,希望获得更新后的值(pStt, pEnd),为什么没有获得到呢?
概念
实例
- 值传递:样例略过。
- 指针传递:
- void swap(int *a,int *b)
- {
- int temp;
- temp=*a;
- *a=*b;
- *b=temp;
- cout<<"a=" <<a<<" ,"<<"b="<<b<<endl;
- cout<<"*a=" <<*a<<" ,"<<"*b="<<*b<<endl;
- cout<<"&a=" <<&a<<" ,"<<"&b="<<&b<<endl;
- }
- int main(){
- int x=1;
- int y=2;
- cout<<"x=" <<x<<" ,"<<"y="<<y<<endl;
- cout<<"&x=" <<&x<<" ,"<<"&y="<<&y<<endl;
- swap(&x,&y);
- }
- swap(&x,&y);
- int change(char* name){
- cout<<"*******CHANGE--BEFORE******"<<endl;
- cout<<"name=" <<name<<endl;
- cout<<"*name=" <<&name<<endl;
- name="alter";
- cout<<"*******CHANGE--AFTER********"<<endl;
- cout<<"name=" <<name<<endl;
- cout<<"*name=" <<&name<<endl;
- return 1;
- }
- int main()
- {
- char *str = "this is a test";
- cout<<"******MAIN--BEFORE*****"<<endl;
- cout<<"str=" <<str<<endl;
- cout<<"*str=" <<&str<<endl;
- change(str);
- cout<<"*****MAIN--AFTER*****"<<endl;
- cout<<"str=" <<str<<endl;
- cout<<"*str=" <<&str<<endl;
- return 1;
- }
- name="alter";
- void my_malloc(void** p, int size)
- {
- *p = malloc(sizeof(int)*size);
- }
- int main()
- {
- int *a;
- my_malloc(&a , 10);
- return 1;
- }
- void swapref(int &a,int &b)
- {
- cout << "******************before swapref:******************"<<endl;
- cout<<"a=" <<a<<" ,"<<"b="<<b<<endl;
- cout<<"&a=" <<&a<<" ,"<<"&b="<<&b<<endl;
- int temp;
- temp=a;
- a=b;
- b=temp;
- cout << "******************after swapref:******************"<<endl;
- cout<<"a=" <<a<<" ,"<<"b="<<b<<endl;
- cout<<"&a=" <<&a<<" ,"<<"&b="<<&b<<endl;
- }
- int main(){
- int x=1;
- int y=2;
- cout<<"******MAIN--BEFORE*****"<<endl;
- cout<<"x=" <<x<<" ,"<<"y="<<y<<endl;
- cout<<"&x=" <<&x<<" ,"<<"&y="<<&y<<endl;
- //swap(&x,&y);
- swapref(x, y);
- cout<<"*****MAIN--AFTER*****"<<endl;
- cout<<"x=" <<x<<" ,"<<"y="<<y<<endl;
- cout<<"&x=" <<&x<<" ,"<<"&y="<<&y<<endl;
- }
- swapref(x, y);