对象作为函数参数
### 对象作为函数参数 在面向对象编程语言如C++中,对象作为函数参数是非常常见的用法。根据传递方式的不同,可以将对象作为参数分为三种情况:对象本身做参数(传值)、对象引用做参数(传地址)、对象指针做参数(传地址)。下面将分别对这三种情况进行详细的说明。 #### 一、对象本身做参数(传值) 当一个对象被直接作为参数传递给函数时,实际上是在进行值传递。这意味着会创建一个新的对象副本,并将其传递给函数。因此,在函数内部对该对象所做的任何更改都不会影响到原始对象。这种方式的主要优点是简单直观,易于理解;缺点是如果对象很大,则复制过程可能会导致性能问题。 例如,在提供的代码中: ```cpp CStrSub input(CStrSub temp) { char s[20]; cout << "输入字符串:" << endl; cin >> s; temp.set(s); return temp; } ``` 这里`input`函数接收一个`CStrSub`类型的对象`temp`。在函数内部对`temp`的任何操作(如调用`set`方法修改其内容)只会影响到这个临时副本,不会改变传入的对象`a`的状态。因此,当我们调用`input(a)`后,可以看到原对象`a`的值并未改变。 #### 二、对象引用做参数(传地址) 对象引用作为参数是一种更高效的方式,它通过传递对象的引用而不是实际的副本来实现。这种方式避免了复制对象所带来的开销,使得函数可以直接访问并修改原始对象。需要注意的是,这种方式必须谨慎使用,因为一旦误操作可能会导致程序状态混乱。 例如: ```cpp CStrSub input(CStrSub &temp) { char s[20]; cout << "输入字符串:" << endl; cin >> s; temp.set(s); // 直接修改原始对象 return temp; } ``` 在这个例子中,我们通过引用`&temp`传递了对象`a`。这样做的结果是,在函数内部对`temp`的任何操作都会直接影响到原始对象`a`。因此,当我们再次调用`input(a)`时,由于`temp`指向的是`a`,所以在函数内部对`temp`的操作实际上是直接修改了`a`,导致输出的结果发生了变化。 #### 三、对象指针做参数(传地址) 对象指针作为参数也是一种传地址的方式。这种方式同样可以避免复制对象,但与引用不同的是,指针可以被重新赋值。这意味着函数内部可以通过改变指针的指向来间接修改或替换外部的原始对象。这种灵活性有时非常有用,但也可能导致更多的错误。 例如: ```cpp CStrSub input(CStrSub *temp) { char s[20]; cout << "输入字符串:" << endl; cin >> s; (*temp).set(s); // 通过指针修改原始对象 return *temp; } ``` 这里使用指针`CStrSub *temp`来传递对象`a`。与引用不同的是,指针可以通过解引用`(*temp)`来访问对象本身。因此,当我们再次调用`input(&a)`时,由于`temp`指向的是`a`,所以在函数内部对`temp`的操作实际上也是直接修改了`a`。 ### 总结 对象作为函数参数有三种主要的方式:传值、传地址(通过引用或指针)。不同的传递方式有着不同的特点和应用场景。选择合适的方式对于编写高效、安全的程序至关重要。在实际开发中,通常建议尽可能使用引用或指针来避免不必要的对象复制,从而提高程序的性能。
- huistory_li2014-12-26不错的说明,很容易让人接受
- hxy19372013-05-24不错的例子,浅显易懂,谢谢分享
- 粉丝: 34
- 资源: 14
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助