c++将指向对象的指针作为函数参数 形参是对象指针 实参是什么
时间: 2024-10-21 12:02:06 浏览: 111
在 C++ 中,当我们将指向对象的指针作为函数参数时,形参是指函数定义中的变量,它是一个引用到对象的内存地址。实参则是当你调用函数时传递给这个形参的具体值,通常是一个对象的实例或者对象的指针。
例如:
```cpp
void displayStudent(Student* studentPtr) { // 函数声明,形参为 Student 类型的指针
cout << "Name: " << studentPtr->name << ", Age: " << studentPtr->age << endl;
}
// 调用函数时,实参可以是一个具体的 Student 对象
Student john{"John", 20};
displayStudent(&john); // &john 是 john 对象的指针
// 或者是一个 Student 指针变量
Student* ptr = new Student{"Alice", 25};
displayStudent(ptr);
```
在这个例子中,`&john` 和 `ptr` 都是实参,它们都指向了实际的学生对象。通过指针作为参数,函数可以处理任意类型的 Student 对象,体现了 C++ 的动态绑定特性。
相关问题
c++1.用数组作为函数形参实现函数,函数调用时实参为数组。 2.用数组作为函数形参实现函数,函数调用时实参为指针。 3.用指针作为函数形参实现函数,函数调用时实参为数组。 用指针作为函数形参实现函数,函数调用时实参为指针。
1. 用数组作为函数形参实现函数,函数调用时实参为数组:
```c
void func(int arr[], int size) {
// 函数体
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
func(arr, 5);
return 0;
}
```
2. 用数组作为函数形参实现函数,函数调用时实参为指针:
```c
void func(int *arr, int size) {
// 函数体
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
func(arr, 5);
return 0;
}
```
3. 用指针作为函数形参实现函数,函数调用时实参为数组:
```c
void func(int *arr, int size) {
// 函数体
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
func(&arr[0], 5);
return 0;
}
```
4. 用指针作为函数形参实现函数,函数调用时实参为指针:
```c
void func(int *arr, int size) {
// 函数体
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
func(arr, 5);
return 0;
}
```
注意,指针和数组在函数传参时有一些细微的差别,需要注意。
对象指针可以作为函数的参数,使用对象指针作为函数参数可以实现传值调用,即在函数调用时使实参对象和形参对象指针变量指向同一内存地址,在函数调用过程中,形参对象指针所指的对象值的改变也同样影响着实参对象的值。
### C++ 中使用对象指针作为函数参数实现传值调用
在 C++ 编程语言中,当对象指针被当作函数参数时,实际上传递的是该对象地址的一个副本。这意味着,在函数内部对指针所指向的对象成员变量或方法的操作会影响到原始对象本身。
#### 对象指针作为函数参数的机制
当把一个对象指针传递给某个函数时,并不是复制整个对象的数据结构到新的内存位置;而是仅拷贝存储着原对象所在地址的那个指针数值。因此,即使是在栈上分配局部空间来保存这个新创建出来的指针副本,它仍然会指向堆上的同一片实际数据区域[^1]。
对于 `this` 指针而言,其本质上是一个隐式的常量指针,自动由编译器加入每一个非静态成员函数之中并指向当前正在操作的对象实例。每当调用这些成员函数的时候,`this` 就会被设置成对应于此次调用的目标对象的位置。值得注意的是,虽然看起来像是第一个隐形参数的形式存在,但在语法层面并不显式地出现在形参列表里。
下面展示了一个简单的例子说明如何利用对象指针来进行传值:
```cpp
#include <iostream>
using namespace std;
class MyClass {
public:
int data;
void setData(int d){
data = d;
}
};
void modifyData(MyClass* objPtr, int newValue) {
cout << "Original Data: " << (*objPtr).data << endl;
(*objPtr).setData(newValue);
}
int main() {
MyClass myObject;
myObject.setData(10);
modifyData(&myObject, 20);
cout << "Modified Data via Pointer: " << myObject.data << endl;
}
```
上述代码片段展示了通过对象指针修改对象属性的过程。这里定义了一个名为 `MyClass` 的简单类及其成员函数 `setData()` 来设定整型字段 `data` 的值。接着实现了另一个外部辅助函数 `modifyData()` 接受两个参数——一个是目标对象的指针 (`MyClass*`) 和一个新的整数值得以更新原有数据项。最后,在主程序部分创建了此类别的实体 `myObject` 并初始化它的初始状态为 10 ,随后调用了 `modifyData()` 函数改变此成员变量至指定的新值 20 。最终输出显示成功更改后的结果。
阅读全文
相关推荐















