如何写一个获取值的函数

来源:互联网 发布:视频文件旋转角度软件 编辑:程序博客网 时间:2024/05/16 11:59

例子:

void Get1(int nNum){nNum = 4;}int _tmain(int argc, _TCHAR* argv[]){int nNum = 10;Get1(nNum);printf("nNum1=%d\n", nNum);system("pause");return 0;}

从函数里面修改传入的值,但是输出时函数值不变,为什么,这是因为参数传递时传入的并不是原值的地址,而是地址的拷贝

将代码改成下面这个样子:

void Get1(int nNum){printf("Get1:%p\n", &nNum);nNum = 4;}int _tmain(int argc, _TCHAR* argv[]){int nNum = 10;printf("nNum:%p\n", &nNum);Get1(nNum);printf("nNum1=%d\n", nNum);
system("pause");return 0;}

可以看出传进去的参数值的地址和原值的地址已经发生了变化,所以在里面改变值不会对外面造成任何影响


如果你想改变值,可以使用引用和指针:

void Get2(int &nNum){printf("Get2:%p\n", &nNum);nNum = 4;}void Get3(int *nNum){printf("Get2:%p\n", nNum);*nNum = 5;}

int _tmain(int argc, _TCHAR* argv[]){int nNum = 10;printf("nNum:%p\n", &nNum);Get1(nNum);printf("nNum1=%d\n", nNum);Get2(nNum);printf("nNum2=%d\n", nNum);Get3(&nNum);printf("nNum3=%d\n", nNum);system("pause");return 0;}


可以看出引用和指针情况下传入的地址与原值地址一样,所以在函数里改变值可以对原值造成影响


当然下面3种情况也是可以做到获取需要的值:

int Get4(){int i = 6;return i;}int& Get5(){int i = 6;return i;}int* Get6(){int i = 7;return &i;}

int _tmain(int argc, _TCHAR* argv[]){int nNum4 = Get4();printf("nNum4=%d\n", nNum4);int &nNum5 = Get5();printf("nNum5=%d\n", nNum5);int *pNum6 = Get6();printf("nNum6=%d\n", *pNum6);system("pause");return 0;}
这里可以看出返回值是什么类型调用时就用什么类型的接收

实际项目应用

假如有一个结构体:

typedef struct tagTtInfo{    BOOL bEnable;         int  nIP;          //IP         int nMask;        //子网掩码         int  nGateWay;   //网关public:     tagTtInfo()     {         memset( this ,0 ,sizeof( tagTtInfo) );     }}Tinfo;

写一个实现获取这个结构体值的方法:

方法1:使用void Get(Tinfo& tinfo),void Get(Tinfo* ptinfo)在内部赋值实现

方法2:Tinfo Get()实现(当然也可以用Tinfo &Get(),Tinfo *Get()),使用时这样调用Tinfo tinfo =  Get();

总结:

1、写获取值的Get函数时如果利用形参在内部赋值实现的则要传入引用或指针,或者利用返回值实现

2、返回值形式int Get4(),int& Get5(),int* Get6()的函数,调用时返回值是什么类型就用什么类型接收

3、返回值为指针类型的,使用时通常使用memcpy拷贝一份,再进行操作,而不是直接进行使用

如下:

Tinfo *pinfo = (Tinfo *)Get();

如果直接对pinfo操作,因为指针指向的是别人传过来的东西,可能存在被别人释放的情况,一旦被别人释放,那么pinfo为NULL,对其操作通常会

造成程序崩溃

正确处理如下:

Tinfo *pinfo = (Tinfo *)Get();ASSERT(pinfo);Tinfo info;memcpy(&info,pinfo,sizeof(Tinfo))

然后对info进行操作就没问题了


附:

常犯的错误案例:

void GetString(CString str){       str = _T("Hello world");    //还有使用format的}CString strtmp;GetString(strtmp);

0 0