引用的工作用法

本文深入解析C++中引用的工作原理,对比与指针的区别,探讨其在函数参数和返回值中的应用,以及如何利用引用提高程序效率。

引用的工作用法

在C到C++,取地址符&的右值到左值出现,在理解中都是地址的概念。
C中&指向内存的地址,而C++则是别名的一个内存地址(对象本身的地址).
右值(非左值)通常指字面常量(用引号括起的字符串除外,它们由地址表示)和包括多项的表达式。
左值是可被引用的数据对象,比如(变量,数组元素,结构成员,引用和解除引用的指针都是左值),现在还加上const变量。

对于不想被修改的对象数据,可用const处理。
引用只能在定义时被初始化一次,之后不可变。这一点与指针不同。
引用不能为空,指针可以为空。
引用的声明操作:类型标识符:&引用名=变量名
举例:
string input;
string copy;
string result;
result = version1(iput,"***");
string version1(const string & s1, const string & s2)
{
string temp;
temp = s2 + s1 + s2;
return temp;
}
函数返回的值被复制到一个临时变量的内存地址,由于是string类型,所以result接收了这个地址,相当于存储了这个内存块。(左值是变量 = 右值是字符串)当然,函数调用的时候,这个函数执行完会被回收。
result = version2(iput,"
**");
const string &version2( string & s1, const string & s2)
{
s1 = s2 + s1 + s2;
return s1;
}
函数返回值是一个字符串,也是string类型,result同样也接收了这个内存块的地址,但是,这个函数的s2,是被const的,里面的值并没用被修改,所以属于深拷贝的一个范畴(另外一个知识点)。(左值result变量 = 右值字符串地址)。函数调用完,这个函数也会被回收,但是函数变量的地址已经被引用。
result = version3(iput,"***");
const string &version3( string & s1, const string & s2)
{
string temp;
temp = s2 + s1 + s2;
return temp;
}
和例子1相似。返回的是字符串,存储在临时变量的一个地址,但是引用对象却是一个空(注意:例子1,是一个指针的地址,现在这个例子是引用对象的地址)。左值rerult = 右值变量&version3(空?)。函数调用完就被回收。引用不能为空,指针可以为空。

(转载) 何时使用引用参数
使用引用参数的主要原因有两个:
1)程序员能够修改调用函数中的数据对象;
2)通过传递引用而不是整个数据对象,可以提高程序的运行速度。
当数据对象较大时(如结构和类对象),第二个原因最重要。

对于使用传递的值而不作修改的函数:
1.如果数据对象很小,如内置数据类型或小型结构,则按值传递。
2.如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。
3.如果数据对象是较大的结构,则使用const指针或const引用,以提高程序的效率。可以节省复制结构所需的时间和空间。
4.如果数据对象是类对象,则使用const引用。传递类对象参数的标准方式是按引用传递。

对于修改调用函数中数据的函数:
1.如果数据对象是内置数据类型,则使用指针。
2.如果数据对象是数组,则只能使用指针。
3.如果数据对象是结构,则使用引用或指针。
4.如果数据对象是类对象,则使用引用。

原文:https://blog.youkuaiyun.com/hydz8023/article/details/85232638
如有侵犯原文作者的利益,请联系,删帖处理。

