a是CArray的对象,括号里的形参可以是对象吗是什么意思?引用做形参可以是对象吗怎么理解的?麻烦讲的细节一点谢谢

abort: 遇到异常,安静处理,就是不显示不提示
continue: 结束循环内的本次处理,继续从循环体的开始位置继续执行

Exit 是跳出当前代码块也就是当前函数,跳出后是要继续向下执行的(如果有後续代码)

如果用 Abort,则执行不到 P3如果用 Exit 就能够执行到 P3

以上就是常见几种传递参数的方式。

//另一篇文章关于delphi参数传递的//

    声明/实现一个过程使用的参数称为形式参数(简称形参可以是对象吗)调用过程时传入的参数称为实际参数(简称实参)。

参数传递分两种:按值(by val)囷引用(by ref)这两种方式的本质区别是:

按值传递时,形参可以是对象吗和实参是两个变量它们开始时的值是相同的,即实参的数据被拷贝一份传递给了形参可以是对象吗所以此时,形参可以是对象吗的改变不会影响到实参

引用传递时,形参可以是对象吗和实参是同┅个变量可以将它们之一看做是另一个的别名。 所以此时形参可以是对象吗改变时,实参跟着改变

默认情况下,参数是按值传递的传递的是数据拷贝;如果加了var前缀,则成了引用传递

  {取得形参可以是对象吗所在地址。你会发现它和实参地址是不同的因为此时实參和形参可以是对象吗是不同的两个变量}

  {取得形参可以是对象吗所在地址。你会发现它和实参地址是相同的因为此时实参和形参可以是對象吗是同一个变量}

按值传递的参数可以指定默认值,比如上面的ByVal可以是这样:

调用它时可以省掉有默认值的参数:ByVal带默认值的参数必須位于参数列表的最后,如:

如果按值传递一个指针类型的参数情况会变得复杂而又很有意思。此时实际传递的是什么呢?是实际数據的拷贝吗不,是指针的拷贝也就是说形参可以是对象吗和实参是两个指针,不过这两个指针指向了相同地址所以这时候,形参可鉯是对象吗和实参可以共享它们指向地址中的数据但如果改变了形参可以是对象吗的指针指向,实参的指针指向不能跟着改变那么总結一下,就是:按值传递指针参数时实参和形参可以是对象吗可以共享指针指向地址中的数据,但是不能共享指针本身的指向而引用傳递时,因为实参和形参可以是对象吗是同一个变量因此实现完全共享。看下面的例子:

  {改变形参可以是对象吗指针指向实参的指针指向不会跟着改变,因为它们是两个变量如果仅仅是改变Obj的属性而不改变指向,则实参的属性会跟着改变}

  {改变形参可以是对象吗指针指姠实参的指针指向跟着改变,因为它们是同一个变量}

上面讲了这么多最根本的还是一句话:按值传递时,形参可以是对象吗和实参是兩个变量;引用传递时形参可以是对象吗和实参是同一个变量。抓住这句话就等于抓住了一切。(ps:关键总结):

相信你还看到过如下格式的參数声明:

其中使用了const和out关键字如果你没有看到过这样的声明,也不要紧它们是真实存在的。

const声明的参数是按值传递的而且形参可鉯是对象吗不能被改变。

out声明的参数是引用传递的主要用于定义输出参数,也就是说不需要输入值(即实参不需要初始化)实参传递給形参可以是对象吗的值被忽略。

如果用const修饰指针参数那么只能通过形参可以是对象吗修改指针地址里的数据而不能修改指针本身的指姠。例如对于一个const对象参数可以修改其属性,但是不能将它指向其他对象例如:

  {但是通过其属性或者方法修改隶属于Form的数据}

在本小节嘚最后,还不得不提及一种很特殊的参数类型:无类型参数(Untyped parameters)

声明时没有指定数据类型的参数称为无类型参数。因此从语法上讲,無类型参数可以接收任何类型的数据

无类型参数必须加const、out或var前缀;无类型参数不能指定默认值。

如以下一些Delphi定义的过程都使用了无类型參数:

所谓无类型参数可以接收任何类型的值只是从语法角度而言的。或者说理论上我们可以实现一个可以使用任何类型变量作为参數的过程,但是实际上没有必要也不可能做到。

打个比方说我们想造一辆可以装载任何物体的汽车。因为是“任何物体”所以物体鈳能是任何形状,于是这辆车必须没有车篷除了在几个车轮上铺一个足够大(足够大就已经是个大问题了)的平板外,不能再有任何东覀这时候,这个平板就可以看做是无类型的因为它上面可以坐人、摆一张桌子,也可以赶一些动物上去站着或者躺着尽管它可以承載很多种类的东西,但是也是有限制的比如不能放一座山、也无法容纳1万头猪。所以无类型参数的类型往往是有一定限制的比如SetLength的参數S只能是字符串、动态数组等。

这种限制一般是在过程的实现中完成的在运行时检查参数值的实际类型。对于与开发环境关系紧密的参數限制也可以构筑在编译器里。

使用无类型参数的原因是无法在声明时使用一个统一的类型来描述运行时可能的类型如SetLength的参数S可以是芓符串和动态数组,而并没有一个统一的类型来代表字符串和动态数组类型所以干脆声明为无类型。而将类型限制放到别的地方实现(洳编译器)例如SetLength的限制规则是写在编译器中的,它只能作用于长字符串或者动态数组你企图完成下面的功能时:

本小节的内容比较重偠,重点是理解参数按值传递和引用传递的本质:按值传递时形参可以是对象吗和实参是两个变量;引用传递时,形参可以是对象吗和實参是同一个变量

声明一个过程,可以使用register、pascal、cdecl、stdcall和safecall指令来指定参数传递顺序和参数内存管理方式从而影响过程的运作。如:

这五个指令具有不同含义如表3-1所示。

在一些源代码(包括Delphi自带的VCL源代码)中你还可能看到near、far、export以及inline、assemble等指令,它们是为了和16位Windows系统或者早期Pascal/Delphi兼容在目前的Delphi版本中,已经不具有任何意义所以在新的开发中不要再使用。

}

我们在使用vc进行比较复杂的编程時经常需要用到复杂的数组结构,并希望能实现动态管理由于C++并不支持动态数组,MFC提供了一个CArray类来实现动态数组的功能有效的使用CArray類,可以提高程序的效率

MFC提供了一套模板库,来实现一些比较常见的数据结构如Array,List,MapCArray即为其中的一个,用来实现动态数组的功能

CArray是从CObject派苼,有两个模板参数,第一个参数就是CArray类数组元素的变量类型后一个是函数调用时的参数类型。

我们有一个类 class Object我们要定义一个Object的动态数組,那么我们可以用以下两种方法:

}

您这只是定义了一个普通vector<A>对象v包含了三个元素而这三个元素需要调用构造函数进行初始化,您没有指定怎样初始化所以编译器自动调用默认构造函数,而您的class A根本就沒有默认构造函数并不是一个数组,请回去好好看看怎么定义数组;

您的A构造函数中的局部变量遮盖了本类的成员数据a;

}

我要回帖

更多关于 形参可以是对象吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信