一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

c 值类型和引用类型详解

时间:2011-05-28 编辑:简简单单 来源:一聚教程网

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

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

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

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

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

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

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

void ifsreamToVector(ifstream & fin,vector &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

热门栏目