<think>嗯,用户的问题是在VBA中如何正确引用外部工作簿,需要示例代码和方法。首先,我需要回忆一下VBA中处理工作簿引用的相关知识。根据之前提供的引用内容,特别是引用[1]、[2]、[3],里面提到了使用Workbooks.Open方法打开其他工作簿,并且可以返回一个工作簿对象。所以,正确的步骤应该是先打开外部工作簿,然后通过变量来引用它。 用户可能已经知道如何打开工作簿,但可能不清楚如何正确引用其中的工作表或单元格。比如,使用Open方法后,如何保存返回的工作簿对象变量,以便后续操作。比如,像引用[3]提到的,必须使用完整的单元格路径,包括工作簿和工作表名称,否则VBA会默认引用当前活动的工作簿或工作表,这样可能导致错误。 接下来,我需要考虑用户可能的误区。例如,直接使用Workbooks("文件名.xlsx")而不先打开它,这样会导致运行时错误。或者,在引用单元格时没有指定完整路径,导致数据被错误地读取或写入当前工作簿。 然后,根据这些思考,我应该分步骤说明:第一步是打开外部工作簿并赋值给变量,第二步是通过变量引用工作表或单元格,第三步是关闭工作簿并释放资源。同时,提供示例代码,展示如何正确使用Open方法,如何引用单元格,以及如何处理可能出现的错误,比如工作簿未打开的情况。 还要注意引用其他工作簿时可能需要使用完整的路径,而不仅仅是文件名。另外,在跨工作簿操作时,使用Workbook对象变量可以简化代码,避免重复输入长路径。例如,像引用[2]中的示例,使用Workbooks.Open Filename:='路径',并将返回的Workbook赋值给变量。 最后,用户可能需要知道如何在不打开工作簿的情况下引用数据,但根据引用内容,这似乎不被支持,因为引用[3]提到一般情况下需要打开工作簿。不过,或许可以使用ADODB或其他方法,但根据提供的引用可能不在范围内。因此,应专注于通过Open方法正确引用已打开的工作簿。 现在需要确保回答结构清晰,分步骤说明,并附上示例代码,同时生成相关问题。还要检查是否所有数学表达式都正确使用$...$,但这个问题可能不涉及数学公式,所以可能不需要。但根据系统指令,仍需注意格式。最后,添加引用标识到对应的引用位置,例如使用Open方法的部分引用[^1]、[^2],关于完整路径的引用[^3]。</think>在VBA中引用外部工作簿需通过`Workbooks.Open`方法打开目标文件,并使用完整的对象路径进行数据操作。以下是具体方法和示例代码: --- ### 步骤说明 #### 1. 打开外部工作簿并赋值变量 ```vba Dim extWB As Workbook Set extWB = Workbooks.Open("C:\路径\目标文件.xlsx") '打开外部工作簿并赋值给变量 ``` - 必须使用完整文件路径,否则会触发错误[^3] - 通过`Set`关键字将打开的工作簿对象赋值给变量`extWB` #### 2. 引用外部工作簿数据 ```vba '引用外部工作簿的单元格 Debug.Print extWB.Worksheets("Sheet1").Range("A1").Value '跨工作簿复制数据 ThisWorkbook.Worksheets("本地表").Range("B2").Value = _ extWB.Worksheets("数据表").Range("C5").Value '必须指定完整路径 ``` #### 3. 关闭工作簿并释放资源 ```vba extWB.Close SaveChanges:=False '关闭时不保存 Set extWB = Nothing '释放对象变量 ``` --- ### 完整示例 ```vba Sub 跨工作簿操作() Dim sourceWB As Workbook Dim targetWB As Workbook '打开源工作簿 Set sourceWB = Workbooks.Open("D:\数据源.xlsx") '操作目标工作簿(当前文件) Set targetWB = ThisWorkbook '跨工作簿复制数据 targetWB.Worksheets("结果").Range("A1") = _ sourceWB.Worksheets("原始数据").Range("B5") '关闭源工作簿 sourceWB.Close SaveChanges:=False End Sub ``` --- ### 注意要点 1. **对象层级关系**:`Application.Workbooks("文件名").Worksheets("表名").Range("单元格")` 2. **未打开工作簿**:若尝试直接引用未打开的工作簿(如`Workbooks("未打开文件.xlsx")`),会触发*下标越界*错误 3. **简化写法**:通过变量引用可简化长路径 ```vba With extWB.Worksheets("报表") .Range("A1:D10").Copy Destination:=ThisWorkbook.Sheets("汇总").Range("A1") End With ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值