引用类型

C++:浅谈右值引用

心不动则不痛 提交于 2019-11-30 06:35:21
1.什么是左值和右值? C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。左值表示存储在计算机内存的对象,而不是常量或计算的结果。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。 简单来说就是,左值相当于地址值,右值相当于数据值。右值指的是引用了一个存储在某个内存地址里的数据。 左值右值翻译: L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address. R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language. 左值和右值是相对于赋值表达式而言的。左值是能出现在赋值表达式左边的表达式。左值表达式可以分为可读写的左值和只读左值。右值是可以出现在赋值表达式右边的表达式,他可以是不占据内存空间的临时量或字面量,可以是不具有写入权的空间实体。如 int a=3; const int b=5; a=b

CLRCore(CLR核心机制)

偶尔善良 提交于 2019-11-30 05:49:11
JIT--第一次--标记已--存根--调用--查找存根--执行机器码 C#和CIL的关系: C#和N#都是CIL实现,但是彼此不能互通: C#和N#公开不分满足规范,我们才能互通 CLS就是描述多语言互通的规范 内存分配:线程栈   堆Heap:     一个程序运行时,该进程存放引用类型变量的一块内存,全局唯一!只有一个堆   栈Stack:     数据结构,先进后出,线程栈,一个线程存放变量的内存(一个线程有一个)   值类型分配在栈上,比如结构、枚举、int等   引用类型分配在堆上,比如类、接口、委托等 引用类型   1、调用new的时候,就会去栈上开辟内存,创建实例。这就是为什么在构造函数中跨域使用this   2、把实例的引用传递给构造函数   3、执行构造函数   4、返回引用 装箱拆箱 int i=3; obect obj=i;//装箱 int k=(int)obj;//拆箱 引用类型在哪里?值类型在哪里?   值类型的值,会随着对象的位置存储。引用类型的值,一定在堆里面。值类型的长度是确定的,引用类型的长度是不确定的,只有堆才能放各种值。   下面有一个例子: public class MyTest { private int x; public MyTest(int n) { this.x=n; } } MyTest t=new MyTest(3);/

01 基本类型的赋值与引用类型赋值的区别

亡梦爱人 提交于 2019-11-30 04:30:44
var a=10; var b=a; console.log("a的值是",a) console.log("b的值是",b) //总结: 基本类型的赋值 是把变量a的值 赋值一份给b var obj1={name:"张三",age:45}; var obj2=obj1; obj2.name="李四"; console.log("obj1的对象是",obj1) //obj1的对象是 {name: "李四", age: 45} console.log("obj2的对象是",obj2) //obj2的对象是 {name: "李四", age: 45} //引用类型变量的赋值,是地址的拷贝,它是把obj1的地址拷贝给了obj2, //所以基本类型赋值的是值 //引用类型赋值的是地址 来源: https://www.cnblogs.com/IwishIcould/p/11560135.html

基本类型传递值与引用类型传递值的区别

此生再无相见时 提交于 2019-11-30 04:30:34
var username="小明"; function fn1(name){ name="小强"; } fn1(username); console.log(username) //输出 小明 // 分析:基本类型传递是按照值来传递的 // 如果传参是基本数据类型, 传入函数后,都会变成局部对象,所以对局部对象的修改,对原始值没有影响 // 而这个局部对象 也会在函数执行完毕后,立刻被销毁。 var user={name:"小红"}; function fn2(obj){ obj.name="大红"; } fn2(user); console.log(user) //输出 {name: "大红"} //分析:引用类型是按照地址传递的。 /* 如果传参是 引用类型 ,传入函数后, 函数实参对传入对象有一个引用 即(函数内所有的修改都是对引用对象的修改 所以user对象的值会发生改变) */ 来源: https://www.cnblogs.com/IwishIcould/p/11560139.html

c# 泛型study

拈花ヽ惹草 提交于 2019-11-30 02:50:40
1.引用类型约束: 类型实参包含任何类,接口,数组,委托,或者是已知是引用类型的另一个类型参数 class demo<T> where T:class 有效的封闭区间demo<String>;demo<int[]>;demo<person>;demo<IDisposable> 无效的封闭区间demo<int> 2.值类型约束:包含值类型,包括枚举 enum。但是他将可空类型排除在外int? class demo<T>where T:struct 有效的封闭区间demo<int>; demo<enumDemo> 无效的封闭区间demo<int[]> ;demo<object> ;demo<StringBuild> 3.构造函数类型约束:无参构造函数约束 泛型方法demo Public T demo<T>() where T:new() { return T() } 4 转换类型约束:类型实参必须可以通过一致性,引用或者装箱转换隐式的转换成该类型 class demo<T> where T:int demo<int> ;一致性转换 class demo<T> where T:IDisposable demo<SqlConnection> 引用转换 public class demo<T> where T:IComparable<T> demo<int> demo<float> 装箱转换

CLR基础 - 基元类型、值类型和引用类型

