C++中的一些定义
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++中的一些定义的更多相关文章
- ArcGIS中的坐标系统定义与投影转换【转】
ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...
- 【转】+【举例】ArcGIS中的坐标系统定义与投影转换
背景知识: UTM (Universal Transverse Mercator)坐标系是由美国军方在1947提出的.虽然我们仍然将其看作与"高斯-克吕格"相似的坐标系统,但实际上 ...
- ArcGIS中的坐标系定义与转换 (转载)
原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念: GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...
- [C/C++]在头文件中使用static定义变量意味着什么
文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...
- switch的case中不能做定义
switch的case中不能做定义 只能给语句 error: a label can only be part of a statement and a declaration is not a st ...
- iOS 静态库中使用宏定义区分iPhone模拟器与真机---备用
问题描述 一般项目中,可以使用宏定义来判断模拟器还是真机,这无疑是有效的. #if TARGET_IPHONE_SIMULATOR #define SIMULATOR 1 #elif TARGET_O ...
- [转载]C++中声明与定义的区别
C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果 ...
- (转载)php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗?
(转载)http://s.yanghao.org/program/viewdetail.php?i=184313 php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗? class block ...
- Javascript Jquery 中的数组定义与操作_子木玲_新浪博客
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
随机推荐
- 各种数据库连接代码(java)
SqlServer2000 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); URL = "j ...
- Linux中文显示乱码解决
输入 echo $LANG可以查看当前使用的系统语言 查看是否有中文语言包可以在终端输入 locale命令,如有zh cn 表示已经安装了中文语言 没有则 yum groupinstall chine ...
- Linux驱动学习笔记(6)信号量(semaphore)与互斥量(mutex)【转】
转自:http://blog.chinaunix.net/uid-24943863-id-3193530.html 并发导致竟态,从而导致对共享数据的非控制访问,产生非预期结果,我们要避免竟态的发生. ...
- Distinct<TSource>(IEqualityComparer<TSource> comparer) 根据列名来Distinct
1. DistinctEqualityComparer.cs public class DistinctEqualityComparer<T, V> : IEqualityComparer ...
- 【20160924】GOCVHelper 图像增强部分(2)
//填充孔洞 //fillholes Mat fillHoles(Mat src){ Mat dst = getInnerHoles(src); ...
- JAVA基础知识之JVM-——使用反射生成并操作对象
Class对象可以获取类里的方法,由Method对象表示,调用Method的invoke可以执行对应的方法:可以获取构造器,由Constructor对象表示,调用Constructor对象的newIn ...
- 安装nginx python uwsgi环境 以及模拟测试
uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...
- 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 ...
- hahaha
[问题描述] 小Q对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目: 首先,小Q会在x轴正半轴和y轴正半轴分别挑选n个点.随后,他将轴的点 ...
- web错误
“/Web”应用程序中的服务器错误. 服务器 'LD-PC' 上的 MSDTC 不可用. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误 ...