PS: 这篇博客用来记录一些一般的C++书中草草掠过的一些概念。 或者一些不太容易理解的概念的详细解释。 欢迎新手进入,欢迎高手指正! Orz 。

引用: 为对象起了另外一个名字, 引用类型引用(refers to)另外一种类型。

int ival = 1024;

int &refval  = ival;

int &i//报错。

一般在初始变量时,初始值会被拷贝到新建的对象中。 然而定义引用时,程序把引用和它的初始值绑定(很类似与指针)在一起,而不是把初始值拷贝给引用。一旦初始化完成,引用将和它的初始值绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化!

引用本身不是对象, 而只是为一个已经存在的对象所起的另一个名字。 因为引用本身不是对象, 所以不能定义引用的引用。

指针与引用的区别: 《1》 引用本身不是一个对象。而指针本身就是一个对象, 所以可以有指向指针的指针,允许对指针的赋值和拷贝,而且在指针的生存周期内它可以指向几个不同的对象。        《2》 指针无需在定义时赋值(但是,尽量要定义后立即赋值, 不然如果,忘赋值了会有很大的隐患!), 和其他内置类型一样,在块作用域内定义的指针如果没被初始化,也将拥有一个不确定的值。

数组名与指针:

在大多数情况下, 数组名被解释成其第一个元素的地址, 然而也有例外。 《1》 数组声明使用数组名来标记存储位置; 《2》 对数组名使用sizeof将得到整个数组的长度(以字节为单位); 《3》 将运算符&用于数组名时, 将返回整个数组的地址。 也即是: 定义数组时,申请的内存块的地址。

两个转化公式:  arr[i] = *(arr+i) // values in two notations

&arr[i] == arr + i // addresses in two notations

数组在函数中传递:

当数组是一维数组的时候我们很好理解, 因为数组名被解释成其第一个元素的地址, 形参中只要有一个指针变量(或数组名)来接受就行啦。 然而当数组名是二维数组时怎么办呢? 它既有行,又有列。

int data[][] = {{, , , }, {, , , }, {, , , }};
int total = sum(data, );

data是一个数组名, 该数组有三个元素,其中每一个元素都是数组, 由4个int值组成。 因此data 的类型是指向有4个int组成的数组的指针, 因此正确的原型如下:

int sum(int (*ar2)[], int size); // (*ar2)[4]是一个指向由4个int组成的指针
int *ar2[]; // 4个指向int的指针组成的数组。注意与上面区分!

临时变量, 引用参数和const

如果实参与引用参数不匹配, C++将生成临时变量。 当前, 仅当参数是const 引用时, c++才允许这么做 ,但是以前不是这样的。

如果引用参数是const, 则编译器将在下面两种情况下生成临时变量:

《1》 实参的类型正确,但不是左值。

《2》实参的类型不正确, 但是可以转化成正确的类型。

左值是可以被引用的数据对象, 如: 变量, 数组元素, 结构成员, 引用和解除引用的指针都是左值。 非左值包括字面常量(用引号括起的字符串除外,它们由地址表示!)和包含多项式的表达式。 在C语言中最初的左值指的是可以出现在赋值语句左边的实体。 但是这是在const关键字引入之前的事, 现在常规变量和const变量都可以作为左值(但是const变量并不能被修改!)

#include <iostream>
using namespace std; double refcube(const double &ra)
{
return ra*ra*ra;
} int main()
{
double side = 3.0;
double *pd = &side;
double &rd = side;
long edge = 5L;
double lens[] = {2.0, 5.0, 10.0, 12.0};
double c1 = refcube(side); // ra is side
double c2 = refcube(lens[])// ra is lens[2]
double c3 = refcube(rd) // ra is rd is side
double c4 = refcube(*pd)// ra is *pd is side
double c5 = refcube(edge); // ra is temporary variable
double c6 = refcube(7.0); // ra is temporary variable
double c7 = refcube(side + 10.0); // ra is temporary variable
return ;
}

确切的说, 上面说的是左值引用, C++11新增了一种新的引用-----右值引用。 关于这个问题以后再说!

C++中的一些定义的更多相关文章

  1. ArcGIS中的坐标系统定义与投影转换【转】

    ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...

  2. 【转】+【举例】ArcGIS中的坐标系统定义与投影转换

    背景知识: UTM (Universal Transverse Mercator)坐标系是由美国军方在1947提出的.虽然我们仍然将其看作与"高斯-克吕格"相似的坐标系统,但实际上 ...

  3. ArcGIS中的坐标系定义与转换 (转载)

    原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...

  4. [C/C++]在头文件中使用static定义变量意味着什么

    文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...

  5. switch的case中不能做定义

    switch的case中不能做定义 只能给语句 error: a label can only be part of a statement and a declaration is not a st ...

  6. iOS 静态库中使用宏定义区分iPhone模拟器与真机---备用

    问题描述 一般项目中,可以使用宏定义来判断模拟器还是真机,这无疑是有效的. #if TARGET_IPHONE_SIMULATOR #define SIMULATOR 1 #elif TARGET_O ...

  7. [转载]C++中声明与定义的区别

    C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果 ...

  8. (转载)php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗?

    (转载)http://s.yanghao.org/program/viewdetail.php?i=184313 php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗? class block ...

  9. Javascript Jquery 中的数组定义与操作_子木玲_新浪博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

随机推荐

  1. php版redis插件,SSDB数据库,增强型的Redis管理api实例

    php版redis插件,SSDB数据库,增强型的Redis管理api实例 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储.另外,ro ...

  2. GPS模块的AT指令集

    AT+CPIN? 查询sim卡状态. 接着: AT+CGCLASS="B"AT+CGDCONT=1,"IP","CMNET"AT+CGATT ...

  3. 编程之美_1.1 让CPU占用率曲线听你指挥

    听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...

  4. Perl的基本语法<总结> (转载)

    前言:这篇文章是花了我很多时间.费了我很多心血才完成的,虽然连我自己都觉得无法达到尽善尽美的境界,但希望能帮助大家入门,稍微了解到Perl 到底是个什么样的东西,Perl到底有那些强大的功能,那么这篇 ...

  5. linux中Iptables限制同一IP连接数防CC/DDOS攻击方法

    1.限制与80端口连接的IP最大连接数为10,可自定义修改.  代码如下 复制代码 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlim ...

  6. Mac系统之----教你怎么显示隐藏文件,或者关闭显示隐藏文件

    缺省情况下,在 Mac 下是不显示隐藏文件的,Finder 也未提供设置是否显示隐藏文件的选项,不像 Windows 下,有一个“文件夹选项“设置界面里可以控制,但这并不表示 Mac 下无法显示隐藏文 ...

  7. Cacti Install

    一.Cacti简介 Cacti是通过snmpget来获取数据,使用RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查 ...

  8. 打开开源项目总得.md文件

    google了一些: 78 Tools for Writing and Previewing Markdown  http://mashable.com/2013/06/24/markdown-too ...

  9. js 字符串比较

    <script type="text/javascript"> function test(){ //1)纯数字之间比较 //alert(1<3);//true ...

  10. Windows驱动开发(中间层)

    Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...