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

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

一、默认构造函数 C++ 类中 2 种特殊的构造函数 , 分别是 : 默认无参构造函数 : 如果 C++ 类中 没有定义构造函数 , C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " ,.../ 拷贝构造函数 ) , C++ 编译器 将不再自动生成默认的无参构造函数 ; 默认构造函数内容 : C++ 编译器 为类 定义的 默认无参构造函数 , 其函数体为空 , 如下代码所示 ; class...obj; // 调用默认无参构造函数 MyClass obj2 = obj; // 调用默认拷贝构造函数 二、构造函数调用规则 ---- 1、构造函数规则说明 构造函数调用规则 : 提供 默认无参构造函数...和 默认拷贝构造函数 : 如果 C++ 类中 没有定义 构造函数 时 , C++ 编译器 会提供 默认的 无参构造函数默认的 拷贝构造函数 ; 提供 默认拷贝构造函数 : 如果 C++ 类中 ,...定义了 非拷贝构造函数 , 如 : 有参构造函数 / 无参构造函数 , C++ 编译器 不会提供 默认的无参构造函数 , 但是 会提供 默认的 拷贝构造函数 ; 默认的 拷贝构造函数 只能进行 成员变量的

36230

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

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

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

EasyC++59,默认构造函数

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

32420

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

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

86460

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

对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数。 合成默认构造函数会初始化类中所有的数据成员。   ...(“这些函数“指的是编译器版本的复制构造函数、赋值操作符和析构函数,还包括了默认构造函数。)也就是说,默认构造函数“被需要”的时候编译器才会帮我们合成,那什么情况才是默认构造函数”被需要“呢?...默认构造函数是可以不用实参进行调用的构造函数,它包括了以下两种情况: 没有带明显形参的构造函数。 提供了默认实参的构造函数。       类设计者可以自己写一个默认构造函数。...编译器帮我们写的默认构造函数,称为“合成的默认构造函数”。...2.基类带有默认构造函数的派生类。  当一个类派生自一个含有默认构造函数的基类时,该类也符合编译器需要合成默认构造函数的条件。编译器合成的默认构造函数将根据基类声明顺序调用上层的基类默认构造函数

72530

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

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

4.6K20

【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

类的 实例对象时 , C++ 编译器 会自动调用 开发者定义的 构造函数 ; 2、构造函数显式调用与隐式调用 类 的 构造函数 可以 自动调用 , 也可以手动调用 ; 一般 默认的 无参构造函数 是 自动地..., 则无法进行初始化操作 ; 5、默认构造函数 如果 定义 类 时 , 没有写 构造函数 , C++ 编译器 会 为类 提供一个默认构造函数 ; 默认构造函数函数体为空 , 不需要开发者定义 ,...由 C++ 编译器默认提供 ; 默认构造函数 分为 2 种类型 : 默认无参构造函数 : 如果 类 中没有定义 构造函数 , C++ 编译器 会默认提供一个 无参构造函数 , 该构造函数函数体为空...; 默认拷贝构造函数 : 如果 类 中没有定义 拷贝构造函数 , C++ 编译器 会默认定义一个 默认拷贝构造函数 , 该函数的作用是进行简单的成员变量赋值 ; 6、代码示例 - 初始化函数无法及时调用..., C++ 编译器 会提供一个 默认构造函数 // Student 类 没有提供拷贝构造函数 , C++ 编译器 会提供一个 默认拷贝构造函数 Student s; // 调用初始化函数 s.init

29520

Java默认构造

Java中的默认构造器返回的值是什么? 当我们用Java调用构造函数时,它返回由它创建的对象。 这就是我们用Java创建新对象的方式。 7. 我们能继承构造函数吗?...不能,Java不支持构造函数的继承。 8. 为什么在Java中构造函数不能是final,static或abstract? 如果将方法设置为final,则意味着我们不希望任何类覆盖它。...但是构造函数(按照Java语言规范)不能被覆盖。 因此,没有必要将其标记为final。 如果我们将方法设置为抽象方法,则意味着它没有主体,应在子类中实现。...但是,当使用new关键字时,将隐式调用构造函数。 因此,它需要一个body。 如果我们将方法设置为static,则意味着它属于该类,但不属于特定对象。 始终调用构造函数来初始化对象。...因此,没有使用标记构造函数为静态的。

