最近总是在封装函数的时候,纠结如何往封装函数内带入有用的值,又如何从封装函数带出来必要的内容,在此,关于做了一些基础知识的整合。
1.变量将值带入函数的形参
这种情况比较简单,就是将定义好的相应类型的值传递到自己封装的函数内就可以了,在此不必传入地址,或者应用之类的,直接传递真值即可,此处就不过多的进行归纳了。
2.用变量从函数形参带出必要的内容
这也是一些基础知识了,但是在平常过程中用的比较多,所以我就自己为了方便,来记录一下自己是如何应用的。以前,我以为只要定义一个对应类型的变量,将它放在形参列表中,然后等到函数运行结束,直接取值用就可以了,但是想法是美好的,结果并不令人满意,如代码:
//声明部分 void applications(unsigned *uiInput, unsigned int ulOutput); //应用部分 unsigned uiInit = 20; unsigned uiResult = 0; applications(&uiInit, uiResult); printf("%d\n", uiResult);
其实这里返回出来的uiResult并不是你想要的值,具体暂时就先不讨论了,而正确的应该是怎样的呢,如下代码:
//声明部分
void applications(unsigned *uiInput, unsigned int* ulOutput);
//应用部分 unsigned uiInit = 20; unsigned uiResult = 0; applications(&uiInit, &uiResult); printf("%d\n", uiResult);
这里利用指针来给形参传递一个地址,这样做有什么好处呢,如下归纳:
SetUsername(String* username)接受一个指向String类的指针,在C中按指针传递往往是为了节约程序对系统资源的开销,让程序跑的更快,如果使用SetUsername(String username),那么SetUsername在接受该参数时会复制传入如象String 的一份拷贝,而如果String是一个很大的结构的话,这个复制的过程将会大大增加程序对内存及其他资源的开销,在C++中更好的方法是按引用传递,这样又节约了一个指针的开销。
传递原则:
在C++中如果不对传入的对象做任何更改的话应该使用按const引用传递,如 void func(const int& a);
如果要做任何改动的话就使用按引用传递,如void func(int& a);
如果函数的返回值不能作为左值的话就应该返回一个const或者const 引用,如
const int& func(const int& a){return a;}
或者
const int func(const int& a){int temp = a;return temp++;}
这样就避免了func(a)=b的写法;
如果类的成员函数不对类的数据成员做任何更改的话就应该将函数声明为const函数如:
const int& func(const int&a)const;
归纳:在C++中,函数参数的传递首先考虑按引用传递,其次是在任何你可以使用指针的地方尽量避免使用并思考用其他的方法替换,Koenig & Moo 夫妇在为想成为更好的 C++ 程序员的人提出的3条建议中第1条就是"避免使用指针",你相信吗?指针正是 C 的核心呀。C 的宏、位运算、结构、联合、数组、强制类型转换、指针,在 C++ 程序中都应该尽量避免(在少量涉及底层的程序设计中例外),C++ 语法上强调的是类、对象、模板、标准库、引用、异常和 const 关键字,思想上强调的是面向对象和泛型。
3.用结构体从函数形参带出必要的内容
该种场景的是出现在,假如你从函数中要到处多于1个有用值的时候,假如你过多的使用形参列表,这样是你的代码看起来很臃肿,而且可读性也不是很好,这样就可以试试用结构体的形式来带出有必要的内容,代码如下:
//定义结构体部分 typedef struct { unsigned long ulOutputTemp1; unsigned long ulOutputTemp2; }StructTest; //定义功能函数 void func3(unsigned long* ulInputTemp, StructTest* sTest) { unsigned long ulValue1 = 10; unsigned long ulValue2 = 20; sTest->ulOutputTemp1 = *ulInputTemp+ulValue1; sTest->ulOutputTemp2 = ulValue2; } //应用部分 StructTest x_Test = {0, 0}; unsigned long ulInputValue = 3; func3(&ulInputValue, &x_Test);
printf("x_Test.ulOutputTemp1 = %d\n", x_Test.ulOutputTemp1);
printf("x_Test.ulOutputTemp2 = %d\n", x_Test.ulOutputTemp2);
最终的结果:
x_Test.ulOutputTemp1 = 13
x_Test.ulOutputTemp2 = 13
可以利用这个结构体,方便的带出你想要的东西,很方便,也很灵活