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& ...
随机推荐
- hide your website's wordpress info/path/way
Hide Wordpress Info of your website plugin hide-wp 使用apache语句和wp方法重写 但这个插件有个局限就是,你的网站使用的wordpress的话, ...
- React Native微信分享 朋友圈分享 Android/iOS 通用
超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用 2016/06/16 | React Native技术文章 | Sky丶清| 暂无评论 | 1 ...
- Oracle 单行函数
一.什么是函数 任何东西,只要它能接收输入,对输入进行加工并产生输出,它就可以被称为函数. 二.单行函数简介 单行函数只对表中的一行数据进行操作,并且对每一行数据只产生一个输出结果.单行函数可以接受一 ...
- 20145227《Java程序设计》课程总结
20145227<Java程序设计>课程总结 每周读书笔记链接汇总 20145227 <Java程序设计>第1周学习总结 20145227 <Java程序设计>第2 ...
- cookie学习
cookie是储存于访问者的计算机中的变量,每当同一台计算机通过浏览器请求某个页面时,就会发送这个cookie,可以使用javascript来创建和取回cookie的值. 创建和存储cookie 首先 ...
- 每日一九度之 题目1030:毕业bg
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2046 解决:894 题目描述: 每年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为“bg”.参加不同团体的b ...
- ACM题目————滑雪
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- ACM题目————列变位法解密
这是在百度之星看到的. Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐 ...
- ip地址定位库
ip2region 1.2.1 发布了,新增 Python 内存查询+数据文件更新. 准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java, php, c, ...
- 自用java字符串工具类
不断封装一些常用的字符串操作加到这个工具类里,不断积累: package com.netease.lede.qa.util; import java.text.ParseException; impo ...