首页
学习
活动
专区
圈层
工具
发布

【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )

一、默认构造函数 C++ 类中 2 种特殊的构造函数 , 分别是 : 默认无参构造函数 : 如果 C++ 类中 没有定义构造函数 , C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " ,...和 默认拷贝构造函数 : 如果 C++ 类中 没有定义 构造函数 时 , C++ 编译器 会提供 默认的 无参构造函数 和 默认的 拷贝构造函数 ; 提供 默认拷贝构造函数 : 如果 C++ 类中 ,...定义了 非拷贝构造函数 , 如 : 有参构造函数 / 无参构造函数 , C++ 编译器 不会提供 默认的无参构造函数 , 但是 会提供 默认的 拷贝构造函数 ; 默认的 拷贝构造函数 只能进行 成员变量的..., C++ 编译器不会自动生成 默认的无参构造函数 和 默认的拷贝构造函数 ; 使用 Student s; 代码 创建对象 , 报错 “Student”: 没有合适的默认构造函数可用 ; 说明 C++...默认的无参构造函数 和 默认的拷贝构造函数 ; 使用 Student s; 代码 创建对象 , 报错 “Student”: 没有合适的默认构造函数可用 ; 说明 C++ 编译器没有为该类生成 默认的无参构造函数

2.3K30

【JS精粹】原型链继承和构造函数继承的 “毛病”