雨燕双飞 提交于 2019-11-30 01:46:38
编程语言的基元类型 某些数据类型如此常用,以至于许多编辑器允许代码以简化语法来操纵它们。没简化之前的代码如下所示: System.Int32 a = new System.Int32(); 简化之后的代码如下: int a =0; 编译器直接支持的数据类型称为 基元类型。 基元类型直接映射到 Framework 类库( FCL)中存在的类型。表 5-1 列出了FCL 类型在 C# 中有的基元类型。只要符合公共语言规范(CLS)的类型,其他语言都提供了类似的基元类型。 checked 和 unchecked C#允许程序员自己决定如何处理溢出。溢出检查默认关闭。如果想让C# 编译器控制溢出的一个办法是使用 /checked+ 编译器开关。这样生成的代码会稍慢一些,因为CLR 会检查这些运算,判断是否发生溢出。如果发生溢出则抛出 OverflowException 异常。 除了全局性的打开和关闭溢出检查,程序员还可以在代码的特定区域控制溢出检查。如下所示使用 了checked 和 unchecked 操作符来提供这种灵活性。 UInt32 invalid = unchecked((UInt32) (-1)); 引用类型和值类型 引用类型从托管堆中分配,C#的new 操作符返回对象内存地址—— 即指向对象数据的内存地址。使用引用类型注意以下4 点: 内存必须从托管堆中分配

Java字符和字符串

时光总嘲笑我的痴心妄想 提交于 2019-11-30 00:57:11
在Java中,字符和字符串是两个不同的类型。 字符类型 字符类型char是基本数据类型,它是character的缩写。一个char保存一个Unicode字符: 因为Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可: 还可以直接用转义字符\u+Unicode编码来表示一个字符: 字符串类型 和char类型不同,字符串类型String是引用类型,我们用双引号"…“表示字符串。一个字符串可以存储0个到任意个字符: 因为字符串使用双引号”…"表示开始和结束,那如果字符串本身恰好包含一个"字符怎么表示?例如,“abc"xyz”,编译器就无法判断中间的引号究竟是字符串的一部分还是表示字符串结束。这个时候,我们需要借助转义字符\: 因为\是转义字符,所以,两个\表示一个\字符: 常见的转义字符包括: " 表示字符" \’ 表示字符’ \ 表示字符\ \n 表示换行符 \r 表示回车符 \t 表示Tab \u### 表示一个Unicode编码的字符 例如: 字符串连接 Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。例如: 如果用+连接字符串和其他数据类型

深浅克隆面试题汇总——附详细答案

有些话、适合烂在心里 提交于 2019-11-29 23:40:51
在开始学习深克隆和浅克隆之前,我们先来看下面代码,有什么问题? class CloneTest { public static void main(String[] args) throws CloneNotSupportedException { // 等号赋值( 基本类型) int number = 6; int number2 = number; // 修改 number2 的值 number2 = 9; System.out.println("number:" + number); System.out.println("number2:" + number2); // 等号赋值(对象) Dog dog = new Dog(); dog.name = "旺财"; dog.age = 5; Dog dog2 = dog; // 修改 dog2 的值 dog2.name = "大黄"; dog2.age = 3; System.out.println(dog.name + "," + dog.age + "岁"); System.out.println(dog2.name + "," + dog2.age + "岁"); } } 程序执行结果: number:6 number2:9 大黄,3岁 大黄,3岁 可以看出,如果使用等号复制时,对于值类型来说

深浅克隆面试题汇总——附详细答案

不羁的心 提交于 2019-11-29 23:38:54
在开始学习深克隆和浅克隆之前,我们先来看下面代码,有什么问题? class CloneTest { public static void main ( String [ ] args ) throws CloneNotSupportedException { // 等号赋值( 基本类型) int number = 6 ; int number2 = number ; // 修改 number2 的值 number2 = 9 ; System . out . println ( "number:" + number ) ; System . out . println ( "number2:" + number2 ) ; // 等号赋值(对象) Dog dog = new Dog ( ) ; dog . name = "旺财" ; dog . age = 5 ; Dog dog2 = dog ; // 修改 dog2 的值 dog2 . name = "大黄" ; dog2 . age = 3 ; System . out . println ( dog . name + "," + dog . age + "岁" ) ; System . out . println ( dog2 . name + "," + dog2 . age + "岁" ) ; } } 程序执行结果:

线性表的定义和基本操作

妖精的绣舞 提交于 2019-11-29 19:29:57
线性表的定义 提到线性这个词,并不陌生,在 数据结构的基本概念 中学过线性的逻辑结构。线性逻辑结构是一对一关系,结点之间排成了一列或者一行,所以说 线性表也是一种逻辑关系 。有了对线性表的认知,那么来看一下它的概念: ​ 线性表 是具有 相同类型 的 n (n>=0) 个元素的 有限序列 ,其中 n 为表长,当 n=0 时,该表为空表。 为什么要相同类型?计算机在处理大量数据的时候,把相同的数据元素称作为数据对象。往往要处理相同的数据元素,也就处理一种数据对象。不会把音频和图片杂糅到一起进行处理。也不会把抽象事物,比如说人和汽车组合到一起进行处理。因为这样没有意义,也没有高的效率。 对于相同类型,在接下来所学到的所有的数据结构中都有这样的要求。因为具有相同类型的数据结构,它在解决实际问题,实现算法时,才更加的有意义。其次,对于这个类型的范围,它的定义其实并不狭隘,并不仅仅局限于我们常见的类型,比如说整型、浮点型这样的类型。对于从实际生活中抽象出来的类型,比如说一本书、一个人也是可以作为一个元素的。它与 C++ 中的面向对象的类比较相似。 除了相同类型,定义中还有一个比较重要的点,那就是是有限序列。什么是有限?就是说明该线性表的长度是有限的,因为计算机无法处理无限多的数据。第二个是序列,根据下面的表示方法可以发现,线性表中每一个元素都是有序号的,序列的意思就是有序号的一种排列