首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么应该尽可能避免在静态构造函数中初始化静态字段?

不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义在静态构造函数中。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义在Foo中的静态构造函数会自动执行,但是定义在Bar中的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义在CLI标准ECMA-335中,静态构造函数在此标准中被称为类型初始化器(Type Initializer)或者.cctor。...,所以我们自行定义的专门用来初始化静态字段的静态构造函数是完全没有必要的。...四、关于“All-Zero”结构体 如果我们在一个结构体中显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

18810

类——构造函数之初始化列表

在前文已经说过构造函数的作用为初始化成员变量,但是真的就这么简单了吗?如果成员变量为常变量(const)那还能构造成功吗?...在构造函数体内部,我们直接可以用类的成员变量来赋值,但是在调用构造函数前是没有这个类对象的,既然都没有这个类对象,哪前面我们直接用来赋值的类中的成员变量是哪里来的?        ...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量 的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...类中包含以下成员,必须放在初始化列表位置进行初始化:         ①引用成员变量 引用变量为随机值,是一种很危险的行为(引用是由C语言的指针修改而来,本质上还是指向内存的地址)         ②const...(结果内置类型就变为了随机值),在C++11 中针对内置类型成员不初始化的缺陷,打了补丁,即:内置类型成员变量在 类中声明时可以给默认值。

