C++转C#的一些误区

1、new操作符

刚开始写C#代码的时候就会发现这样一个问题,如下代码会报错:

        static void Main(string[] args)
        {
            int a;
            Console.WriteLine(a);
        }
C++中会默认为局部变量赋初始值,C#则不会,如果我就是不想赋初始值或者感觉没有合适的初始值给它怎么办呢,可以使用int a = new int(); 那么这时候问题就来了,C++中new表示在堆中分配内存,这里的int是不是呢,答案是否定的,因为

所有的值类型对象永远只在栈中分配,即使你对值类型使用了new ;同样所有引用类型对象永远只在堆中创建。

调试界面:

明显a,b的内存地址是连续的,都在栈中,c也与他们连续,但它存的是一个地址,但貌似也不完全对应数组首个元素的位置,不知道是否还有其他原因,有知道的大神还望不吝赐教。

2、C#的类没有默认复制构造函数
    class Class1
    {
        public int a = 1;
    }
 
    Class1 c1 = new Class1();
    Class1 c2 = c1;
    c2.a = 2;

C++中如上代码并不会修改c1中a的值,C#中却会,因为C#中的引用类型的对象都是按引用传递且只能按引用传递。而值类型对象(或者称为变量),通常情况下是按值传递的。

3、有些要复制的类怎么办?
自定义复制构造函数和实现ICloneable接口是常见的方法,但其根本是应在设计类之前考虑好应该使用类还是结构体,对于存储数值的需求,结构体更适合,而且C#中的结构体和类更加接近,也不再像C++中默认成员变量为公有,而它们的区别就是: C#中的struct是值类型的,而class是引用类型的。


4、类声明中成员变量可以赋初始值

C++在类声明中只有static const int类型可以直接赋值初始化(相当于定义了一个枚举变量),其实在这一点C++的逻辑更为清晰,类的声明只告知编译器如何创建类,也就是如何分配内存,但并未实际分配内存。所以不能在声明中直接对成员变量赋值,而对于静态类成员,虽然其独立存储,但C++中类声明位于头文件中,其它文件要使用这个类,就要包含该类的头文件,那么连接时,就会重复初始化,引发错误。

但另一方面,处理实际问题时,通常应初始化所有的对象,以确保成员一开始就有已知的、合理的值,在C++中就需要在构造函数中对成员变量逐一赋初始值,这一点对程序员来说可能有点不太友好,而且C#并没有头文件一说,所以C#编译器会自动将声明中赋值语句放到构造函数中,本质似乎没变呢。

猜你喜欢

转载自blog.csdn.net/chrisxiaoniu/article/details/80867502
今日推荐