IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++的传参问题 -> 正文阅读

[C++知识库]c++的传参问题

在c++中参数的传递有三种方式,他们分别是值传递,指针传递,和引用传递。
1.值传递
在函数定义括号中的参数是形参,是给函数内专用的局部变量,意味着函数接收到的是实参的副本,如果形参的值在函数内部被改变,对实参是没有影响的。

#include<iostream>
using namespace std;
class Tr
{
public:
	Tr(int n)
	{
		i = n;
	}
	void set_i(int n)
	{
		i = n;
	}
	int get_i()
	{
		return i;
	}
private:
	int i;
};
void sqr_it(Tr ob)
{
	ob.set_i(ob.get_i() * ob.get_i());
	cout<<"在函数sqr_it内形参ob的数据成员的i的值为:"<<ob.get_i();
	cout << endl;
 }//对象ob作为函数spr——it的形参
int main()
{
	Tr obj(10);
	cout << "在调用函数sqr_it之前,实参对象obj的数据成员i的值为:";
		cout << obj.get_i() << endl;
		sqr_it(obj);
		cout << "调用函数sqr_it之后,实参对象obj的值为:";
		cout << obj.get_i() << endl;
		return 0;
}
```。

在这里插入图片描述传值的声明及调用
在这里插入图片描述

值传递的作用更多是让函数内部了解外部参数的值。值传递是单向的,只能由实参传向形参。
2指针传递
指针传递很好理解,形参为指向实参地址的指针,当对形参操作时,等同于直接通过地址操作实参

#include <iostream>

using namespace std;

void change(int *ptr) {
	*ptr = 0;
}

int main() {
	int realNum = 10;
	int* ptr = &realNum;
	cout << "Before Change: " << realNum << endl;
	change(ptr);
	cout << "After Change: " << realNum ;
	return 0;
}
// 执行结果
Before Change: 10
After Change: 0
可以很明显地看见,我们在函数内部成功地修改了实参的值。是C++很常见的一种传参方式。


传指针的声明及调用

在这里插入图片描述

3引用传递
向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

指针和引用的区别
1.指针从本质上是一个变量,是一个整形变量,存放的是另一个变量的地址。指针在逻辑上是独立的,它可以被改变,甚至能改变它的值(指向其他地址),并且可以取出对应内存中的数据。
2.引用可以理解为外号,是另一个变量的同义词,它在逻辑上具有依附性,所以C++也规定引用的在创立的时候就必须被初始化(现有一个变量,然后创建对该变量的引用)。而且其引用的对象在其整个生命周期中不能被改变,即自始至终只能依附于同一个变量(初始化的时候代表的是谁的别名,就一直是谁的别名,不能变)。
3.在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

指针传递和引用传递的用处
1.函数内部修改参数并且希望改动影响调用函数。对比指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改);
2.当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递。

实例:

#include<iostream>
using namespace std;
class Tr
{
public:
	Tr(int n)
	{
		i = n;
	}
	void set_i(int n)
	{
		i = n;
	}
	int get_i()
	{
		return i;
	}
private:
	int i;
};
void sqr_it(Tr &ob)
{
	//ob.set_i(ob.get_i() * ob.get_i());
    // cout<<"在函数sqr_it内形参ob的数据成员的i的值为:"<<ob.get_i();
	//cout << endl;
    //ob->set_i(ob->get_i()*ob->get_i());
	//cout<<"在函数sqr_it内,形式参数ob的数据成员变量i的值为:"<<ob->get_i();
	//cout<<endl;
	ob.set_i(ob.get_i() * ob.get_i());
	cout << "在函数sqr_it内,形式参数ob的数据成员变量i的值为:" << ob.get_i();
	cout << endl;
 }//对象ob作为函数spr——it的形参
int main()
{
	Tr obj(10);
	cout << "在调用函数sqr_it之前,实参对象obj的数据成员i的值为:";
		cout << obj.get_i() << endl;
		sqr_it(obj);
		cout << "调用函数sqr_it之后,实参对象obj的值为:";
		cout << obj.get_i() << endl;
		return 0;
}

在这里插入图片描述
可以看见,引用传递成功地改变了参数的值,同时形参的地址和实参的地址其实是一模一样的。
引用的声明及调用
在这里插入图片描述

最后用一张图片总结一下
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:08:07  更:2021-11-29 16:10:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:17:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码