经典的。值得转载的。。C++的参数传递机制[转]

C++的参数传递机制

C++一共有三种传递方式:值传递(pass by value)、指针传递(pass by pointer)、引用传递(pass by reference)。
关键点:在函数中,编译器总是要为函数的每个参数制作临时副本。引用传递除外。(重要重要羡慕



一.值传递。

值传递很简单。唯一要注意的就是当值传递的输入参数用户自定义类型时,最好用引用传递代替,并加上const关键字。因为引用传递省去了临时对象的构造和析构(见关键点)。
数据类型为内部类型时,不必。

例如:
将void Func(A a) 改为void Func(const A &a);
而void Func(int a)就没必要改成void Func(const int &a)。

二.指针传递。
今天之所以会花时间参阅C++的参数传递机制,就是因为对指针传递这一部分的应用出了问题。

例如:
在下面的getMemory函数中获得动态内存分配的指针p,并未能将获得的内存返回。

void getMemory(char *p, int num)
{
    p = new char[num];
}
 
void Test(void)
{
    char *str = NULL;
    getMemory(str, 100);    // str 仍然为 NULL
    strcpy(str, "hello");        // 运行出错
    delete [] p;
}

出错的原因就是在于上面提到的关键点
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。
而在上例中, 副本_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫未变。所以函数getMemory并不能输出任何东西。并且,每执行一次getMemory就会泄露一块内存,因为没有用free释放内存。

解决方法有三种:

    甲)利用全局变量。
定义一个全局变量str,这样就不用把它作为参数来传递,也就不会有副本 _str。
char *str = NULL;
void getMemory(int num)
{
    str = new char[num];
}

    乙)用“指向指针的指针”。
void getMemory(char **p, int num)
{
    *p = new char[num];
}
void Test(void)
{
    char *str = NULL;
    getMemory(&str, 100);  // 注意参数是 &str,而不是str
    strcpy(str, "hello");
    cout<< str << endl;
    delete [] str;
}

    丙)返回指针变量
char *getMemory(int num)
{
    char *p = new char[num];
    return p;

void Test(void)
{
    char *str = NULL;
    str = getMemory(100);
    strcpy(str, "hello");
    cout<< str << endl;
    delete [] str;
}

三.引用传递。
C++区别于C的一个新增优势。虽然用&作为标识符,但是跟指针一点关系都没有
int &a=b表示,a和b是同一个变量。简单地说,相当于一个别名,如:Stephen Chow周星驰
当作为参数传递时,它省去了临时对象的构造和析构。

用法如下:
Func(int &a)
{
    a++;
}
void Test(void)
{
    int i;
    Func(i);
}

 

 

C/C++中的实参和形参

(2009-04-06 18:42:54)

    实参和形参,很抽象的一个概念,新手很难搞懂。其实各种书籍把他讲得很明白,但是就是看不懂。中国人就喜欢把简单的问题复杂化。我草,我也是深受其害。

 

先说C语言:

    只要知道了按值传递和按地址传递的区别,就会明白实参和形参的具体工作细节。

1)按值传递(不能改变实参)

    实参是变量,表达式等数值。

    函数调用的时候,实参和形参存在于内存中2快不同的区域,实参先自己复制一份拷贝,再把拷贝传给形参。由于是传递的是拷贝,所以实参不会受形参的影响,实参值不会被改变。

2)按地址传递(可以改变实参)

    实参是指针。

    函数调用的时候,指针传给你,形参和实参指针都一样,对形参的任何操作就等于对实参的操做。实参的值就可以被改变。

 

再说C++:

   C++有引用来代替指针这种落后的类型。

1)const引用传递(不能改变实参)

   和上面的C中按值传递的效果一样,但是效率高一些,因为引用是不用拷贝实参的,减少了复制的开销。const就决定了不能改变实参。

 

2)按引用传递(可以改变实参)

   引用其实大部分情况下和指针一样,对形参的任何操作就等于对实参的操做。实参的值就可以被改变。要不变,就学上面加个const。

 

    实际应用中,形参有3种用法:

1)f(int X)

这C语言的用法,实参是数值,就不变;实参是指针,就可以改变。

2)f(int& X)

C++的用法,实参可以改变。

3)f(const int& X)

C++的用法,实参不变。

 

什么时候用哪一种呢?就是取决于是否改变实参!!!

建议用C++的用法,虽然C++兼容C。

 

# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值