88520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【小家java】java中为final变量赋值的几种方式

    被final static 修饰的变量,有两种赋值方式 在讲解之前,希望读者对静态代码块、构造代码块、构造方法的执行顺序了解清楚。...【小家java】类中静态代码块、构造代码块、静态变量执行顺序和继承逻辑 和对final修饰的变量的内存特点有所了解。【小家java】final修饰的变量真的不可变吗?...精华部分: 当类被加载进内存的时候,这个属性并没有给其分配内存空间,而只是定义了一个变量,只有当类被实例化的时候这个属性才被分配内存空间,而实例化的时候同时执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化...声明时不赋值,在constructor中赋值(最常用的方式) 声明时不赋值,在构造代码块中赋值 如果一个非final成员变量在定义的时候没有赋值,那么它只可能在构造函数里被赋值了(不考虑构造代码块的情况...(因为倘若是set方法赋值,现在是不安全的,因为set方法可以被调用多次,而final变量只能被赋值一次) 被final static修饰的变量:两种赋值方式 在定义时直接赋值.

    2.8K40

    CC++ 最常见50道面试题

    面试题 4:C 语言的关键字 static 和 C++ 的关键字 static 有什么区别 在 C 中 static 用来修饰局部静态变量和外部静态变量、函数。...(2) 由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。...面试题 19:链表和数组有什么区别 数组和链表有以下几点不同: (1) 存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。...面试题 32:C++的引用和 C 语言的指针有什么区别 指针和引用主要有以下区别: (1) 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。...面试题 38:extern 有什么作用 extern 标识的变量或者函数声明其定义在别的文件中,提示编译器遇到此变量和函数时在其它模块中寻找其定义。

    8K10

    【深入浅出C#】章节 2:数据类型和变量:变量和常量的声明和初始化

    对于实例变量和静态变量,可以在声明时使用默认值进行初始化,也可以在构造函数或静态构造函数中进行赋值操作。...3.2 直接初始化和延迟初始化的区别 在C#中,直接初始化和延迟初始化是两种不同的变量初始化方式,它们有以下区别: 直接初始化:直接初始化是在变量声明时直接给变量赋予初始值。...3.3 使用赋值运算符和构造函数进行初始化 在C#中,可以使用赋值运算符和构造函数进行变量的初始化。 赋值运算符(=):使用赋值运算符可以将一个值赋给变量。...构造函数:构造函数是一种特殊的方法,用于创建和初始化类的实例。在实例化对象时,可以调用构造函数来为对象的成员变量赋初始值。...Tip:只读变量只能在声明时或构造函数中进行初始化,且不能在其他方法中修改其值。如果需要在运行时动态确定变量的值,应该使用可变的实例字段而不是只读变量。

    61020

    面试中常见的 C 语言与 C++ 区别的问题

    来源:公众号(c语言与cpp编程) C和C++的区别 C语言是一种结构化语言,其偏重于数据结构和算法,属于过程性语言 虽然在语法上C++完全兼容C语言,但是两者还是有很多不同之处。...下面将详细讲解C和C++不同之处的常见考题 关键字static在C和C++区别 C和C++中都有关键字static关键字,那么static关键字在C和C++中的使用有什么区别?请简述之。...定义局部静态变量 局部静态变量存储在静态存储区,在程序运行期间都不会释放,只在声明时进行初始化,而且只能初始化一次,如果没有初始化,其自动初始化为0或空字符。...C++引用和C的指针有何区别 分析问题:引用就是变量或对象的别名,它不是值,不占据存储空间,其只有声明没有定义。在C++中引用主要用于函数的形参和函数返回值。...如下所示: 答案 指针和引用主要有以下区别: 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化以后不能被改变,指针可以改变所指的对象。

    92251

    【C++ 初阶路】--- 类和对象(末)

    二、再谈构造函数 2.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...于是找到了对象实例化必须调用的构造函数,但如果在构造函数体中的话,可能出现多次初始化的情况。 最后规定了初始化列表这一概念!其是每个成员变量定义初始化的位置!...如上如所示 在构造函数体中的是赋值修改!...我们前面讲的在声明时给缺省值,其实那个缺省值就是给初始化列表用的! 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

    8010

    面试中常见的C语言与C++区别的问题

    其本质区别是解决问题的思想方法不同 虽然在语法上C++完全兼容C语言,但是两者还是有很多不同之处。...下面将详细讲解C和C++不同之处的常见考题 关键字static在C和C++区别 C和C++中都有关键字static关键字,那么static关键字在C和C++中的使用有什么区别?请简述之。...定义局部静态变量 局部静态变量存储在静态存储区,在程序运行期间都不会释放,只在声明时进行初始化,而且只能初始化一次,如果没有初始化,其自动初始化为0或空字符。...C++引用和C的指针有何区别 分析问题:引用就是变量或对象的别名,它不是值,不占据存储空间,其只有声明没有定义。在C++中引用主要用于函数的形参和函数返回值。...指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化以后不能被改变,指针可以改变所指的对象。 不存在指向空值的引用,但是存在指向空值的指针。

    1.1K30

    类的成员函数总结

    前言: 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...在创建对象时,编译器通过调用构造函数,给对象中的各个成员变量一个合适的初始值。 虽然上述构造函数调用后,随想中已经有一个初始值,但是不能将其称为对对象中成员变量的初始化。...注意初始化列表可以和函数体内初始化混合使用,如果有成员变量没有在初始化列表显示定义,他们也会定义。如果是内置类型会去默认给的随机值;如果是自定义类型,会去调用他的默认构造函数。...因为初始化列表定义的顺序跟成员变量声明的顺序一致。在private中_a2是先声明,所以在初始化列表中先给_a2进行定义,因此就是随机值!!!...成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的顺序无关~ 二、析构函数: 1、概念 与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。

    6510

    类和对象竟是这样的(下集)

    一.初始化列表 其实大家可能会问,诶前面不是讲了有构造函数这个东西吗?为什么又要搞一个初始化列表出来。...其实根据其名字可以知道初始化列表是用来初始化的,在构造函数中,其实并不能算是初始化,只能算赋值,因为构造函数可以多次调用,而初始化只能一次。...(只能初始化一次) (2)下面几种情况的成员变量只能用初始化列表初始化: a.引用成员变量 b.const修饰的成员变量 c.自定义类成员变量(且该类没有默认构造函数) class A {...因为在声明时按照的是_a2,_a1的顺序来的,而在初始化列表中是_a1,_a2的顺序来的,按照我们的说法,应该是按照生命的顺序来初始化,所以先初始化_a2,此时_a1还是随机值,所以_a2就是随机值。...return n; } }; int main() { A aa1; // 不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义 //A aa1(); // 但是我们可以这么定义匿名对象

    8510

    C++初阶-类和对象下

    ,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(该类没有默认构造函数) 注:我们都知道创建引用变量和const变量是必须初始化的,对于类来说...,其引用变量和const变量成员必须在初始化列表进行初始化 示例: class A { public: A(int a,int b)//是构造函数,但不是默认构造函数,不会在没有参数的时候进行调用...,再走函数体赋值 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 示例: class A { public: A(int a) :_a1(a) ,...可以,静态成员函数为所有类对象所共享 示例: 三、C++11 新式成员初始化 概念: C++11支持非静态成员变量在声明时进行初始化赋值,但是要注意这里不是初始化,这里是给声明的成员变量缺省值...注意: 友元关系是单向的,不具有交换性 示例:Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行

    37830

    探索C++的奥秘之类和对象(下)

    再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 一个类要初始化成员变量有两种方式,第一种方式叫做函数体赋值,还有一种叫做初始化列表 class...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...初始化列表代替的是函数体内赋值,建议以后还是用初始化列表去初始化。...成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。...友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。

    3100

    【C++初阶】类和对象终极篇

    三.再谈构造函数之初始化列表 学会这一节,你将知道成员变量是在初始化列表中被定义的和在某三种成员变量必须在初始化列表中初始化的....首先我们知道类实例化出对象是在主函数中完成的(对象是整体定义的,但是并没有定义一个一个的成员变量),但是对象中的成员变量是在哪里被定义的呐? 实际上,所有的成员变量都要在初始化列表中定义....) 成员变量是引用类型(且声明时没有给缺省值) 成员变量是const修饰的(且声明时没有给缺省值) 成员变量是自定义类型(且它没有自己的默认构造函数) 回忆: 1.const类型的变量必须在定义的时候就初始化...对成员变量分类: 内置类型:如果给了成员变量的缺省值,对象的默认构造函数就会在对象的默认构造函数的初始化列表中使用声明时给的缺省值,如果没给,就会时随机值 自定义类型:如果给了成员变量的默认构造函数...你没有在初始化列表进行初始化,编译器还是要走初始化列表,所以干脆一气呵成. 规则: 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后 次序无关.

    23150

    C++的六大“天选之子“之“构造“与“析构“

    (1) 自动生成的"构造函数" 构造函数编译器会自动调用,那我们不写构造函数会怎样呢? 下面这段代码会报错吗?...Date类我们没有写构造函数,但是编译器自动生成了一个隐藏的构造函数并且对自定义类型(这里是Time类)会调用自己的构造函数,所以Time类中的成员已经初始化了. (2) 自定义"构造函数" 前面提到,...内置类型,默认构造函数是不进行处理的,而这显然是设计的不合理的,所以在C++11中,打了个补丁,内置类型成员变量在类中声明时可以给默认值(缺省值),记住这里是默认值,并不是真的存储变量,因为声明是没有空间存储变量的...(为了解决满足多样的初始化要求) 默认构造函数是对内置类型不进行处理,C++11中,打了个补丁,内置类型成员变量在类中声明时可以给默认值(缺省值) 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数...构造函数名与类名相同,那析构函数呢? 析构函数名是在类名前加上字符 ~。

    16320

    PLSQL 集合的初始化与赋值

    因此集 合类型集合的声明、赋值、初始化较之单一类型而言,有很大的不同。尤其是嵌套表与变长数组,在赋值之前必须先初始化。当嵌套表和变长数 组在声明时,它们都会自动地被设置成NULL值。...可以使用系统定 义的与集合类型同名的函数来初始化集合。我们必须显式地调用构造函数为每一个变长数组和嵌套表变量进行初始化操作(对于关联数组来说, 是不需要使用构造函数进行初始化的)。         ...3、集合类型的初始化方法是是直接使用声明时的同名类型构造器来对集合进行初始化。 4、集合类型的初始化方法有多种,可以在声明时初始化,也可以在执行块初始化。...5、集合类型的赋值可以在声明块声明时赋值,也可以在执行块执行时使用extend方式扩展后再赋值。 6、集合类型的初始化过程连同赋值可以在声明集合的同时使用构造函数直接进行初始化并赋值,从而一步完成。...7、SQL语句中也需要使用构造函数来操作集合数据。 8、注意本文描述中的集合初始化后为空的理解。初始化后为空表示的是一个空(empty)集合,而未初始化时是NULL(UNKNOWN)值。

    2.3K50

    static、const、readonly与static readonly的区别与联系

    1、const修饰符 初始化时机:编译时,即编译程序时将值已经嵌入代码中; 值状态:不允许动态修改 修饰范围:字段、局部变量 主要应用场景:主要应用于程序运行中不需要改变的变量的值,比如数学符号PI;...2、static修饰符 初始化时机:运行时,可以声明时赋值,也可以在构造函数,或使用时赋值 值状态:允许修改 修饰范围:类、字段、属性、方法、运算符、事件、构造函数(不能用于索引器、析构函数或类以外的类型...) 主要应用场景:主要作用于类的公共属性 3、readonly修饰符 初始化时机:运行时,可以声明时赋值或在类中的构造函数中赋值 值状态:允许修改,但只能在构造函数中修改 修饰范围:字段 主要应用场景:...主要作用于实例化的对象的只读属性 4、static readonly修饰符 初始化时机:运行时,是两个关键字的组合 值状态:允许修改,声明时赋值或者静态构造函数中赋值 修饰范围:字段 主要应用场景:第一...readonly是运行时变量,可以在声明的时候或在构造函数内赋值。 static readonly变量就变成了静态的、编译期变量。 只能静态构造函数中进行初始化。

    1.5K30

    【C++入门篇】保姆级教程篇【下】

    其实我们上面的运算符重载还是有些问题,运算符重载函数传参使用的是类的类型,所以在调用运算符重载函数的时候,会先调用拷贝构造。...三、再谈构造函数 还记得我们的构造函数吗,我们前面说构造函数是为了进行初始化,给各个对象中各个成员变量一个合适的初始值。...,虽然在调用构造的时候会给一个初始值,但不能将其称为类对象成员的初始化,构造函数体中的语句只能将其称为赋初值,而不能称为初始化,因为 初始化只能初始化一次,而构造函数体内 可以多次赋值。...既然我们不能使用普通成员变量,那我们不妨使用全局变量count来对类创建对象进行计数,创建对象在类中无非是调用构造函数与拷贝构造,我们只需要在构造和拷贝构造函数内将count+1就行了。...const &d); 友元函数可以 直接访问类的 私有成员,它是 定义在类外部的 普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加 friend关键字

    14610

    【C++】踏上C++学习之旅(十):深入“类和对象“世界,掌握编程黄金法则(五)(最终篇,内含初始化列表、静态成员、友元以及内部类等等)

    前言 本文是"类和对象"系列的最终篇,在本系列之前的文章中,给大家讲解了类和对象的六大默认成员函数,其中构造函数、析构函数、拷贝构造函数以及赋值运算符重载,这四个成员函数比较常用。...1.1 函数体内赋值 这个是我们在刚开始学习构造函数时,经常使用的一种对于对象中给成员变量赋值的写法。...虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...而赋初值是指这个变量在声明之后才开始赋值。区别就在于这个变量被赋值的时候是相对于声明时还是声明后,这样的一个时间节点。...: const int _a; char& _ref; }; 大家如果自己编译这段代码它是会报错的,原因就在于无论是const修饰的变量还是引用都有一个共同的特点,就是在变量创建之初必须初始化。

    10110

    【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)

    当然,对于普通成员,我们也可以在声明时赋缺省值,但是相比显示写在初始化列表当中,会有一些效率的损耗。 注:对类类型的成员变量通过初始化列表进行初始化时,本质也是在调用它的构造函数。...如果我们既没有显示地在初始化列表对成员进行初始化,也没有在声明时赋缺省值,那么对于内置类型的成员,当对象被创建时编译器一般不会对其初始化;对于自定义类型的成员,对象被创建时就会调用它的默认构造函数,如果没有默认构造函数...静态成员变量要在类中进行声明,并且初始化必须要在类外,而不是类中(因为在类中给的初值是给初始化列表的,而静态成员变量不走初始化列表)。...并且在多个文件的程序中,如果类是在头文件中定义的,则静态成员变量必须在其他cpp文件中初始化,否则容易出现重定义问题。...特殊情况:对于有const修饰的整形静态成员变量,可以在类中同时进行声明和初始化。

    12910

    C# 学习笔记(11)—— C# 的春天

    ) 变量在声明时必须被初始化,因为编译器要根据变量的赋值来推断类型,如果未被初始化,编译器也无法完成推断了。...C# 是静态语言,变量类型位置就会出现编译时错误 变量不能初始化为 null,因为 null 可以隐式地转换为任何引用类型或可空类型,编译器将不能推断出该变量到底为什么类型 不能用 var 来声明方法中的参数...在 C# 3.0 之前定义类,你往往需要定义多个构造函数来完成不同情况下的初始化。...C# 3.0 提供了对象初始化器,它减少了我们在勒中定义的构造函数代码,从而使代码更加简洁。...C# 3.0 引入对象初始化器之后,你就不需要定义多个构造函数了,上面代码可以简化为一下的形式: class Program { static void Main(string[] args)

    18010
    领券