c 值类型和引用类型详解

非引用形参通过用实参的副本初始化形参,修改形参的值,不会影响实参的值,然而复制实参并不是在所有的情况下都适合,不适宜复制实参的情况包括:

l 当需要在函数中修改实参的值时

l 当需要以大型对象作为实参传递时。对实际的应用而言,复制对象所付出的时间和存储空间代价往往过大

l 当没有办法实现实参的复制时。

对第一种情况很常见,而第二种情况,则是为了性能必须要考虑进去的,比如下面的一段程序,就把形参用成了引用类型,是因为我这个程序是要把ifstream的内容复制到vector中,然而ifstream读入的是一个很大的文件,可能有10MB那么大,当然最后生成的vector也会有10MB的大小,如果采用传统的用拷贝参数传递ifstream,然后用一个临时的vector保存内容,最后再返回vector的副本时,可见浪费了很多的时间,和空间。

当然本程序不想修改实参ifstream的值,这时候,把形参声明称const的类型即可,它是可以接受非const的实参的

 //函数作用,将ifstream的内容放到vector里面,其中hasOtherValue表示是否一行中,除了原词,还有词频和词性

void ifsreamToVector(ifstream & fin,vector<string> &v,bool hasOtherValue=true){
    v.clear();
    string str;//存放词语

    if(hasOtherValue){
        //说明一行中,除了原词,还有词频和词性
        int itmp;//存放词频
        string stmp;//存放词性   
        while(fin>>str>>itmp>>stmp){
            v.push_back(str);
        }
    } else {
        while(fin>>str){
            v.push_back(str);
        }
    }
}

这些问题不是在做网站时使用在哪,而是一些的基本概念。。。
值类型和引用类型的区别就是在赋值和作为参数传递时。。。
赋值时,值类型是赋值一个全新的变量出来(即复制),而引用类型则只是将地址赋值给新的对象。
参数传递时,值类型是把参数值进行传递,而引用类型则是把地址传过去作为参数。
下面的例子。。。
//值类型赋值。

public void valuttype()
{
int a=10;
int b=a;
b=20;
Console.WriteLine("a={0},b={1}",a,b);
}
可以看到输出结果为a=10,b=20。
//类类型赋值。
public class Test
{
    int a;
    public int A
    {
        get
        {
            return a;
        }
        set
        {
            a=value;
        }
    }
}

public void classtype()
{
    Test t=new Test();
    t.A=10;
    Test t1=t;
    t1.A=20;
    Console.WriteLine("t.A={0},t1.A={1}",t.A,t1.A);
}
输出结果是:t.A=20,t1.A=20;
//参数的例子。
public void Test()
{
    int a=10;
    Test t=new Test();
    t.A=10;
    Parameter(a,t);
    Console.WriteLine("Test:a={0},t.A={1}",a,t.A);
}

public void Parameter(int a,Test t)
{
    a=20;
    t.A=20;
    Console.WriteLine("Parameter:a={0},t.A={1}",a,t.A);
}

输出结果是:
Parameter:a=20,t.A=20
Test:A=10,t.A=20

以上就是值类型和引用类型的区别。

接口,最好的体现了类的继承,封装和多态的特性。

interface IFruit
{
    void MyName();
}

class Apple: IFruit
{
    // Explicit interface member implementation:
    void IFruit.MyName()
    {
        // Method implementation.
        Console.WriteLine("MyName is Apple");
    }
}

class Orange: IFruit
{
    // Explicit interface member implementation:
    void IFruit.MyName()
    {
        // Method implementation.
        Console.WriteLine("MyName is Orange");
    }
}

public class Test
{
    static void Main()
    {
        // Declare an interface instance.
        IFruit obj = new Apple();

        // Call the member.
        obj.MyName();
        obj=new Orange();
        obj.MyName();
    }
}

输出:
MyName is Apple
MyName is Orange

时间: 2024-09-28 22:12:53

c 值类型和引用类型详解的相关文章

Javascript中值类型和引用类型详解

Javascript变量类型 值类型: 字符串.数字.布尔.Null.Undefined 引用类型: 数组.对象.函数 值类型与引用类型的比较 通过两个实例来比较这两种类型 (调试环境: Chrome 开发者工具 Console) 值类型实例 var a = 'hello'; var b = a; b;          /* hello */ a = 'world'; b;          /* hello */ 值类型的变量赋值过程,其实是分配了一块新的内存空间,值相同但两者互不干扰 引用

