vs2015&C++学习笔记1

从上面的++i与i++的实现看出,在C++中,对于非内建类型来说,前自增运算(++i)返回的是对象的引用,而后自增运算返回的是对象,返回对象将造成成拷贝构造函数更多的调用,所以++i的效率要高于i++。但是对于内建类型,i++与++i的效率几乎没有区别(因为内建类型没有拷贝构造函数)。于此类似的是i--和--i。(注:因为后自增运算返回的是const型对象因此后自增运算不能做左值)。

 
,cout的计算顺序是从右向左,cout的输出顺序是从左向右。

1. int i = 2;cout << i << i++ << ++i << endl; 

注意++i返回的是引用,++i是先对i值做了加法再使用;i++返回的是值,++i是先使用值再做加法。

首先按照从右往左的计算顺序得到++i => 3 (先对i值做了加法) ;i++ => 3(先使用值),i => 4(得到4是前面i++造成的),最后由于++i返回的是引用,所以最后i值是几,++i那个位置就是几,所以最终++i那个位置的值是4。因此,最后输出结果为434。

在并发时,当有一个位置A在调用静态构造函数时,会检测该静态构造函数没有被初始化,如果没有被初始化,则进行初始化,并进入同步阻塞状态,其他的位置B虽然在并发调用,但会阻寒在这里。当位置A调用完成后,阻塞状态解除,位置B进入,这时会检测到构造函数已经被初始化了,所以直接跳过。而是否有没有被初始化的标志,是设置在AppDomain(程序域)的层级上的。

所以静态构造函数非常适合用在单件模式中。我们可以看一段《CLR via C#》一书中的一段说明:

结论:静态构造函数在程序域的层级确保了只会执行一次,且是线程安全的。所以非常适合于用在单件模式中(或者只需要单一对象的地方)。

public class class1

{

  static class1(){} //仅在第一次实例化时执行(如果多线程同时访问,会确保只执行一次),并且只能是私有的(C#会自动标记为private,不允许手动标注修饰符)。

  public class1(){} //每次实例化都会执行

}

1.实例构造函数与静态构造函数执行顺序

一、初始化顺序(依次是静态变量、静态构造函数、实例变量、实例构造函数)

二、初始化次数(静态的都只会初始化一次)

三、初始化时机(使用类引用任何静态成员之前对或者首次实例化类时会调用静态构造函数,通过静态构造函数初始化类级别的项,即静态字段。非静态的则要在创建对象的时候才初始化);

2.创建子类实例时,其所有构造函数和变量的调用顺序为:

子类静态变量初始化>子类静态构造函数>父类静态变量初始化 > 父类静态构造函数 > 父类实例变量初始化>父类实例构造函数 > 子类实例变量初始化>本身实例构造函数。

二、例子:

父类:

子类:

主函数:

当我创建子类Dog的实例时,执行结果如下:

跟实例构造函数的调用顺序刚好相反,所以创建子类实例时,其所有构造函数和变量的调用顺序为:

子类静态变量初始化>子类静态构造函数>父类静态变量初始化 > 父类静态构造函数 > 父类实例变量初始化>父类实例构造函数 > 子类实例变量初始化>本身实例构造函数。

发布了25 篇原创文章 · 获赞 139 · 访问量 116万+

猜你喜欢

转载自blog.csdn.net/shenwansan_gz/article/details/105003740
今日推荐