原型链中的函数和对象》 这里还是用代码展示下它们的指向关系吧: 上面例子中有 1 个对象 instance , 两个函数,SuperType 和 SubType 。函数是上帝,对象是基本物质。...构造函数继承 构造函数继承,也叫做:“盗用构造函数”,“对象伪装”或“经典继承”。 基本思路:在子类构造函数中用 apply()和 call()方法调用父类构造函数。...let s1 = new SubType() let s2 = new SubType() console.log(s1.fn === s2.fn) // true 所以,综上,原型链继承和构造函数继承的...思路是:使用原型链继承原型上的属性和方法,而通过构造函数继承实例属性。...,总结起来就是,属性(特别是引用值)通过构造函数去继承,而公用的、需要复用的方法用原型链去继承!!

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

    C++11委托构造函数和继承构造函数:从入门到精通

    引言在C++11标准中,引入了委托构造函数和继承构造函数这两个重要的特性。这些特性不仅提升了代码的性能,还增强了代码的可读性和可维护性。...,则必须出现 }; 默认实参不继承:当一个基类构造函数含有默认实参时,这些实参并不会被继承。...相反,派生类将获得多个继承的构造函数,其中每个构造函数分别省略掉一个含有默认实参的形参。...三、总结委托构造函数和继承构造函数是C++11中非常强大的特性,它们为C++程序员提供了更多的编程选择和优化机会。...希望本文能够帮助你更好地理解和掌握C++11中的委托构造函数和继承构造函数,从而提升你的C++编程水平。

    18510

    JavaScript构造函数的继承

    现在有一个"动物"对象的构造函数。 function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数。...一、 构造函数绑定 使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行: function Cat(name,color){ Animal.apply...alert(cat1.constructor == Animal); // true 这显然会导致继承链的紊乱(cat1明明是用构造函数Cat生成的),因此需要手动纠正,将 Cat.prototype...这一行放在这里,只是为了实现继承的完备性,纯属备用性质。 五、 拷贝继承 如果把父对象的所有属性和方法,拷贝进子对象,也能够实现继承。...使用时这样写: extend2(Cat, Animal); var cat1 = new Cat("AA猫","黑色"); alert(cat1.species); // 动物 至于非构造函数的继承

    1.2K10

    C++构造函数语义(合成默认构造函数)

    在初学C++的时候,对于一个对象来说,如果我们没有去定义其默认构造函数,那么编译器就会为我们自动生成一个默认构造函数。...但其实是不准确的,具体来说是编译器会在必要的时候来生成一个默认构造函数,那么这个编译器生成的默认构造函数称为合成默认构造函数。那么在以下四种情况中编译器才会生成一个合成默认构造函数: 1....在一个类中没有任何构造函数,但是包含了一个其他类的对象成员,并且该对象成员有默认构造函数,此时编译器就会为该类生成一个合成默认构造函数,用来调用对象成员的默认构造函数。 2....基类带有默认构造函数的派生类。        是指当一个基类包含一个默认构造函数,但是派生类没有任何构造函数时,编译器会生成一个合成构造函数,作用是调用基类的默认构造函数。 3....此外,如果自己定义了默认构造函数,那么编译器也会根据需要来扩充默认构造函数,目的就是上述所说的,调用父类的默认构造函数或者给对象的虚函数表指针赋值。 4.

    1.7K20

    ES6构造函数继承

    构造函数继承的概念构造函数继承是一种通过创建子类来继承父类的属性和方法的方式。通过构造函数继承,子类可以获得父类的实例属性,并且可以调用父类的构造函数来初始化这些属性。...这种继承方式允许子类扩展父类的功能,并添加自己的属性和方法。构造函数继承的关键在于使用super()函数在子类的构造函数中调用父类的构造函数。...然后,在子类的构造函数中使用super()函数来调用父类的构造函数。这样可以确保子类继承了父类的属性,并完成了属性的初始化。示例让我们通过一些示例来理解ES6中构造函数继承的使用。...然后,我们定义了一个Dog类,它通过extends关键字继承了Animal类,并添加了一个新的方法bark()。通过构造函数继承,Dog类获得了Animal类的属性和方法。...通过构造函数继承,子类Child获得了两个父类的属性和方法。我们创建了一个Child类的实例,并访问了继承的属性name和age。

    46230

    JavaScript如何借用构造函数继承

    这篇文章主要介绍了JavaScript如何借用构造函数继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 借用构造函数继承是在子类型构造函数的内部调用超类型构造函数...,通过使用apply()和call()方法 ?...借用构造函数继承的优势是可以在子类型构造函数中向超类型构造函数传递参数,例如以下代码: ?...:用构造函数继承并不能继承到超类型原型中定义的方法,例如以下代码,在girlFriends构造函数的原型中添加sayHello方法: ?...girlFriend.prototype.sayHello = function(){ console.log('hello'); } 继承它的子类构造函数的实例并不能调用到这个sayHello

    1.1K20

    C++11继承构造函数

    更为巧妙的是,C++11标准规定,继承构造函数与类的一些默认函数(默认构造、析构、拷贝构造函数等)一样,是隐式声明,如果一个继承构造函数不被相关代码使用,编译器不会为其产生真正的函数代码。...(2)构造函数拥有默认值会产生多个构造函数版本,且继承构造函数无法继承基类构造函数的默认参数,所以我们在使用有默认参数构造函数的基类时就必须要小心。...,参数默认值会导致多个构造函数版本的产生,因此在使用时需格外小心。...(3)多继承的情况下,继承构造函数会出现“冲突”的情况,因为多个基类中的部分构造函数可能导致派生类中的继承构造函数的函数名、参数(即函数签名)相同。...此外,使用继承构造函数时,还需要注意以下几点: (1)如果基类构造函数被申明为私有成员函数,或者派生类是从基类中虚继承的 ,那么就不能在派生类中申明继承构造函数; (2)一旦使用继承构造函数,编译器就不会再为派生类生成默认构造函数了

    2.1K20

    构造函数、原型、原型链、继承

    任何一个函数,只要使用了new关键字,它就成了构造函数。...__proto__.constructor === man.constructor; //true 构造-原型组合模式 根据对象的特性,对象上没有的属性会在原型对象中寻找,所以可以把公共的属性和方法给到原型对象上去...this.nation){ Person.prototype.nation = 'Chinese' }; }; 原型链 函数被创建后prototype指向了默认的原型对象,如果使用new调用该函数来生成一个对象...,就会形成函数、对象、原型之间的三角关系: 此时如果让实例对象指向另一个构造函数的实例对象,这个关系就变成了这样: 实例对象A和实例对象B被一个__proto__属性链接起来了,这已经是一个具有两个节点的链条了...省略分析推导过程,这里只介绍最实用和可靠的实现继承的方式:组合继承,为了方便描述,引入“父类函数”和“子类函数”这两个概念: //父类函数 function Father(name, age){ this.name

    91520

    EasyC++59,默认构造函数

    这是EasyC++系列的第59篇,默认构造函数。 默认构造函数 上一篇文章当中介绍的是显式构造函数,也就是说我们需要传入值来对类的成员变量进行初始化。...针对这种情况,C++提供了默认构造函数的功能。所谓默认构造函数,也就是在没有提供显式的初始值时,用来创建对象的构造函数。...Stock() {} }; #endif C++当中有一个很奇怪的设定,当一个类我们没有提供任何构造函数时,C++会默认赋予它一个默认构造函数。...有了默认构造函数之后,我们才可以直接声明类的实例: Stock stock1; 如果Stock类没有默认构造函数,那么上述的语句会报错。...实现默认构造函数,除了上述那样手动创建一个没有任何参数的构造函数之外,还可以将已有的构造函数的所有参数都设置默认值。

    44320

    JavaScript原型链继承与盗用构造函数继承

    ---- theme: channing-cyan 这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战 昨天我们讲解了原型和原型链,今天我们说一下继承,顺便再重温一下原型链 什么是继承 继承这个词比较容易理解...这个就是继承。我们直接上干货。 原型链继承 原型链继承是js中的主要继承方式,它的基本思想就是通过原型继承多个引用类型的属性和方法。...对于属性和方法一直会持续到原型链末端 原型链虽然是比较强大的继承实现工具,但是它里面所有的引用值都是实例间共享的,而且子类不能向父类传参,一般原型链也不会被单独使用,我们可以通过盗用构造函数配合来解决这些问题...盗用构造函数 盗用构造函数有时候也被一些人叫做“对象伪装”或“经典继承”。这个思路很简单,在字类构造函数中调用父类构造函数。我们可以用.call()和.apply()将父类构造函数引入子类函数。...盗用构造函数也有一定的问题 1、只能继承父类构造函数的属性。 2、无法实现构造函数的复用。(每次用每次都要重新调用) 3、每个新实例都有父类构造函数的副本,臃肿。

    56920

    【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )

    , 还有一个自己的 int z 成员 , 在内存中是 3 个 int 类型的空间 ; 3、问题引入 - 派生类对象构造函数和析构函数调用 上述 继承 的过程中 , 每一层继承 , 都继承了上一级 父类的...int main() { A objA; B objB; C objC; // 控制台暂停 , 按任意键继续向后执行 system("pause"); return 0; } 二、继承中的构造函数和析构函数...---- 1、子类构造函数与析构函数调用顺序 继承中的构造函数和析构函数 : 子类构造 : 子类对象 进行 构造 时 , 需要调用 父类 的 构造函数 对 继承自父类的 成员变量 进行 初始化 操作...如果继承 A 类 , 如果 A 类有默认的构造函数 , B 类的构造函数可以这么写 , 不显式调用 A 类的构造函数 , 默认调用 A 类的 无参 默认构造函数 ; class B : public...y = b; cout 构造函数调用" << endl; } } 3、代码示例 - 继承中的构造函数和析构函数 代码示例 : #include "iostream" using namespace

    70240

    析构函数-复制构造函数-赋值操作符重载-默认构造函数

    通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用。 但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致。...iostream> #include using namespace std; struct Exam{ Exam(){ cout默认构造函数...//返回exam的对象 int main(){ cout<<"--------------------1----------------"<<endl; Exam a; //调用默认的构造函数创建对象...func2(a); //形参为引用,无需传递实参 cout<<"--------------------4----------------"<<endl; a = func3(); //调用默认构造函数创建局部对象...//调用析构函数撤销副本 cout<<"--------------------5----------------"<<endl; Exam *b = new Exam(); //调用默认构造函数创建对象

    1.2K60

    【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 的 成员变量 , 那么 该类 的 构造 与 析构 , 就需要涉及到...类 本身 的 构造函数 和 析构函数 , 父类 的 构造函数 和 析构函数 , 类 成员变量 的 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下...析构函数 ; 最后 , 调用 父类 析构函数 ; 二、完整代码示例分析 ---- 1、代码分析 在下面的代码中 , 继承关系 : C 类 继承了 B 类 class C : public B , B 类...; A 和 B 的构造函数 , 是 父类构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数的调用顺序为 : 父类 -> 成员 -> 自身 , 符合上述的调用原则...; 然后分析 析构函数 调用顺序 ; C 析构函数 , 是 自身构造函数 ; D 析构函数 , 是 成员构造函数 ; A 和 B 的析构函数 , 是 父类构造函数 ; 析构函数的调用顺序为 : 自身

    64410

    C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造

    构造函数类型C++ 支持多种类型的构造函数,用于满足不同的初始化需求:默认构造函数: 不带参数的构造函数,通常用于初始化对象的默认状态。带参数构造函数: 允许传入参数来初始化对象的状态。...拷贝构造函数: 用于从另一个已存在的对象创建新对象。移动构造函数: 用于从即将销毁的临时对象转移资源到新对象。默认构造函数默认构造函数是最简单的构造函数,不接受任何参数。...参数可以是任何有效的 C++ 数据类型,包括基本类型、自定义类对象和指针。...,例如 public、private 和 protected。...总结构造函数是 C++ 中重要的面向对象编程机制,用于初始化和管理对象的状态。通过理解不同类型的构造函数及其用法,您可以创建健壮且可维护的 C++ 代码。

    2.6K10

    C++ 合成默认构造函数的真相

    对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数。 合成默认构造函数会初始化类中所有的数据成员。   ...(“这些函数“指的是编译器版本的复制构造函数、赋值操作符和析构函数,还包括了默认构造函数。)也就是说,默认构造函数“被需要”的时候编译器才会帮我们合成,那什么情况才是默认构造函数”被需要“呢?...2.基类带有默认构造函数的派生类。  当一个类派生自一个含有默认构造函数的基类时,该类也符合编译器需要合成默认构造函数的条件。编译器合成的默认构造函数将根据基类声明顺序调用上层的基类默认构造函数。...带有虚函数的类   类带有虚函数可以分为两种情况: 类本身定义了自己的虚函数 类从继承体系中继承了虚函数(成员函数一旦被声明为虚函数,继承不会改变虚函数的”虚性质“)。   ...例如类A虚继承于类X,则对于A来说,类X是类A的虚基类,而不能说类X就是一个虚基类。虚基类是为了解决多重继承下确保子类对象中每个父类只含有一个副本的问题,比如菱形继承。

    98330

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

    文章目录 一、主构造函数定义临时变量 二、主构造函数中定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- 在 Kotlin 类中 , 可以在 类声明 时 在 类名后..., 每个次构造函数都可以有不同的参数组合 ; 定义次构造函数后 , 必须调用主构造函数 , 并且为每个主构造函数 的 参数设置 参数值 ; 次构造函数中可以实现代码逻辑 , 作为主构造函数的补充 ; 代码示例...: 下面代码中 , 次构造函数 必须 调用主构造函数 , 如 name 和 age 参数必须设置默认值 name = "Jerry", age = 12 ; class Hello( // 主构造函数...name + " , " + hello2.age) } 执行结果 : Tom , 18 name = Jerry, age = 12, isStudent = false Jerry , 12 四、构造函数默认参数...---- 在定义 构造函数 时 , 可以为 构造函数 的参数 指定 默认值 , 如果 用户传入了 值参 则 使用用户传入的值 , 如果用户没有传入值 则 使用该 默认值 ; 如果 构造函数 参数有 指定默认值

    6.6K20

    【C++有点难】默认成员函数:构造函数

    默认成员函数有啥? 总的来说嘞,有六种:构造函数,析构函数,拷贝构造函数,赋值重载函数,取地址重载函数 其实我刚知道有六种的时候,也是很头大,但经过我不但地旁敲侧击,终于!...我逐渐明白第一种:构造函数的神奇 那学习之前,肯定要了解一下构造函数的概念吧? 构造函数的概念: 构造函数作为一种默认成员函数,肯定就有它又具有的特点 函数名与类名相同。 ⽆返回值。...如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显式定义编译器将不再⽣成。...:⽆参构造函数、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数。...、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数这三种默认的构造函数不能同时存在,只能存在一个!

    18110
    领券