- 浏览: 2045884 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
关于C++对函数传参与函数返回值进行引用传递的详解 在坛子里看到这个问题,搞出来说一说,希望对大家有帮助。本文主要讲解在C++中对函数传参与函数返回值进行引用传递的含义,重载“=”的问题。文中以实例讲解,希望有助于大家理解。 读之前,请确定您已经知道引用传递是个什么东东,只是对它有点混淆。没听过引用传递或没读过引用传递概念的同学不适合读本文。 例子程序: 例1.一个编译不过去的程序 #include <iostream> using namespace std; class MyCopy{ public: int a; fun(MyCopy & obj); //声明函数没有返回值 }; MyCopy::fun(MyCopy obj) //定义函数没有返回值 { return obj; //却返回了obj,当然编译不过去 } int main(){ MyCopy mycopy1, mycopy2; mycopy1.a = 1; mycopy2.a = 2; cout << mycopy1.a <<endl; cout << mycopy2.a <<endl; return 0; } OK,下面进入正题。如果我想利用fun函数来实现令mycopy1与mycopy2两个变量共用同一内存空间的功能。 例2.一个达不到目的例子 #include <iostream> using namespace std; class MyCopy{ public: int a; MyCopy fun(MyCopy obj); }; MyCopy MyCopy::fun(MyCopy obj) { return obj; } int main(){ MyCopy mycopy1,mycopy2; mycopy1.a = 1; mycopy2.a = 2; mycopy1 = mycopy2.fun(mycopy2); //新加的函数调用 mycopy2.a = 3; //新加的赋值 cout << mycopy1.a <<endl; //打印 2 -- 期待打印 3 cout << mycopy2.a <<endl; //打印 3 return 0; } 问题出在,函数传参时,用的值传递,而不是引用。值传递会自制出一个新对象obj,生存期是fun函数执行期间。obj不是我们期待的mycopy2,所以达不到目的。为了让函数体内的obj就是mycopy2“本体”,我们用引用传递。 例3.利用引用传递传参,但仍达不到效果 #include <iostream> using namespace std; class MyCopy{ public: int a; MyCopy fun(MyCopy & obj); //引用传参 }; MyCopy MyCopy::fun(MyCopy & obj) //引用传参 { return obj; } int main(){ MyCopy mycopy1,mycopy2; mycopy1.a = 1; mycopy2.a = 2; mycopy1 = mycopy2.fun(mycopy2); mycopy2.a = 3; cout << mycopy1.a <<endl; //打印 2 -- 期待打印 3 cout << mycopy2.a <<endl; //打印 3 return 0; } 问题是,怎么还不行?好吧,您会经常看到这样的经典用法: MyCopy & fun(MyCopy & obj); 为什么返回值也要用&修饰?我们先来讲上例中的函数调用原理,这很重要。函数fun被调用时,mycopy2的实体在fun内有意义,也就是说obj和mycopy2是共用一块内存的。而return时,复制了一份mycopy2,返回给了mycopy1。然后由于“=”的作用,这块复制出的mycopy2按“=”的作用,将自己的成员变量的值赋给了mycopy1。最后mycopy1的内存没有发生变化,只是成员变量的值变了。 例4.让返回值也是引用传递 #include <iostream> using namespace std; class MyCopy{ public: int a; MyCopy & fun(MyCopy & obj); //返回值引用传递 }; MyCopy & MyCopy::fun(MyCopy & obj) //返回值引用传递 { return obj; } int main(){ MyCopy mycopy1,mycopy2; mycopy1.a = 1; mycopy2.a = 2; mycopy1 = mycopy2.fun(mycopy2); mycopy2.a = 3; cout << mycopy1.a <<endl; //打印 2 -- 期待打印 3 cout << mycopy2.a <<endl; //打印 3 return 0; } 为什么还不行?是这样的,在调用fun函数后mycopy2与obj在fun生存期内共用一块内存。返回时由于是按引用传递的,这块内存也被返回过来。与上例返回一个临时复制的对象不同,这次真的返回了mycopy2的“本体”,可是由于“=”作用,mycopy2成员变量的值被赋给了mycopy1的成员变量,于是mycopy1还是原来的mycopy1。 我们现在有两个问题: 1、怎么理解“=”。 2、我想让mycopy1与mycopy2指向同一块内存应该怎么做? 解答: 1、“=”可以这样理解mycopy1 = mycopy2;相当于调用了函数 mycopy1.=(mycopy2)。看不懂?OK,这些看得懂吧:Myobj.a(),Myobj.b(),那这个呢Myobj.=(),就是一个名字为“=”的函数。所以函数“=”里怎么写,很重要。这也是重载“=”运算符后,要实现对象复制必需将成员变量一一赋值的原因。 2、OK,要达到目的,可以这样做MyCopy & mycopy2 = mycopy1;当然也有其它方法。 本文编译环境为Ubuntu/g++。
发表评论
-
DLL中导出函数的声明有两种方式:
2012-11-12 16:42 1862DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中 ... -
k-means算法的C++实现
2011-04-05 11:38 2343k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1540所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2390转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1915mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1601为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1702#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6828两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1535Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1551C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1844一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1579显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1358先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1835使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1774四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1886在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1618线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1755今天我给大家讲一讲C++ ... -
i++和i--哪个效率高
2010-10-15 09:01 3318for(i = n; i > 0; i--){…} ...
相关推荐
这些函数由`return_type function_name(parameters)`定义,其中`return_type`是函数返回值的类型,`function_name`是函数名,`parameters`是传递给函数的参数列表。 3. **无参函数**:不接收任何参数的函数,参数...
1. **对象作为函数参数**:当你将一个对象传递给函数或作为返回值时,如果函数接受或返回的是对象的引用或指针,那么复制构造函数可能被调用。 2. **数组和集合中的元素**:当对象是数组、向量或其他容器(如std::...
通过对C++函数的深入探讨,我们不仅了解了函数的基础概念和使用方法,还学习了一些高级特性,如内联函数、变长参数列表和函数模板等。这些知识对于编写高效、可维护的C++程序至关重要。希望本文能够帮助读者更好地...
C++ 函数详解与应用实例 C++ 函数是将任务进行模块划分的基本单位,一个函数实现一项功能。在面向对象程序设计中,函数是对数据的一项操作,也是实现一项功能。要掌握函数的使用,必须理解函数调用时的内部实现机制...
C++函数详解与应用实例ppt课件 以下是从给定的文件信息中生成的相关知识点: ...本节课件主要介绍了C++函数的定义、调用、类型、参数传递、返回值、生命期和作用域等知识点,并对函数的一些高级议题进行了介绍。
在编程世界里,C和C++是两种非常基础且强大的编程语言,...无论是初学者还是经验丰富的开发者,对C/C++函数深入的理解和熟练掌握都是提高编程能力的关键。记得在实践中不断练习和探索,因为实践是检验真理的唯一标准。
引用安全且不会为空,常用于函数参数和返回值,以避免复制大对象带来的开销。 10. **拷贝构造函数**:拷贝构造函数是一种特殊的构造函数,用于创建一个新对象作为现有对象的副本。当对象作为参数传递、返回函数值或...
【C++拷贝构造函数详解】 C++中的拷贝构造函数是类的一个特殊构造函数,它的主要作用是在创建新对象时,将已有对象的内容复制到新对象中。这是类对象在某些特定情况下的必需操作,因为类对象通常具有更复杂的内部...
* 函数值类型说明:指函数返回值的数据类型,如 int、char 等。 * 函数名:是一个标识符,用于标识函数。 * 参数说明表:是函数的参数列表,用于传递参数给函数。 * 函数体:是函数的执行体,包括函数的执行语句。 ...
- 不可以直接对引用求地址。 #### 引用的应用场景 引用在C++中有多种实用的应用场景,下面我们逐一介绍。 ##### 1. 作为函数参数 引用可以用作函数参数,这在处理大量数据时非常有用,因为这样可以避免复制整个...
在C++编程中,向函数传递引用参数是一种高效且灵活的方法,它允许函数直接操作调用者提供的对象,而无需复制数据。这在处理大型对象或者需要修改原对象的情况下特别有用。引用不是独立的对象,而是现有对象的别名,...
### C++ 中绘制圆形与椭圆的函数 在C++编程语言中,处理图形界面时,经常需要用到绘制基本图形的功能,比如圆形和椭圆。本文将详细介绍如何在C++中利用特定函数来实现圆形和椭圆的绘制。 #### 函数定义 在C++中,...
以上内容概述了C++调用Python脚本中函数的整个流程,包括环境配置、脚本编写、C++中的调用代码实现、以及软件发布时对Python代码的保护。这个过程涉及到多个知识点,包括C++与Python交互的接口使用、Python的模块...
回调函数在C++编程中是一种重要的机制,它允许我们将一个函数的指针作为参数传递给另一个函数,由后者在适当的时候调用。这种方式使得我们能够实现灵活的代码组织和解耦,尤其在需要定制行为或者处理多种不同类型的...
- **传引用(Pass by Reference)**:通过指针实现,函数可以通过修改指针变量来改变实参的值,如`void swap(int *a, int *b)`。 5. **函数的返回值**: 函数可以有返回值,也可以没有返回值。返回值通过`return`...
### C++函数详解 #### 一、C++函数概述 在C++编程语言中,**函数**是程序的基本组成单位之一,它允许开发者将代码分解为较小、可管理且易于理解的部分。通过定义函数,可以封装一系列执行特定任务的操作,并在程序...
- **函数定义与调用**:了解函数的声明、定义和参数传递,以及如何返回值。 2. **MFC函数** - **消息处理**:MFC通过消息映射机制处理Windows消息,如`ON_MESSAGE`、`ON_COMMAND`等。 - **控件操作**:MFC提供了...
从代码可读性的角度,引用传递的函数调用看起来像直接修改变量,而实际上它提供了和指针传递一样的功能。引用的引入使得C++的编程风格更加清晰,特别是在实现容器(如`std::vector`)的`operator[]`这样的操作符时,...
### 回调函数详解 #### 一、回调函数的基础概念及使用场景 **回调函数**是一种编程技术,广泛应用于各种编程语言中,特别是在C++这样的面向对象编程语言中更是常见。简单来说,回调函数就是一个通过函数指针传递的...
### C/C++中的回调函数详解 #### 回调函数的概念及意义 在C/C++编程中,**回调函数**是一种非常重要的编程模式和技术,广泛应用于各种场景,如定时器事件处理、进度监控等功能的实现。回调函数的核心在于,它允许...