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