记得在书上看到过,Pascal里函数参数传递都是传引用调用.

解决方案 »

  1.   

    在默认情况下,是值传递,前加var是引用(指针方式).还有Const,Out参数。具体可以看一下帮助。所以你的代码改为如下就正确了
    procedure Getstr(str: String; var str1: String);
                                  ~~~`--->添加 
    begin
      str1 := copy(str, 1, 4);
    end;
      

  2.   

    对你这题或许没有用处,但是了解一下也是好的:)9.1 C++ 和Object Pascal 对象模型
    C++ 和Object Pascal 在创建、初始化、引用、拷贝和销毁对象的方法上有些微小的差异。在本节中描述这些细微的差别和它们对C++Builder VCL 风格类的影响。
    9.1.1 对象本身和实例
    在C + +中,类的一个实例是一个实际的对象。那个对象能直接被操作,或者通过引用或指针间接访问它。例如,给定一个构造函数中没有参数的C++ 类CPP_class, 下列变量都是该类的有效实例变量:相反,在Object Pascal 中,一个O b j e c t 类型的变量总是间接地引用对象。所有对象的内存都动态地被分配。例如, 给定Object Pascal 类O P _ c l a s s :
    ref 是OP_class 类型的对象的一个“引用”。转换到C++Builder 代码, 将是:
    1. 区分C++ 和Object Pascal 的引用
    文档中经常会把Object Pascal 类实例变量作为引用提及, 但却作为指针来描述它的行为。这是因为它兼有这两者的属性。一个Object Pascal 引用类似C++ 指针,但有下列的不同:
    · 一个Object Pascal 引用是隐式的间接引用(在此情况下更像一个C++ 引用)。
    · 一个Object Pascal 引用不像定义的操作那样有指针运算。
    Object Pascal 引用和C++ 引用比较时,也有类似和不同之处。两种语言的引用都是隐式的间接引用,然而,
    · 一个Object Pascal 引用可以被重指, 而C++ 引用不能。
    · 一个Object Pascal 引用可以是nil, 而C++ 引用必须指向有效的对象。
    有些V C L 结构下的设计计划是建立在使用这种类型的实例变量的基础上的。指针是最接近O b j e c t  P a s c a l 引用的C + +语言结构。因此, 几乎所有的VCL 对象的标识符在C + + B u i l d e r 中都被转换为C + +指针。注意Object Pascal 的var 参数类型最接近C++ 的引用。
    2. 拷贝对象
    与C + +不同,Object Pascal 没有可支持拷贝对象的内嵌编译器。本节描述这个差别对VCL 风格类赋
    值操作符和拷贝构造函数的影响。
    ( 1 )赋值操作符
    Object Pascal 赋值操作符(: =)不是一个类赋值操作符(o p e r a t o r =())。操作符赋值拷贝引用,而不是对象。
    C++Builder 的VCL 风格类的赋值操作符遵循Object Pascal 语言的规定。这意味着,下列代码中,在两个dereferenced 指针之间的赋值是无效的,因为它们试图拷贝对象而不是指针:
    注意对于VCL 风格类,使用C + +语法的引用是有效的。例如, 下列代码是有效的:
    尽管与使用赋值操作符不同,但对于澄清和比较而言,这里提出的语法已经足够类似了。
    ( 2 )拷贝构造函数
    Object Pascal 没有内嵌的拷贝构造函数。因而, 在C + + B u i l d e r 中的V C L 风格类也没有内嵌的拷贝构造函数。下例中的代码试图使用一个拷贝构造函数创建TButton 指针:
    对于V C L 类,不能编写依赖于一个内嵌的拷贝构造函数的代码。要在C + + B u i l d e r 中创建V C L 风格类对象的一个拷贝, 可编写一个成员函数以拷贝对象。另外, VCL TPersistent 类的派生类可重载A s s i g n 方法以从一个对象拷贝数据到另一个对象。例如,对于包含资源图像的图形类,诸如TBitmap 和T I c o n 通常就会这么做。拷贝一个对象的方式最终由程序员(组件开发者)决定;但需注意一些标准C++ 使用的拷贝方法对V C L 风格类是不适用的。
    3. 对象作为函数参数
    正如前面所讨论的,C + +和Object Pascal 中的实例变量不是等同的。在将对象作为函数的参数传递时应该记住这一点。在C + +中, 对象可以通过值、引用或指针传递给函数。在Object Pascal 中,当一个对象按值传递给函数时,应记住这个对象参数已经是一个对象的引用了。所以,实际上是引用被按值传递,而不是实际的对象。在Object Pascal 中,不能像在C + +中一样将实际对象按值传递。VCL 风格类对象在传递给函数时遵循Object Pascal 的规定。