C++ 技巧

10/ inline

11/dllexport--dllimport  / parama once #ifdef ...

1、lambda表达式: 格式:[函数对象参数] (操作符重载函数参数) mutable或exception声明  -> 返回值类型 {函数体}  五个部分

2、C++参数引用传递 & ,实参通常是通过值传递给函数的,这意味着形参接收的只是发送给他们的副本,他们存储在函数的本地内存中。形参进行的人和修改不会影响原始实参的值。然而有时候会希望让函数改变这个参数值,可以用引用的方式来传递。我们知道,变量是可以保存数据的内存位置的名称。当使用变量时,实际上是访问存储在分配给这个内存位置的数据。引用变量是变量的另一个别名,对引用变量做出的任何更改实际上是对它所引用的变量内存位置中存储的数据的更改。

当使用引用变量作为形参时,它将变为实参列表中相应变量的别名,对形参进行的任何更改都将真正更改正在调用它的函数中的变量。当以这种方式将数据传递给形参时,该实参被称为按引用传递。
引用变量的定义方法和常规变量类似,但是其数据类型和名称之间有一个 & 符号。例如,以下函数定义使形参 refVar 成为引用变量:

void doubleNum(int& refVar)

{

    refVar *= 2;

}       注意,变量 refVar 被称为“对 int 的引用”

具有引用形参的函数的原型也必须具有 & 符号。与函数头一样,它在数据类型和变量名之间。如果原型中省略了变量名,那么 & 符号将跟在数据类型后面。以下所有 doubleNum 函数的原型都是正确的:

void doubleNum(int &refVar);
void doubleNum(int& refVar);
void doubleNum(int &);
void doubleNum(int&);

注意,& 符号必须出现在使用引用变量作为形参的任何函数的原型和函数头中。它不会出现在函数调用中。

下面的程序演示了引用变量形参的应用:

调用:  doubleNum(value);

函数:

void doubleNum (int SrefVar){

     refVar *= 2;

}

 

3/ 

const引用传递的作用 : 
在c++中当函数参数为引用时,如果传递的实参与函数参数类型不匹配,那么就要将参数类型定义为const,此时函数将会产生一个临时变量,临时变量自动转化为函数参数类型。否者将报错。

如果传递的实参是一个临时变量,那么就要将函数参数定义为const类型。否则也会报错。

即使为了代码易读,可以保证绝对不会出现字面值,有时也不得不用const引用传递。如果你写了个函数为了保护参数加了const,但函数里面调用了另一个参数没const的函数,那么这里估计就要出错,因为const实参不能传递给非const形参。虽然你能保证自己的代码不冲突,但不能保证别人的代码,尤其是合作的时候每人写一个部分。

非要用引用传递吗?

引用传递一般用于修改传递的实参,那如果不需要修改时,一律用值传递是否可以?答案是有时还真不行。原因如下:

  • 引用传递可减少类的构造和析构次数,减少程序开销。
  • 引用传递可以避免类继承时的截断问题,确保多态性。
  • 小结

    不需要改动的参数,如果要通过引用传递,全都加上const最安全。

4、 参数传递 指针  和 指针的指针

    指针作为函数参数传递

函数参数传递的只能是数值,所以当指针作为函数参数传递时,传递的是指针的值,而不是地址。

 

#include "stdio.h"
void pointer(int *p)
{
  int a = 11;
  printf("\n\nEnter function");
  printf("\nthe p is point to  %p , addr is %X, *p is %d",p , &p, *p);
  *p =11;
  printf("\nthe p is point to  %p , addr is %X, *p is %d",p , &p, *p);
  p = &a;
  printf("\nthe p is point to  %p , addr is %X, *p is %d",p , &p, *p);

  printf("\nfunction return\n");
}

int main()
{
 int b =22;
 int *p = &b;

 printf("the b address %X\n",&b);
 printf("the p is point to %p , addr is %X, *p is %d",p , &p, *p);
 pointer(p);
 printf("\nthe p is  point to %p , addr is %X, *p is %d\n",p , &p, *p);
}
输出结果:

 

the b address 28FF3C
the p is point to 0028FF3C , addr is 28FF38, *p is 22

Enter function
the p is point to  0028FF3C , addr is 28FF20, *p is 22
the p is point to  0028FF3C , addr is 28FF20, *p is 11
the p is point to  0028FF0C , addr is 28FF20, *p is 11
function return

the p is  point to 0028FF3C , addr is 28FF38, *p is 11

 

  1. %p为指针所指向的数据的地址,这里既为变量b的地址。
  2. 在没有进入pointer函数之前,变量p存储的值为28FF3C,变量p的地址为28FF38,*p的值等于b的值等于22
  3. 进入pointer之后,p所指向的内存地址没有改变,但是p自身的地址变了。意味着函数传递只是将28FF3C传递进来了。虽然这个指针变量名字还是叫做p,但与main函数中的指针变量已经不一样了。这意味着,你可以改变main函数中b的值,但是不能改变p的值

函数参数为指针的指针

先看一个例子

 

#include "stdio.h"

void GetMemory(char *p,int num)
{
    p=(char*)malloc(sizeof(char)*num); 
}

void main()
{
    char *str=NULL;
    GetMemory(str,100); 
    strcpy(str,"hello");
    printf(str);
}

 

GetMemory这个函数是调用malloc申请一块内存。乍一看好像没什么问题,编译也不会报错。但是运行起来,程序直接奔溃。 其实有了上面的分析就可以知道,GetMemeory中的p是不能改变str的指向的,也就是说str还是指向NULL。GetMemory中的P是临时申请的一个指针变量,当str传值进来(NULL),时,p指向NULL,除此之外,没做任何改变。当运行malloc函数后,也只是将malloc返回的的指针地址赋给了p,并不能传递给str。所以这里就需要指针的指针了

 

#include "stdio.h"

void GetMemory(char **p,int num)
{
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值