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. 各种数据库连接代码(java)

    SqlServer2000 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); URL = "j ...

  2. Linux中文显示乱码解决

    输入 echo $LANG可以查看当前使用的系统语言 查看是否有中文语言包可以在终端输入 locale命令,如有zh cn 表示已经安装了中文语言 没有则 yum groupinstall chine ...

  3. Linux驱动学习笔记(6)信号量(semaphore)与互斥量(mutex)【转】

    转自:http://blog.chinaunix.net/uid-24943863-id-3193530.html 并发导致竟态,从而导致对共享数据的非控制访问,产生非预期结果,我们要避免竟态的发生. ...

  4. Distinct<TSource>(IEqualityComparer<TSource> comparer) 根据列名来Distinct

    1. DistinctEqualityComparer.cs public class DistinctEqualityComparer<T, V> : IEqualityComparer ...

  5. 【20160924】GOCVHelper 图像增强部分(2)

       //填充孔洞     //fillholes     Mat fillHoles(Mat src){         Mat dst = getInnerHoles(src);          ...

  6. JAVA基础知识之JVM-——使用反射生成并操作对象

    Class对象可以获取类里的方法,由Method对象表示,调用Method的invoke可以执行对应的方法:可以获取构造器,由Constructor对象表示,调用Constructor对象的newIn ...

  7. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  8. Codeforces Round #366 (Div. 2) B

    Description Peter Parker wants to play a game with Dr. Octopus. The game is about cycles. Cycle is a ...

  9. hahaha

    [问题描述] 小Q对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目: 首先,小Q会在x轴正半轴和y轴正半轴分别挑选n个点.随后,他将轴的点 ...

  10. web错误

    “/Web”应用程序中的服务器错误. 服务器 'LD-PC' 上的 MSDTC 不可用. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误 ...