75431

C++的四个默认函数构造函数,析构函数,拷贝函数,赋值函数

在C++中,对于一个类,C++的编译器都会为这个类提供四个默认函数,分别是: A() //默认构造函数 ~A() //默认析构函数 A(const A&) //默认拷贝构造函数 A& operator...class Animal { private: string name; public: Animal();//默认构造函数 Animal(string n);//也可以自定义构造函数 }; Animal...//第二种实例化对象的方法 Animal c; //将调用默认构造函数 //注意:对于无参构造函数,不可以使用Animal c(), Animal c("花狗");//将调用自定义构造函数,对name...class Animal { private: string name; public: Animal();//默认构造函数 ~Animal(); //默认析构函数 }; ---- 三....这个例子调用的是默认的拷贝构造函数(注意看控制台显示,调用了一次构造函数和两次析构函数),可以看出两个对象的成员变量地址是不一样的,当成员变量不存在指针类型是,这样做没什么问题,当类中有指针变量,自动生成的拷贝函数注定会出错

2.1K20

C++中转换构造函数默认函数的优先级

前言: 在学习谭浩强《c++面对对象设计》一书中,在学到转换构造函数中, 在转换构造函数中 #include using namespace std; class plural...{ public: plural(int a=0,int b=0):real(a),imaginary(b){}; //默认构造函数 plural(double a){real = a;imaginary...= 3;}; //转换构造函数 void display(); private: double real; double imaginary; }; 他们都是构造函数,书上说到在...plural类的作用域中有以下定义: plural p1(3) //建立对象p1,由于只有一个参数,调用转换构造函数 那假如我在类中定义了默认构造函数呢,系统如何选择用哪一个函数呢?...结果 在经过反复调式,测验,并结合其他网上文章,得出一下总结 系统是不会运行你函数出现歧义性的,如果你在类中定义了一下: plural(int a=0,int b=0):real(a),imaginary

53230

C++构造函数 | 构造函数

C++构造函数的作用 C++提供了构造函数来处理对象的初始化,构造函数是一 种特殊的成员函数,与其他成员函数不同,不需要程序员来调用它,而是在建立对象时自动执行。...构造函数的名字必须与类名同名,而不能由程序员任意命 ,以便编译系统能识别它并把它作为构造函数处理,构造函数不具有任何类型,不返回任何值,它的功能是由程序员定义,程序员根据初始化的要求设计函数体和函数参数...关于构造函数,以下5点需要读者注意:  在类对象进入其作用域时调用构造函数构造函数没有返回值,不需要在定义构造函数时声明类型。 构造函数不需要程序员调用,也不能被程序员调用。...在构造函数函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。...如果用户自己没有定义构造函数,则C++编译系统会自动生成一个构造函数,只是这个构造函数函数体是空的,也没有参数,不执行初始化操作。

2.1K74

JAVA private私有类的 默认构造函数 的生成过程

如果一个类没有定义任何构造函数,则编译器将生成一个缺省的构造函数,该构造函数的访问修改符和类的访问修改符相同,例如: class test将生成test()构造函数 public class test将生成...public test()构造函数。...如果读者仔细思考一下创建一个新的类实例的过程,大概已经明白了产生上述现象的原因: 当程序试图创建一个Wrapper$InnerClass的类实例时,却不能使用其缺省的构造函数,因为Wrapper$InnerClass...因此编译器不得不再生成一个可访问的构造函数,由于这里只有Wrapper类的private void testInnerClass()方法使用了new InnerClass(),所以编译器只(需)为这个新的构造函数生成了...同时,为了和已有的缺省构造函数有所区别,就加入了一个Wrapper$1类型的参数,为此,编译器还要生成一个Wrapper$1类。

1.8K30

.Net 7的默认构造函数.Ctor下断点出错续

