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

【Kotlin】类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

文章目录 一、主构造函数定义临时变量 二、主构造函数中定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- 在 Kotlin 类中 , 可以在 类声明 时 在 类名后...定义 " 主构造函数 " ; 在 主构造函数 中 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 在 主构造函数 中 , 可以定义 临时变量 , 临时变量 一般使用 以下划线为开头 的名称...---- 在主构造函数中 定义临时变量 , 格式为 : class 类名(_临时变量名: 临时变量类型){} 在主构造函数中也可以 定义成员属性 , 格式为 : class 类名(var 成员属性名:...---- Kotlin 类只允许 在定义类时 定义 一个主构造函数 , 在其中可以定义 临时变量 , 也可以定义 属性变量 ; 次构造函数 定义在 Kotlin 内部 , 可以定义 多个 次构造函数..., 可以不为其传递 值参 , 构造函数中跳过该参数 , 其 后面的参数需要使用 参数名 = 参数值 进行赋值 ; 代码示例 : class Hello( // 主构造函数, 直接在主构造函数中定义属性

4.9K20

七、构造函数与析构函数

构造函数可以抛出异常,但通常建议避免在构造函数中抛出异常,因为这可能导致资源泄漏或其他问题。 构造函数可以是虚函数(在基类中),但通常不建议这样做,因为虚函数主要用于在派生类中重写基类中的函数。...如果类中有动态分配的资源,那么应该在析构函数中释放这些资源,以避免内存泄漏。 析构函数可以是虚函数,这在处理基类指针指向派生类对象(多态)时非常重要。...调用顺序: 在创建派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。 如果在类定义中显式地指定了初始化列表中的基类或成员变量初始化顺序,则按照指定的顺序进行初始化。...特点: 如果在类中未显式定义任何构造函数,编译器会自动生成一个无参的默认构造函数。 一旦用户显式定义了构造函数(无论是否有参数),编译器将不再自动生成默认构造函数。...但是,深拷贝也可能导致更多的内存使用和更长的复制时间,因为需要创建新的内存区域并复制数据。 在C++中,如果需要执行深拷贝,通常需要显式地定义拷贝构造函数和拷贝赋值运算符。

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

    类继承

    如果需要使⽤基类复制构造函数但基类⼜没有定义,编译器将⾃动⽣成⼀个基类复制构造函数。 在这种情况下,执⾏成员复制的隐式复制构造函数是合适的,因为这个类没有使⽤动态内存分配。...除⾮要使⽤默认构造函数,否则应显式调⽤正确的基类构造函数。...类的默认复制构造函数使⽤显式baseDMA复制构造函数来复制lacksDMA对象的baseDMA部分。...7.2第二种情况:派⽣类使⽤new 在这种情况下,必须为派⽣类定义显式析构函数、复制构造函数和赋值运算符。 派⽣类析构函数⾃动调⽤基类的析构函数,故其⾃⾝的职责是对派⽣类构造函数执⾏⼯作的进⾏清理。...对于析构函数,这是⾃动完成的; 对于构造函数,这是通过在初始化成员列表中调⽤基类的复制构造函数来完成的;如果不这样做,将⾃动调⽤基类的默认构造函 数。

    1.3K30

    《Effective C++》读书摘要

    (二)、构造/析构/赋值运算 五、C++默认编写的函数 默认构造、复制构造、析构、赋值运算符。 六、拒绝自动生成的函数 私有化拷贝构造和赋值运算符; 私有继承UnCopyable手工类。 ?...七、多态基类声明虚析构函数 (不)具有多态性质基类(不)需要虚析构函数; 八、不让异常逃出析构 异常时终止或者吞下; 将可能抛出异常的代码提供给用户管理; 九、不在构造和析构中调用虚函数 调用后仅仅是自身的虚函数...十二、复制对象要面面俱到 不要丢失基类的成员的复制。 (三)、资源管理 十三、对象管理资源 构造函数获得资源,析构函数释放资源; 使用智能指针封装:tr1::shared_ptr和auto_ptr。...三十、inline里里外外 隐式:累内直接定义成(友)员函数,显式:inline关键字; 拒绝:复杂、虚函数、函数指针调用、模板、构造析构函数、影响动态连接或升级、对调试器的挑战(禁用)。...四十二、typename双重含义 模板声明中与class没有任何区别; 嵌套从属类型的显式指定,不能出现在基类列表和初始化列表中; ?

    2K60

    Effective_Cpp中的55个建议

    1.内置的int double等数据类型一定要手工初始化,因为C++不保证初始化它们。 2.构造函数最好使用成员初始化列表,因为如果放在函数体内就成了赋值了。...9:绝对不要在构造和析构过程中调用虚函数 当构造子类的时候,需要先去调用父类的构造函数,这时候子类还不存在,是无法去自动调用子类的虚函数的。...)对象,他们在构造函数中获得资源并在析构函数中释放资源。...在资源管理类中提供对原始资源的访问 1.APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。 2.对原始资源的访问可能经由显式转换或隐式转换。...33:避免遮掩继承而来的名称 1.只要名称相同,子类的成员函数就会把基类中所有同名函数覆盖掉。 2.为了让被遮掩的名称再见天日,可使用using声明式或转交函数。

    60730

    深入理解javascript中的继承机制(4)多继承寄生式继承借用构造函数借用构造函数并且复制原型以上

    Paste_Image.png 这里的multi函数使用的是浅复制,当然也可以修改为深复制的版本。...首先将已有的对象作为新对象的原型,继承它的属性,我们调用了之前的objec函数 然后再给他添加其他属性与方法 借用构造函数 这种继承模式中,就是子对象的构造函数中调用父对象的构造函数,通过apply和...function Triangle() { Shape.apply(this, arguments); } Triangle.prototype.name = 'Triangle'; 我们调用父类的构造函数的...这样的话,triangle对象会继承Shape构造函数中的属性,但不会继承原型中的属性。...下面这个模式就可以更好的解决这个问题 借用构造函数并且复制原型 其实解决上面那个自身属性被继承两次的问题也很简单,我们首先调用apply函数继承父类的自身属性,然后在复制原型属性就可以了,这个方法我们之前已经讨论过就是

    67910

    Effective C++: 改善程序与设计的55个具体做法

    条款07:为多态基类声明virtual析构函数 请记住 ■ polymorphic(带多态性质的)base classes 应该声明一个 virtual 析构函数。...条款09:绝不在构造和析构过程中调用virtual函数 请记住 ■ 在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层)。...条款13:以对象管理资源 请记住 ■ 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。...■ 对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。...■ 对classes而言接口是显式的(explicit),以函数签名为中心。多态则是通过virtual函数发生于运行期。

    72020

    Dart 中的类的定义、构造函数、私有属性和方法、set与get、初始化列表

    Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。 1. Dart类的定义 ? 2. Dart类的构造函数 ? 3....Dart中的命名构造函数 ? 4. Dart中将类抽离成一个单独的模块 首先将模块写到一个单独的文件中,如下图所示为public文件夹下的Person.dart为一个单独的类。 ?...在文件中引入public下的Person.dart文件,然后实例化。 ? 5....需要注意的是,定义为私有属性和私有方法的类必须要抽离放在一个单独的文件中,然后才能真正起到私有的效果。 首先将含有私有属性或私有方法的类放在一个单独的模块中。 ?...在文件中引入含有私有属性和私有方法的类。 ? 6. Dart中get与set修饰符 ? 7. Dart中的初始化列表 Dart中可以在构造函数体运行之前初始化实例变量。 ?

    6.5K40

    C#基础知识之base、this、new、override、abstract梳理

    一、Base关键词的几种用法 base重要用于OOP的多态上,base 关键字用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中 1、base调用基类构造函数...new一个struct时,new运算符用于调用其带构造函数,完成实例的初始化。 new一个int时,new运算符用于初始化其值为0。 new运算符不可重载。...(); } 2、new 修饰符:new 关键字可以显式隐藏从基类继承的成员 new 关键字可以显式隐藏从基类继承的成员。...隐藏继承的成员时,该成员的派生版本将替换基类版本。 虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。 如果使用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。...{ new public string Name { get; set; } = "dachong"; } 3、new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型 new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数

    46020

    C++设计类的注意事项

    最好提供一个显式的默认构造函数,保证不出错。...构造函数用来创建新对象,它是不能被派生类继承的,派生类需要定义自己的构造函数,并在初始化列表中调用基类的构造函数: SubClass::SubClass(int a, int b):BaseClass(...和普通构造函数一样,如果你没定义复制构造函数,编译器将提供一个,旦最好显式地自己定义一个,对于一些用new初始化的成员,自行用深复制来做复制,否则编译器提供的只是简单的浅复制,在删除时会出问题。...在定义派生类的赋值操作符重载函数时,要显式地在函数块中通过::来调用基类的赋值操作符,来操作基类的成员,毕竟派生类很多时候无法直接访问到基类成员,只能通过调用基类的公开方法来访问,而且也不能通过初始化列表的方式来调用...//注意这个函数的参数应该是基类引用,但是基类引用是可以指向子类的,它只会操作基类的成员 ...// 操作派生类的成员 return *this; } 析构函数 一定要注意显式定义析构函数来释放构造函数使用

    39920

    《Effective C++》学习笔记

    条款12:复制对象时勿忘其每一个成分 复制构造函数和赋值构造函数要确保复制了对象内的所有成员变量和所有基类成分,这意味着你如果自定义以上构造函数,那么每增加成员变量,都要同步修改以上构造函数,且要调用基类的相应构造函数...有显式转换方法(如指针的->和(*)操作,也比如自制一个getXXX()函数),还有隐式转换方法(比如覆写XXX()取值函数)。显式操作比较安全,隐式操作比较方便(但容易被误用)。...类的接口是显式定义的——函数签名。多态是通过虚函数在运行期体现的。...对于嵌套从属类型名称(即依赖于模板参数类型的一个子类型,例如迭代器),必须用typename来修饰,但不能在模板类的基类列和初始化列表中修饰基类。...解决方法有: 在调用动作前加上“this->” 使用using声明式来在子类中声明基类的该接口 明确指出被调用的函数位于基类:Base::xxx(); 以上做法都是承诺被调用的函数一定会在各种特化基类中均声明

    1.1K20

    【笔记】《Effective C++》条款26-55

    , 异常, 分支等等原因, 我们需要无端背负它们, 无谓的构造, 然后无谓地析构 因此我们应该尽量延后变量的定义, 甚至直到我们能给它们初始化实参, 将其写在其它函数的构造序列中为止 循环中的变量是特殊情况..., 如果目标的赋值成本低于构造+析构成本, 那么就应该在循环外定义, 否则在循环里面....这个初始化函数一般在接口类的构造函数或初始化列表中被调用. 别忘了虚析构函数 采用这种方法将实现和接口解耦的代价是运行期需要额外增加很多间接访问, 且对象增加一个实现指针或一个虚表指针的内存...., 只和重载一样和名称与参数有关, 所以很容易二义 更复杂的情况是下图的"菱形继承": 菱形继承中, 对于不同基类都拥有的同名成员, C++默认会复制多份以供使用, 如果不希望复制就应该使用虚继承,..., 因此我们无法直接在模板类中调用模板化的基类的成员 有三种方法处理这个问题: 在调用基类函数前加上this指针this->foo();, 用指针进行多态调用 用using声明式using Base<Tmp

    93330

    C#基础知识系列七(base、this、new、override、abstract、virtual、static)

    base关键字 base 关键字用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中: 调用基类上已被其他方法重写的方法。...二、new修饰符 new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。 虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。...如果使 用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。 ? 在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。 覆盖不会改变父类方法的功能。...static字段和static构造函数 主要来说明执行的顺序:   1、编译器在编译的时候,先分析所需要的静态字段,如果这些静态字段所在的类有静态的构造函数,那么就会忽略字段的初始化;如果没有静态的构造函数...3、而带有静态构造函数的类的静态字段,只有在引用到的时候才进行初始化。

    65120

    Google C++ 编程风格指南(三):类

    初始化 如果类中定义了成员变量, 则必须在类中为每个类提供初始化函数或定义一个构造函数....如果你定义的类继承现有类, 而你又没有增加新的成员变量, 则不需要为新类定义默认构造函数. 3.3. 显式构造函数 对单个参数的构造函数使用 C++ 关键字 explicit....缺点: 无 结论: 所有单参数构造函数都必须是显式的....如果你的基类需要可复制属性, 请提供一个 public virtual Clone() 和一个 protected 的拷贝构造函数以供派生类实现....如果你的类不需要拷贝 / 移动操作, 请显式地通过 = delete 或其他手段禁用之. 3.5. 委派和继承构造函数 在能够减少重复代码的情况下使用委派和继承构造函数.

    83040

    什么?CC++面试过不了?因为你还没看过这个!

    ; } inline int A::doA() { return 0; } // 需要显式内联 编译器对 inline 函数处理步骤 将 inline 函数体复制到 inline 函数调用点处;...C 实现 C++ 的面向对象特性(封装、继承、多态) 封装:使用函数指针把属性与方法封装到结构体中 继承:结构体嵌套 多态:父类与子类方法的函数指针不同 explicit(显式)关键字 explicit...修饰构造函数时,可以防止隐式转换和复制初始化 explicit 修饰转换函数时,可以防止隐式转换,但 按语境转换 除外 explicit 使用 struct A { A(int) { } operator...b4 = { 1 }; // 错误:被 explicit 修饰构造函数的对象不可以复制列表初始化 B b5 = (B)1; // OK:允许 static_cast 的显式转换 doB(1);...如: using namespace_name::name; 构造函数的 using 声明 在 C++11 中,派生类能够重用其直接基类定义的构造函数。

    3.7K50

    C语言与C++面试知识总结

    ; } inline int A::doA() { return 0; } // 需要显式内联 编译器对 inline 函数处理步骤 将 inline 函数体复制到 inline 函数调用点处;...C 实现 C++ 的面向对象特性(封装、继承、多态) 封装:使用函数指针把属性与方法封装到结构体中 继承:结构体嵌套 多态:父类与子类方法的函数指针不同 explicit(显式)关键字 explicit...修饰构造函数时,可以防止隐式转换和复制初始化 explicit 修饰转换函数时,可以防止隐式转换,但 按语境转换 除外 explicit 使用 struct A { A(int) { } operator...b4 = { 1 }; // 错误:被 explicit 修饰构造函数的对象不可以复制列表初始化 B b5 = (B)1; // OK:允许 static_cast 的显式转换 doB(1);...如: using namespace_name::name; 构造函数的 using 声明 在 C++11 中,派生类能够重用其直接基类定义的构造函数。

    5K41

    django 1.8 官方文档翻译:14-6 系统检查框架

    检查可以由check命令显式触发。检查会在大多数命令之前隐式触发,包括runserver 和 migrate。由于性能因素,检查不作为在部署中使用的WSGI栈的一部分运行。...如果你需要在你的部署服务器上运行系统检查,显式使用check来触发它们。 严重的错误会完全阻止Django命令(像runserver)的运行。少数问题会通过控制台来报告。...checked_object, id='myapp.E001', ) ] self.assertEqual(errors, expected_errors) 注册和标记检查 最后,你的检查函数必须使用系统检查登记处来显式注册...如果你想要添加额外的检查,你可以扩展基类中的实现,进行任何你需要的额外检查,并且将任何消息附加到基类生成的消息中。强烈推荐你将每个检查分配到单独的方法中。...这个字段向IntegerField的构造器中添加min 和 max 参数。你可能想添加一个检查,来确保用户提供了小于等于最大值的最小值。

    45630

    类中新特性的添加

    若类包含自定义析构函数、拷贝构造函数或拷贝赋值运算符,则编译器不会自动生成移动构造和移动赋值运算符,除非显式指定 =default。 移动构造函数和移动赋值的行为 内置类型成员将按字节逐一拷贝。...若希望保留自动生成的行为,可使用 =default 显式要求编译器生成该函数。...Person(Person&& p) = default; // 显式要求生成默认移动构造函数 private: std::string _name; int _age; }; int...(s1); // 调用默认的移动构造函数 return 0; } final 和 override 在 C++ 的继承和多态中,派生类可能会误写或错写基类的虚函数,导致未按预期覆盖基类的行为。...C++11 提供了 final 和 override 关键字,帮助开发者更好地控制和检测继承链中的函数覆盖行为。 override:用于修饰派生类中的虚函数,表示这是对基类中同名虚函数的覆盖。

    9310

    Effective C++笔记

    成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复 4.确定对象被使用前已被初始化 为内置型对象进行手工初始化,因为C++不保证初始化它们 构造函数最好使用成员初始值列...为多态基类声明virtual析构函数 带有多态性质的基类应该声明一个virtual析构函数。...绝不在构造和析构过程中调用virtual函数 在构造和析构期间不要调用virtual函数,因为这类调用从不下降至派生类 10....避免遮掩继承而来的名称 派生类内的名称会遮掩基类内的名称。在public继承下从没有人希望如此 为了让被遮掩的名称再见天日,可使用using声明式或转交函数 34....学习处理模板化基类内的名称 44.

    82220

    【笔记】《Effective C++》条款1-25

    对于自定类型, 则应该在构造函数完善地初始化 对于类的成员, 尽可能不要在构造函数内再初始化自己的元素, 因为在进入构造函数之前自定类型就会被调用默认初始化了, 构造函数内进行的实际上是拷贝构造, 但又要注意内置类型并不会调用默认初始化...如果希望自定成员不要默认初始化, 那么应该在初值列中进行初始化, 这会覆盖掉编译器的设置, 即便是默认初始化我们也可以不传递参数从而显式进行默认初始化 因此为了防止遗漏, 我们可以对每个类成员都在初值列中进行初始化...如果拷贝构造是以值形式传入参数的话, 还可以直接将当前对象数据与传值进入的对象进行交换 12 复制对象时勿忘其每一个成分 当你选择实现自己的拷贝构造函数时, 一定要手动复制所有的局部变量, 同时调用所有基类合适的拷贝函数...如果有一些成员变量没有在初值列中进行拷贝, 那么此时对象将会进入局部拷贝状态 如果只拷贝了成员变量而没有调用基类的拷贝函数, 那么此时基类部分将会被默认初始化, 也属于一种局部拷贝 很多时候基类的拷贝函数与派生类的拷贝函数会有很多代码的重叠部分..., 比较自然, 但是有时有危险 更常见的情景是写一个显式的get函数来获取原始指针 牢记RAII类不是为了封装数据存在的, 而是为了给原始指针加上资源回收的功能, 所以不必给RAII类加太多功能 16

    1.1K30
    领券