对象作为函数参数:传值与传址

4星 · 超过85%的资源 需积分: 34 14 下载量 19 浏览量 更新于2024-09-18 收藏 156KB DOC 举报
"对象作为函数参数在C++中的应用与注意事项" 在C++中,对象可以以不同的方式作为函数参数传递,这主要分为三种情况:对象本身、对象引用和对象指针。每种方式都有其特定的特性和使用场景。 1. **对象本身做参数(传值)**:当一个对象直接作为函数参数时,实际上是创建了该对象的一个副本。这意味着函数内部对参数对象的任何修改都不会影响到函数外部的对象。例如,如果我们有一个`CStrSub`类的对象`a`,然后将其作为参数传递给一个函数,函数内部对`a`的改变不会影响到原来的`a`。这种传递方式可能导致效率问题,因为可能会复制较大的对象。 2. **对象引用做参数(传地址)**:使用对象引用作为参数,实际上传递的是对象的地址,而不是对象的副本。这种方式下,函数内部对参数的修改会影响到原始对象。如代码所示,`input(CStrSub &temp)`函数接收一个`CStrSub`对象的引用,因此,函数内对`temp`的改变会直接影响到传入的对象。这种方式避免了对象复制的开销,但需要注意的是,函数可能无意间修改了原始对象的状态。 3. **对象指针做参数(传地址)**:与引用类似,传递对象的指针也允许函数直接操作原始对象,而不是副本。不过,指针需要进行额外的内存管理,比如在函数内可能需要`new`和`delete`。在上述代码中,虽然没有直接使用对象指针,但是理解这一点很重要,因为对象指针在处理大对象或需要动态分配内存的情况时很有用。 对于要求部分,如果要修改`input(CStrSub temp)`函数,使其不通过引用而是通过值传递,我们需要创建函数的副本并修改副本,然后返回这个副本。这样做的结果是,原始对象不会被修改,而函数内部的修改只会影响到返回的对象。但是,这种方法会导致额外的内存开销,因为需要创建和销毁对象的副本。 ```cpp CStrSub input(CStrSub temp) { chars[20]; cout << "输入字符串:" << endl; cin >> s; CStrSub newTemp(s); // 创建一个新对象newTemp,并设置为用户输入的值 return newTemp; // 返回新对象 } ``` 在`main()`函数中,调用`input()`时,`b`将不再与`a`共享状态,而是拥有一个独立的`CStrSub`对象。 选择哪种方式传递对象取决于是否希望函数修改原始对象,以及对性能和内存管理的需求。理解这些概念对于编写高效的C++代码至关重要。