深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解

 这篇文章主要介绍了深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解,本文讲解了一般理论.按值传递.按引用传递.按共享传递(Call by sharing).按共享传递是按值传递的特例等内容,需要的朋友可以参考下     介绍 本章,我们将讲解在ECMAScript向函数function传递参数的策略. 计算机科学里对这种策略一般称为"evaluation strategy"(大叔注:有的人说翻译成求值策略,有的人翻译成赋值策略,通看下面

.NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱

内容导读 •概述 •当你声明一个变量背后发生了什么? •堆和栈 •值类型和引用类型 •哪些是值类型,哪些是引用类型? •装箱和拆箱 •装箱和拆箱的性能问题一.概述 本文会阐述六个重要的概念:堆.栈.值类型.引用类型.装箱和拆箱.本文首先会通过阐述当你定义一个变量之后系统内部发生的改变开始讲解,然后将关注点转移到存储双雄:堆和栈.之后,我们会探讨一下值类型和引用类型,并对有关于这两种类型的重要基础内容做一个讲解. 本文会通过一个简单的代码来展示在装箱和拆箱过程中所带来的性能上的影响,请各位仔细阅读

值类型与引用类型(中)

本文将介绍以下内容: 类型的基本概念  值类型深入 引用类型深入 值类型与引用类型的比较及应用    1. 引言 上回[第八回:品味类型---值类型与引用类型(上)-内存有理]的发布,受到大家的不少关注,我们从内存的角度了解了值类型和引用类型的所以然,留下的任务当然是如何应用类型的不同特点在系统设计.性能优化等方面发挥其作用.因此,本回是对上回有力的补充,同时应朋友的希望,我们尽力从内存调试的角度来着眼一些设计的分析,这样就有助于对这一主题进行透彻和全面的理解,当然这也是下一回的重点. 从内存角

index-lua的元表怎么遍历不到,而且为什么也不能改变表中的元素的值呢,求详解?

问题描述 lua的元表怎么遍历不到,而且为什么也不能改变表中的元素的值呢,求详解? local function tab(t) local proxy = {} local mt = { __index = t, __newindex = function(t, k, v) error("attempt to update readonly a table") end } setmetatable(proxy, mt) return proxy end local days = tab

C#高级编程阅读笔记一(关于值类型和引用类型)

笔记|编程|高级 数据在内存中的存储位置,取决于它的数据类型,在C#中,分为值类型和引用类型,值类型的数据存储在内存中的堆栈中,每个变量或程序都有自己的堆栈,不可以共用一个堆栈地址.当数据一个值类型的变量传递到另一个相同类型的变量时,会在堆栈中分配两个不同的地址. 而引用类型的数据存储在内存中的堆中,可以不同的变量或程序共同使用同一个位置的数据.当数据从一个引用类型的变量传递到另一个相同类型的变量时,只是把这个变量的引用地址传递给新的变量,同时引用当前堆中存储的数据. 可以通过实例得到详细结论:

C#基础(四)(C#预定义值类型和引用类型)

一.预定义类型. 1.值类型和引用类型 C#中的数据类型,可以分为值类型和引用类型,值类型存储在堆栈上,而引用类型存储在托管堆上. 如下代码示例, int i=10; int j=i; i和j的值都是10,并且在内存中会有两个地方存储10. 再看下面的代码 Vector x=new Vector(); x.Value=20; Vector y=x; Console.WriteLine(y.Value); y.Value=50; Console.WriteLine(x.Value); Vector

C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

1.C#类和接口的区别 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于: 抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化. 但接口是一个行为的规范,里面的所有东西都是抽象的! 一个类只可以继承一个基类也就是父类,但可以实现多个接口 PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现

高阶Java-Java枚举类型enum应用详解

java的Enum枚举类型终于在j2se1.5出现了.之前觉得它只不过是鸡肋而已,可有可无.毕竟这么多年来,没有它,大家不都过得很好吗?今日看<Thinking in Java>4th edition,里面有一句话"有时恰恰因为它,你才能够"优雅而干净"地解决问题.优雅与清晰很重要,正式它们区别了成功的解决方案与失败的解决方案.而失败的解决方案就是因为其他人无法理他."使用Enum枚举类型,可以将以前笨拙的代码变得优雅简单?但是,我同时也在思考另外一个问