参数传递模式

T为一个类名.

1.void f(T x)  按值传递

:调用函数时,产生一个x的副本,函数中修改x副本的值不会修改x的值;

优点:安全,可以防止参数X在函数中不小心被修改

缺点:1.调用f函数时,因为要产生一个副本,所有要调用T类的构造函数。

2.f函数结束时,又要调用T类的析构函数

若T类是一个大型类会非常耗时,降低效率。

3.若有时对象不允许被复制(有时复制对象操作仅限于特权用户或被禁止【此处可能是把复制对象的函数放在private中声明】)

2.void f(const T x) 按值传递

有上面一个的所有优缺点

特别之处:因为x被声明为const对象所以x的副本在f函数中不能被修改.

3.void f(T& x) 按引用传递

优点:可以直接对x进行写入和读取

缺点:若x在函数中被销毁,函数外有存有x地址的变量,在调用x时,会导致程序崩溃.

(在多线程环境中,这种方式是十分危险的)

4.void f(const T& x)  按引用传递

优点和3例一样。

特别之处:此方法x只能被读取,不能被修改.(在传递大型对象是,此传递方法强烈推荐)

5.void f(T* x) 按指针传递

在调用函数时,产生一个指向x的指针(4字节大小,几乎可以忽略不计).

优点:可以直接修改x.

缺点:若在函数中销毁x,会产生主函数的指针悬挂.

特别注意:若函数中的x改变所指对象,不会改变函数外x所指的内容.

指针有空指针(即NULL或0)

所以最好 void f(T* x=0)

提醒即使把空指针传递给函数也不会有问题

6.void f(const T* x) 按指针传递

优点只能对x进行读取.

7.void f(T* const x)

可以对x进行读取和写入,但是不能移动指针。

8.void f(const T*const x)

时间: 2024-08-14 00:20:57

参数传递模式的相关文章

main函数参数传递模式

在控制台程序中,参数传递有两种模式: app.exe -x -n 模式 app.exe -xn 模式 以下程序,可适用与以上两种模式的识别. #include <stdio.h> #include <stdlib.h>  //exit()头文件 int main(int argc,char *argv[]) { int c,x_Chosen = 0,n_Chosen = 0; bool bRet = true; //参数传递模式:*.exe -x -n (或) *.exe -xn均

.Net remoting学习笔记

.NET Remoting是.NET平台上允许存在于不同应用程序域中的对象之间进行通讯的基础设施.调用对象被称为客户端,而被调用对象则被称为服务器或者服务器对象.简而言之,它就是.NET平台上实现分布式对象系统的框架. 传统的方法调用是通过栈实现,调用方法前将this指针以及方法参数压入线程栈中,线程执行方法时将栈中的参数取出作为本地变量,经过一番计算后,将方法的返回结果压入栈中.这样我们就完成了一次方法调用. 基于栈的方法调用在同一个应用程序域中很容易实现,但是如果要调用的方法所属的对象位于另

附录一 再论指针和数组

附录一 附录一 再论指针和数组 再论指针和数组 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 预习检查 链表单元有哪几个部分组成 如何申请链表单元,及释放链表单元 实现单链表插入的基本语法 简述一下快速排序基本理论要点 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Dat

PL/SQL数据库开发那点事

PL/SQL数据库开发那点事-->编程,存储程序 在SQL*plus 中编写PL/SQL程序,并在SQL*plus 中执行它, PL/SQL块的代码就存放在SQL*plus的缓冲区中.如果在SQL*plus 中执行了其他的SQL语句或PL/SQL块,缓冲区中就会存放新的代码,原来的PL/SQL块就会被从缓冲区中清除出去.这种没有名称只是临时存放在缓冲区中的PL/SQL块叫做匿名块.匿名块就是没有名字的PL/SQL块,它仅存放在缓冲区中,只能在当前SQL*plus环境中执行.如果希望PL/SQL块

PL/SQL编程_存储程序

在前面的部分介绍了PL/SQL块的基本编写方法. 在SQL*plus 中编写PL/SQL程序,并在SQL*plus 中执行它, PL/SQL块的代码就存放在SQL*plus的缓冲区中.如果在SQL*plus 中执行了其他的SQL语句或PL/SQL块,缓冲区中就会存放新的代码,原来的PL/SQL块就会被从缓冲区中清除出去.这种没有名称只是临时存放在缓冲区中的PL/SQL块叫做匿名块.匿名块就是没有名字的PL/SQL块,它仅存放在缓冲区中,只能在当前SQL*plus环境中执行.如果希望PL/SQL块

PL/SQL编程_子程序设计

利用PL/SQL可以进行模块化程序设计. 在一个PL/SQL块中,可以定义若干个子程序. 把一些功能相对独立.需要经常执行的代码定义为一个子程序,在需要时根据子程序的名字进行调用.这样不仅便于程序设计和编码,而且利于程序的调试.PL/SQL有两种形式的子程序,即过程和函数. 在子程序中也可以定义变量.类型.游标等,也可以进行异常处理.在调用于程序时,可以向子程序传递参数. 过程与函数的区别在于函数具有返回值,可以向调用者返回执行结果,而过程没有返回值. 如何使用过程 子程序的定义出现在PL/SQ

Oracle之PL/SQL编程

PL/SQL(Procedural Language/SQL,过程语言/SQL) 是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点,它能把一组SQL语句放到一个模块中,使其更具模块化种序的特点. (2)PL/SQL可以采用过程性语言控制程序的结构. (3)PL/SQL有自动处理的异常处理机制. (4)PL/SQL程序块具有更好的可移植性,可移植到另一个Oracle数据库中. (5)PL/SQL程序减少了网络的交互,有助于提高程序

C#6.0语言规范(七) 表达式

表达式是运算符和操作数的序列.本章定义了操作数和运算符的语法,求值顺序以及表达式的含义. 表达式分类 表达式分类为以下之一: 一个值.每个值都有一个关联的类型. 一个变量.每个变量都有一个关联的类型,即声明的变量类型. 命名空间.具有此分类的表达式只能显示为member_access(成员访问)的左侧.在任何其他上下文中,分类为命名空间的表达式会导致编译时错误. 一种.具有此分类的表达式只能显示为member_access(成员访问)的左侧,或者作为运算as符(作为运算符),is运算符(运算符)

对象引用、变量

1.变量不是盒子,在python中变量不过是一种标注,类似于Java中的引用类型的变量. a=[1,2,3] b=a b.append(4) print(a) print(b) # [1, 2, 3, 4] # [1, 2, 3, 4] 如上所示,可以清晰的看出,变量是一种标识,a b 指向同一块区域,所以修改b ,a也会随着改变. 每个变量都有标识.类型和值,对象一旦创建,它的标识一定不会改变,可以把标识理解为对象在内存中的地址. is比较两个对象的标识: id()返回对象标识在内存中的地址.