楔子 因为在默认构造函数.Ctor上面下断点,导致了程序的崩溃,参见上一篇:一个奇怪的错误,找到了错误点,也找到了解决方法,但是结果不满意 因为没有相应的结构体在即时窗口赋值(除了),上篇解决的方案是八字节一个单元复制地址值...; GC.Collect(); } } 原理 在Main函数运行之前,RunMainInternal处下断点,然后再在WriteCodeBytes 函数里面的...这样的话,变量m_CodeHeader,m_CodeHeaderRW的MethodDesc第一次运行是 Program.Main函数,第二次运行就是Program.Ctor函数了。...最后可以让它从WriteCodeBytes函数运行出来,直到运行到pCode,它是 Program.Ctor函数的起始地址,也就是函数头的上一个地址(机器码push地址的上 一个地址),然后再里面下个断点...验证 用lldb验证下以上的说法 在RunMainInternal处下个断点,r运行到断点处 在WriteCodeBytes函数处下个断点,C运行到断点出,单步n运行到memcpy函数处 此时就可以看下当前它编译的是哪个函数了运行命令

43810

【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

构造函数 II . 主构造函数声明属性 III . init 初始化代码块 IV . 主构造函数参数 和 成员变量访问方式 V . 主构造函数 可见性 设置 VI ....次构造函数 ( 常用情况 ) VII . 次构造函数 ( 没有主构造函数 ) VIII . 构造函数 代码执行顺序 IX . 调用 主构造函数 / 次构造函数 创建类实例对象 I ....主构造函数 ---- 1 . 构造函数个数 : Kotlin 类定义时需要指定主构造函数 , 还可以指定 0 ~ 多个次构造函数 ; 2 ....主构造函数定义 : 主构造函数与类定义在一起 , 构造函数定义在类名后 , 格式为 constructor( 构造函数参数列表 ) ; 3 ....构造函数可见性 : 主构造函数默认是 public 可见性 , 如果将该构造函数设置成 private , 那么 constructor 关键字必须要有 ; class 类名 private constructor

2.8K10

【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )

文章目录 一、使用 Java 语法循环 二、使用 IntRange 循环 1、使用默认的 IntRange 构造函数 2、使用可设置翻转属性的 IntRange 构造函数 3、使用可设置是否包含 to...的 IntRange 构造函数 三、使用 0..9 简化方式的 IntRange 实例对象 四、完整代码示例 一、使用 Java 语法循环 ---- 在 Groovy 中 , 使用 Java 语法进行循环...IntRange 构造函数 使用默认的 IntRange 实例对象控制循环 ; 构造函数 : /** * 创建一个新的非包容性IntRange。...构造函数 : /** * Creates a new non-inclusive aware IntRange...构造函数 : /** * Creates a new inclusive aware IntRange

1K30

js 中的构造函数构造函数作用,构造函数和普通函数的区别

构造函数 在 JavaScript 中,用 new 关键字来调用的函数,称为构造函数构造函数首字母一般大写(规范)。...(4) 默认返回 this 由于函数体内部的this指向新创建的内存空间,默认返回 this ,就相当于默认返回了该内存空间,也就是上图中的 #f1。此时,#f1的内存空间被变量p1所接受。...2、如果直接调用函数,那么,this对象指向window,并且,不会默认返回任何对象(除非显性声明返回值)。...4、构造函数的返回值 构造函数执行过程的最后一步是默认返回 this 。言外之意,构造函数的返回值还有其它情况。 没有手动添加返回值,默认返回 this。...逐个执行函数中的代码 D、将新建的对象作为返回值 6、构造函数的返回值默认是this 也有其他情况 。

3.3K10

【C++初阶】类与对象:6个默认成员函数-----构造函数和析构函数

我们在写代码的时候经常会忘记初始化和销毁,C++的构造函数和析构函数就能避免这个问题。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。...如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...默认构造函数:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,      都可以认为是默认构造函数,并且默认构造函数只能有一个。...析构函数名是在类名前加上字符 ~; 2. 无参数无返回值类型; 3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载; 4....全是自定义类型,且自定义类型都有默认构造函数; 析构函数 1.一般情况下,有动态申请资源,就需要显示写析构函数释放资源; 2.没有动态申请资源,不需要写析构函数; 3.需要释放资源的成员都是自定义类型

8410
领券