首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏韩曙亮的移动开发专栏

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

    一、默认构造函数 C++ 类中 2 种特殊的构造函数 , 分别是 : 默认无参构造函数 : 如果 C++ 类中 没有定义构造函数 , C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " , 函数体为空 , 不做任何操作 ; 默认拷贝构造函数 : 如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认的拷贝构造函数 " , 在函数中对成员变量进行简单的复制操作 / 拷贝构造函数 ) , C++ 编译器 将不再自动生成默认的无参构造函数 ; 默认构造函数内容 : C++ 编译器 为类 定义的 默认无参构造函数 , 其函数体为空 , 如下代码所示 ; class : 如果为 C++ 类 定义了 拷贝构造函数 , C++ 编译器 将不再自动生成默认的拷贝构造函数 ; 默认拷贝构造函数内容 : C++ 编译器 为类 定义的 默认拷贝构造函数 , 在函数内部将 现有对象 和 默认拷贝构造函数 : 如果 C++ 类中 没有定义 构造函数 时 , C++ 编译器 会提供 默认的 无参构造函数默认的 拷贝构造函数 ; 提供 默认拷贝构造函数 : 如果 C++ 类中 ,

    3K30编辑于 2023-10-15
  • 来自专栏Zaqdt_ACM

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

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

    1.9K20发布于 2020-03-09
  • 来自专栏学习

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

    默认成员函数有啥? 总的来说嘞,有六种:构造函数,析构函数,拷贝构造函数,赋值重载函数,取地址重载函数 其实我刚知道有六种的时候,也是很头大,但经过我不但地旁敲侧击,终于! (返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此) 对象实例化时系统会⾃动调⽤对应的构造函数。 构造函数可以重载。 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显式定义编译器将不再⽣成。 :⽆参构造函数、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数。 、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数这三种默认的构造函数不能同时存在,只能存在一个!

    33210编辑于 2025-01-22
  • 来自专栏我的技术专栏

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

    对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数。 合成默认构造函数会初始化类中所有的数据成员。    第一个误解来自于我学习C++的第一本书 《C++ Primer》,在书中392页:“只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数”。 让我对上面两个观点产生疑惑,是在看《Effective C++》时,条款05《了解C++默认编写并调用哪些函数》中说到“….惟有当这些函数被需要(被调用),它们才会被编译器创建出来。” 这个问题《Effective C++》并没有给出答案,直到看了《深度探索C++对象模型》,才明白了编译器何时才会帮我们合成一个默认构造函数。    C++》中指出惟有默认构造函数”被需要“的时候编译器才会合成默认构造函数

    1.2K30编辑于 2022-05-06
  • 来自专栏程序员

    C++函数参数默认

    函数参数默认值顾名思义即:给函数的参数给予一个默认值。这种方式在OpenCV的API中是非常多的。 默认值写在函数声明中,函数定义中不出现. int fun(int a = 12); int fun(int a) { a += a*a; return a; } 这样函数fun的参数a就具备了默认参数 给予参数默认值时,一种是指定所有的参数值。另外一种是从右向左依次指定参数的默认值。不能违反这两个规则。 函数调用时按照以下规则传递参数: 1.参数有默认值的可以不用传递参数 2.参数没有默认值,必须传递参数 3.有默认值的,传递参数后,实参覆盖掉了形参默认值。

    1.4K10发布于 2020-04-08
  • 来自专栏Linux驱动

    C++内联函数,默认参数,占位参数

    本章主要内容: 1)内联函数(替代宏代码段) 2)默认参数 3)占位参数 ---- 1.C++的内联函数分析 1.1讲解内联函数之前,首先回忆下之前讲的define宏定义: 之前讲过宏定义会经过预处理器进行文本替换 (++a) : b ) ); 从而a被加了两次,所以输出结果为7. 1.3所以C++便添加了内联函数来代替宏代码段 内联函数用inline关键字声明,比如上面的MAX(A,B)宏,则可以替换为: inline 内联函数:就会在每次调用的地方,将内联函数里的代码段”内联地”展开,所以省去了额外的开销 注意:当内联函数里的代码过多,且流程复杂时,编译器可能会拒绝该函数的内联请求,从而变成普通函数 2.函数的参数默认C++中允许为函数提供参数默认值,主要有两种定义方式 1)函数声明时: int show(int x=10); //声明show函数,并定义参数x默认值为10 int main() { show( 下章接着来学习: 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)

    1.7K50发布于 2019-05-24
  • C++六大默认成员函数

    六大默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数。 (); // 调用无参的构造函数 Date d3; d3.Print(); return 0; } 默认构造函数分为三类: 全缺省构造函数 无参构造函数 编译器默认生成的构造函数 总结一下 :不传参的构造函数就是默认构造函数,这三个函数不能同时存在 而全缺省构造函数和无参构造函数虽然构成函数重载,但是调用时会产生调用歧义 我们不显式写构造函数,编译器默认生成的构造函数会如何处理数据? 析构函数 析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作 int main() { // C++规定成员函数要加&才能取到函数指针 PF pf = &A::func; A obj;//定义ob类对象temp // 对象调⽤成员函数指针时,使⽤.

    22710编辑于 2025-12-18
  • 来自专栏C++开发

    C++课程学习】:继承:默认成员函数

    默认构造函数(这里指的是编译器生成的构造函数): 首先来看看,如果我们在子类中不显式写构造函数,看看编译器生成的默认构造会干什么事情(环境:VS2022): 我们可以把子类的成员分成三类: 1.父类的成员 从VS2022中可以看出,如果不写字类的默认构造函数,那么编译器生成的默认构造函数做了: 1.调用父类的构造函数,对父类成员进行初始化。 2.内置类型不做处理。(有些环境可能会初始化为0)。 显式写构造函数: 我们在显示写构造函数时,一定要去调用父类的构造函数,构造函数调用的规则如下: 想调用哪个构造函数就传什么参数,根据不同的参数,可以调用不同的构造函数。 如果我们没有调用构造函数,那么编译器会去调用父类默认构造函数(无参的构造函数)。 但是会有一个问题?,如果父类没有无参的构造函数怎么办? 此时,由于子类写构造函数时,没有调用父类的构造函数。 另外写person()=default; 可以让编译器强制生成默认构造函数。 拷贝构造函数: 编译器自己生成的拷贝构造: 1.对于子定义类型,调用它的拷贝构造。 2.对于内置类型,进行值拷贝。

    26110编辑于 2024-12-09
  • 来自专栏学习

    C++(六个默认成员函数

    六个默认成员函数 默认成员函数的概念:如果用户不显式写,编译器会自动生成的函数,就是默认成员函数 构造函数 构造函数是六个默认成员函数之一,构造函数的功能类似于init,起了初始化的功能,构造函数的名字和类的名字相同 注意:在C++中,定义了构造函数会自动调用,但是在实际中vs是不会调用构造函数的,所以C++11打了一个补丁就是可以在声明类的成员的时候可以增加一个缺省值,在编译的过程中,就会根据成员变量的缺省值来对对象进行初始化 注意:全缺省的构造函数、无参的构造函数、和编译器默认生成的构造函数都可以作为编译器默认的构造函数 并且默认的构造函数只能有一个,意思就是这三个构造函数只能有一个,如果前两个同时存在,虽然构成重载,但是调用时编译器会产生歧义 无参无返回值 第二条说无参,也就造成了析构函数不能进行函数重载 在对象的生命周期结束时,C++编译器会自动调用析构函数 让我们用下面的一个类来检测一下,编译器是否自动调用了析构函数 #include<iostream ,编译器将会生成一个默认构造函数

    31610编辑于 2024-10-09
  • 来自专栏学习

    C++】深入剖析默认成员函数3:拷贝构造函数

    上两篇博客我们深入探讨了一下另外两个默认成员函数:构造函数和析构函数。 他们两个都有一个特性: (1)对“内置类型”的成员函数:不进行初始化,也不进行清理(就是没有调用析构函数)。 (2)对于“自定义类型”的成员函数:会调用它对应的默认构造函数进行初始化,和对应的析构函数进行清理。 而今天我们迎来了第三问默认成员函数---拷贝构造函数! (一般用const修饰) 当然,作为一个特殊的默认成员函数,同样也符合一下构造函数的特性: 拷贝构造函数是构造函数的⼀个重载。 记住,只要你不需要改变函数体内容,就必须把const加上(别问为什么,因为跟我说一定要加上的人也没有说为什么) 默认的拷贝构造函数: 这里的默认拷贝构造函数就跟前面的构造函数和析构函数有所不同了 C++ ,拷贝构造函数对内置函数和自定义函数都会进行处理 对于默认的拷贝构造函数,我们也不是完全就使用默认的,比如Stack类的,我们就需要自己实现拷贝,否则如果使用Stack st1拷贝出的Stack st2

    35110编辑于 2025-01-22
  • 来自专栏学习

    C++】深入剖析默认成员函数2:析构函数

    继上一个有点令我头大的构造函数后,真是一波未平一波又起呀,咱们又迎来新的默认成员函数:析构函数! 别说,我真的一脸懵了~ 上一篇构造函数,我们简单地了解到了第一个默认成员函数---构造函数的各种便利,总而言之,构造函数就是初始化一个对象,那清理一个对象----便是析构函数咯。 析构函数主要清理但不销毁对象 这样理解还是很容易的 析构函数的特点: 同样的,析构函数也是特殊的默认成员函数,有以下特点: 1.析构函数名是在类名前加上字符 ~。 ⼀个类只能有⼀个析构函数。若未显式定义,系统会⾃动⽣成默认的析构函数。 4. 对象⽣命周期结束时,系统会⾃动调⽤析构函数。 (对于内置类型的成员变量,不做处理;对于自定义类型的成员变量,会自动调用默认的析构函数) 还需要注意的是我们显⽰写析构函数,对于⾃定义类型成员也会调⽤他的析构,也就是说⾃定义类 型成员⽆论什么情况都会

    23710编辑于 2025-01-22
  • 来自专栏花狗在Qt

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

    C++中,对于一个类,C++的编译器都会为这个类提供四个默认函数,分别是: A() //默认构造函数 ~A() //默认析构函数 A(const A&) //默认拷贝构造函数 A& operator = (const A &) //默认赋值函数。 //第二种实例化对象的方法 Animal c; //将调用默认构造函数 //注意:对于无参构造函数,不可以使用Animal c(), Animal c("花狗");//将调用自定义构造函数,对name class Animal { private: string name; public: Animal();//默认构造函数 ~Animal(); //默认析构函数 }; ---- 三. 赋值函数 四个默认函数,当赋值函数最为复杂。 Animal& operator=(const Animal&obj) { if(this !

    3.2K20发布于 2021-03-02
  • 来自专栏Yui编程知识

    C++初阶(类中的默认成员函数

    呀哈喽,我是结衣 今天给大家带来的是类里面的默认成员函数,一共有六个默认的成员函数哦,包括构造函数,析构函数,拷贝构造函数,运算符重载函数,const成员函数,那么正篇开始。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 1.构造函数 构造函数是这6个成员函数要求最多的一个,自然也是最难的一个,但是我们可不能放弃啊。 所以当我们要调用无参的构造函数时,我们直接写Date d1; 就可以了。 还有就是,如果我们没有写构造函数,其实C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。 当我们把构造函数注释掉,再改下下面的代码,我们运行时就会打印随机值 这了就是编译器自动生成的构造函数了,不过它只能帮你赋上随机值。 C++把类型分成内置类型(基本类型)和自定义类型。 若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载 对象生命周期结束时,C++编译系统系统自动调用析构函数。 我们要知道析构函数是自动调用的,怎么证明这点呢?我们来写代码吧!

    83910编辑于 2024-10-15
  • c++:虚函数也可以有默认实现吗?

    前言 有人前不久去面试的时候,面试官突然抛出了一个问题: “虚函数也可以有默认函数吗?” 这个问题乍一看很简单,但背后其实能延伸出很多关于 C++ 语言设计和软件工程实践的内容。 虚函数完全可以有默认实现,甚至纯虚函数也能写函数体。 这个问题这其实是个不错的切入点,可以展开聊聊虚函数的方方面面,于是希望这篇文章能帮到准备面试或者想深入理解 C++ 的同学。 一、什么是虚函数? 在 C++ 里,虚函数(virtual function)是实现 运行时多态 的关键。它的本质就是: 在基类里定义函数,并声明为 virtual。 在派生类中可以重写这个函数。 纯虚函数 更有意思的是: 纯虚函数(=0)也可以有默认实现! 这也是为什么很多优秀的 C++ 框架源码里,你会看到“纯虚函数带实现”的写法——它并不是奇技淫巧,而是一种深思熟虑的工程实践。

    21310编辑于 2025-10-22
  • 来自专栏韩曙亮的移动开发专栏

    C++函数重载 ② ( 重载函数调用分析 | 函数重载特点 | 函数重载与默认参数 )

    1、函数重载与默认参数出现的二义性分析 定义 2 个函数 , 其中一个使用 默认参数 , 一个不使用默认参数 , 这两个函数 函数名 相同 , 是重载函数 ; 定义 第 1 个 函数 , 接收 3 个整数参数 , 编译是不会报错的 ; 代码示例 : // 包含 C++ 头文件 #include "iostream" // 使用 std 标准命名空间 // 该命名空间中 , 定义了很多标准定义 using namespace std; // 函数重载 + 默认参数 // 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数 void fun(int i, int j, int k = 10 = 10) { cout << "i = " << i << " , j = " << j << " , k = " << k << endl; } 代码示例 : // 包含 <em>C++</em> 头文件 #include 1 和 <em>函数</em> 2 , 此时出现了 二义性 , 在编译时 , 就会报错 ; 代码示例 : // 包含 <em>C++</em> 头文件 #include "iostream" // 使用 std 标准命名空间 //

    1K20编辑于 2023-10-15
  • 来自专栏韩曙亮的移动开发专栏

    C++函数参数扩展 ( 默认参数 | 默认参数定义规则 | 默认参数定义在参数列表末尾 )

    博客总结 : 在 声明 函数时 , 为 函数参数 定义一个默认值 ; " 默认参数 " 必须 定义在 参数列表 的 末尾 ; 一、默认参数 1、默认参数简介 " 默认参数 " 概念 : C++ 语言 中的 函数 , 可以在 声明 函数时 , 为 函数参数 定义一个默认值 ; " 默认参数 " 运行机制 : 在调用 有默认参数值 的 函数时 , 如果没有提供 某个有默认值参数 的 实参 , 那么编译器在 编译阶段 , 就会使用默认值当做实参 ; " 默认参数 " 可以 简化函数调用 和 提高代码重用性 ; 2、代码示例 - 默认参数 下面的代码中 , 为 void fun(int num = 5) 函数 Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\bin\HostX86\x86\CL.exe”中的内部编译器错误 1> 请选择 Visual C+ 没有默认值 ; 后面两个 num1 和 num2 都是有 默认值 的参数 ; 之后如果还有参数 , 也必须有默认值 ; 如果想要设置没有默认值的参数 , 那么必须放在前面 ; // 设置了默认参数的函数

    2.2K20编辑于 2023-10-15
  • C++类和对象之默认成员函数

    一、默认成员函数有哪些 C++ 类的默认成员函数主要有六个,分别是默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符和移动构造函数、移动赋值运算符(C++11 引入)。 二、各默认成员函数详解 默认构造函数 默认构造函数是用于创建对象时初始化对象的特殊成员函数。它不需要任何参数,如果我们没有在类中显式定义构造函数,编译器会自动生成一个默认构造函数。 对象实例化时系统会⾃动调⽤对应的构造函数。 构造函数可以重载。 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显式定义编译器将不再⽣成。 要注意很多同学会认为默认构造函数是编译器默认⽣成那个叫默认构造,实际上⽆参构造函数、全缺省构造函数也是默认构造,总结⼀下就是不传实参就可以调⽤的构造就叫默认构造。 因为形参会创建一个临时变量,这个临时变量又会进行拷贝 C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,所以这⾥⾃定义类型传值传参和传值返 回都会调⽤拷⻉构造完成。

    12910编辑于 2026-01-15
  • 来自专栏从小白开始修炼

    C++】继承——切片、隐藏、默认成员函数、菱形

    ---- 四、派生类的默认成员函数默认”的意思就是指我们不写,编译器会变我们自动生成一个。那么在派生类中,这几个成员函数是如何生成的呢? 对于普通类成员,默认生成的四个成员函数(构造、析构、拷贝、赋值): 1.内置类型:构造和析构——内置类型不处理,拷贝赋值——内置类型浅拷贝/值拷贝 2.自定义类型:构造和析构——自定义类型调用对应的构造函数和析构函数 而如果父类没有默认构造函数,此时我们就需要去子类提供构造函数,但是父类成员不能在子类通过初始化列表进行初始化: 注意:在初始化列表中必须得去调用父类的构造函数,这是规定死的。 对于默认构造函数,如果父类没有默认构造函数,就需要我们自己去写,显式调用构造 对于析构函数,根据具体实际的情况,如果子类有资源需要释放,那我们就需要自己手动实现析构。 优先使用对象组合有助于你保持每个类被封装 ---- 九、结语 C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。

    72630编辑于 2023-10-15
  • 来自专栏计算机魔术师

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

    前言: 在学习谭浩强《c++面对对象设计》一书中,在学到转换构造函数中, 在转换构造函数中 #include<iostream> 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

    80930编辑于 2022-08-19
  • 来自专栏海天一树

    小朋友学C++(9):构造函数默认参数

    构造函数可以预先赋一个初值,其作用是:在构造函数被调用时,省略部分或全部参数,这时就会使用默认参数代替实参。 Area of rec3 is : 50 分析: 生成对象rec1时,没有传入拷贝构造函数的实参,则形参w和h取默认值0 w = 0, h = 0 在构造函数中,weight = w = 0, height = h = 0 在area函数中, weight * height = 0 生成对象rec2时,传入实参5,相当于传入(5,0),则w = 5, h = 0 在构造函数中,weight = w = 5 , height = h = 0 在area函数中,weight * height = 0 生成对象rec3时,传入实参(5,10),则w = 5, h = 10 在构造函数中, weight = w = 5, height = h = 10 在area函数中,weight * height = 50

    1.6K60发布于 2018-04-17
领券