C++ 之引用
- int argc ,char * argv[] - argument count & argument vector
argc - 命令行参数个数,argv[]依次指向每一个命令行参数,其中argv[0]为程序名字:下面的程序包含了完整的程序路径。
#include <iostream> int main(int argc, char *argv[])
{ int i = ; // begin with 0
while (i < argc)
std::cout << argv[i++] // output string
<< " " // output SPACE
<< std::endl; // terminate output line
return ;
}
引用
1)作为返回值,不需要产生临时对象,然后拷贝这个对象,(见下面代码的注释),目前不要深究引用机制,目前记住的返回引用的场景:输入流、 //发现其他的再补充
// 2019-11-24日更新,对于引用作为返回值类型,可以通过汇编可知返回的是结果的地址值(引用视为弱化指针).在C++语法层面上考虑,就是首先,这个函数可以作为左值,是可以赋值的,如在重载[](下标索引)的时候,返回非应用是查值,返回引用,则可以进行赋值.其次,根据上面的说明,返回类型为引用的函数的一大作用就是给函数作用域外的值赋值.这个作用在我这个例子中几乎体现不出来,这是以前总结的时候忽略的,所以在此说明.
#include <iostream>
using namespace std; int & rfun(int &); //don't dig more,ref func saves time.
int fun(int); void main(void) {
int a = , b = ;
int &ra = a, &rb = b; //Treat ra as another name of a
int *pa = &ra, *pb = &rb; cout << pa << " " << (void *)pa << endl;
cout << pb << " " << (void *)pb << endl; cout << a << " " << b << endl;
cout << rb << " " << (void *)&rb << endl; //&rb == pb always.
rb = rfun(ra); //b=ra; rb=ra; --> int &rd=a;
//rb=fun(ra);
cout << rb << " " << (void *)&rb << endl; cout << a << " " << b << endl;
rb = ;
cout << a << " " << b << endl;
} int & rfun(int & r) {
return r; // b=fun(a) --> b=a;
}; int fun(int r) {
return r; // b=fun(a) --> r=a; b=r;
};2)引用类型参数
对于class,vector等类型的参数,引用 避免了值拷贝,提升效率,使用引用,函数可以改变实参的值,如果在调用过程中实参值不会发生变化,那么添加 const 修饰。
//call by ref can change the value after func called.
#include <iostream> using namespace std; void funr(const int &, int);
int& rfun(const int &, int); void main(void) {
int a = ;
int& b = a;
const int& c = ; const int & ca = a; a = ; const int cb = ; cout << &a << " " << a << endl;
cout << &b << " " << b << endl;
cout << &c << " " << c << endl; cout << endl << endl; funr(a, a); //first a,like above;second a, int tmp = a;
funr(, );
cout << endl << endl; int& rf = rfun(c, c);
cout << &rf << " " << rf << endl; } void funr(const int & ra, int pa) {
cout << &ra << " " << ra << endl;
cout << &pa << " " << pa << endl; //int tmp = pa, &pa is addr of tmp
} int& rfun(const int & ra, int pa) { // b = rfun(ra,pa)-->b = ra int x = , &d = x;
cout << &ra << " " << ra << endl;
cout << &pa << " " << pa << endl;
return (int&)ra;
}
以上则是目前想到的关于引用的知识点小结,以前曾经写过这话题的博文,今天讲解细致些,看注释,运行程序,更快速理解引用,VS2015社区版。
2016-5-21补充代码如下:
#include <iostream>
using namespace std; class A {
public:
int a;
A(int = );
A(const A &);
A& operator = (const A &); void PV(A);
void PR(A&);
A RV(void);
A& RR(void);
}; // A A::A(int x) : a(x) { cout << "Constructor (value)" << endl; }
A::A(const A & x) { cout << "Constructor (copy)-" << (void *)&x << endl; a = x.a; } A& A::operator = (const A & x) { cout << "Operator (=) @ " << (void *)&x << endl; a = x.a; return *this; } void A::PV(A x) { cout << "Calling By Value @ " << (void *)&x << endl; }
void A::PR(A &x) { cout << "Calling By Refe. @ " << (void *)&x << endl; } A A::RV(void) { cout << "Calling Rt Value" << endl; return *this; }
A& A::RR(void) { cout << "Calling Rt Refe." << endl; return *this; } int main(void) {
A oa, ob(); cout << "oa @ " << (void *)&oa << endl;
cout << "ob @ " << (void *)&ob << endl; cout << endl << "" << endl;
oa.PR(ob);
cout << endl << "" << endl;
oa.PV(ob);
cout << endl << "" << endl; ob = oa.RR();
cout << endl << "" << endl; ob = oa.RV();
cout << endl << "" << endl;
return ;
}
参数类型为class且为值传递的时,先调用对象的拷贝构造函数生成中间值,然后传入这个中间值到函数中;返回类型为值类型的时,会调用拷贝构造函数生成中间值,实际上返回的是这个中间值。
C++ 之引用的更多相关文章
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- CSS 选择器及各样式引用方式
Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...
- Android性能优化之巧用软引用与弱引用优化内存使用
前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...
- C++中的引用
一,C++中引用的基础知识 1.引用的基本概念 1.所谓的引用其实就是对变量起“别名”.引用和变量对应得是相同的内存,修改引用的值,变量的值也会改变,和指针类似. 2.引用在定义的时候必须要初始化,初 ...
- Java 为值传递而不是引用传递
——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...
- EC笔记:第4部分:21、必须返回对象时,别返回引用
使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用. 如下: struct St { int a; }; St &func(){ St t; return t; } 在返回t ...
- EC笔记:第4部分:20、传递引用代替传值
考虑以下场景: #include <iostream> #include <string> using namespace std; struct Person { strin ...
- 编译器开发系列--Ocelot语言2.变量引用的消解
"变量引用的消解"是指确定具体指向哪个变量.例如变量"i"可能是全局变量i,也可能是静态变量i,还可能是局部变量i.通过这个过程来消除这样的不确定性,确定所引用 ...
- C++右值引用浅析
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
随机推荐
- Oracle(控制用户权限)
权限允许用户访问属于其它用户的对象或执行程序, ORACLE系统提供权限:Object 对象级.System 系统级 查看权限的数据字典: 字典名 含义 ROLE_SYS_PRIVS System p ...
- 兼容IE7音乐播放器之jplayer的使用
首先列出为何要写这篇随笔的原因: 1:兼容IE7 2:音乐播放器 3:任意控制播放器 1: 最近做的网站需要兼容IE7,在此之前已经写好了关于音乐播放的插件,火狐,IE8以上,以及谷歌浏览器等都可以随 ...
- javascript对象创建方式
工厂模式 在ECMAscript中无法创建类,所以开发人员就发明了一种函数,用函数来封装,以特定接口创建对象的细节,如下面的例子所示: function createPerson(name,age,j ...
- Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0
maven构建项目的时候遇到这个错误: 一.直接原因 制定路径下确实没有sqljdbc4.jar文件. 二.根本原因 微软不允许以maven的方式直接下载该文件. 三.解决办法 3.1 手动下载相关库 ...
- SQL-Server使用点滴(三)
除了基本的数据库,数据表,数据记录操作之外,SQL-Server还为我们提供了比较丰富的其他对象元素.函数,过程,触发器,序列,映射服务器, 以及对各种元素的系统表信息读取与判断. --先加一个利用递 ...
- 关于phpcms 万一忘记密码怎么破?
莫慌~海洋小生教你~我也是偷偷学来的,呀哈哈哈! first:............................你就认命吧!哈哈哈... 开玩笑开玩笑! LOOK HERE ↓: 1.在没有安装 ...
- 读《编写可维护的JavaScript》第八章总结
第八章 避免“空比较” 我们在对传进来的参数做处理之前,肯定需要验证一下是否是我们想要的,也就是说大多数情况下,我们需要对比一下它的类型. 作者首先给了一个看起来都感觉不对的代码: var Contr ...
- C#知识点总结系列:C# 数据结构
线性表(Linear List) 线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点, ...
- spring 配置 redis
1.maven相关pom.xml <dependencies> <!--spring redis--> <dependency> <groupId>or ...
- 常用SVN命令
SVN命令 svn co svn://10.144.156.41/branches/webroot_2015_03_03_gift 表示check远程目录到当前目录下,co命令只能check目录,如 ...