2.1 默认构造函数的构造操作

C++默认构造函数的构造操作 默认构造函数的构造操作1 成员对象带默认构造函数1.1 行为1.2 示例代码1.3 输出2 父类型带默认构造函数2.1 行为2.2 示例代码12.3 输出12.4 示例代码22.5 输出23 两者兼有的情况3.1 行为3.2 示例代码3.3 输出4 参考资料 1 成员对象带默认构造函数 1.1 行为 外部对象包含成员对象时,没有显式调用成员对象构造函数时,编译器会自动添加调用; 1.2 示例代码 ... 阅读详情

Q1:什么时候编译器会合成默认构造函数?

Wrong idea: 当类中无构造函数时

①.若数据成员为类类型,且该类类型具有默认构造函数,则将调用其默认构造函数
②.若数据成员为内置类型,则按照系统的初始化规则进行初始化

**注:不满足四种情况时得到的是 implicit trival default constructors,实际上并不会合成出来。

Accurate idea: 当编译器需要时才会合成
①.当类有四种情况时,编译器会合成 implicit nontrivial default constructors。合成出的构造函数只能满 足编译器的需要,调用成员对象的默认构造函数或基类的默认构造函数或为每一个对象初始化虚函数机制或 虚基类机制而完成。

②.只有基类子对象与类对象成员才会被初始化,其他所有 nonstatic 成员将不会被初始化

1) Eg:

class A
    {
    public:
        int x;
        double str;
    };

    int main()
    {
        A a;
        cout << a.str << endl;
        cout << a.x << endl;
        system("pause");
    }

• 此时数据成员均为内置类型,将不会合成默认构造函数
• 在VS中运行改程序,将报错:使用未初始化的局部变量
• 在gcc中正常编译,输出结果未定义
• 此时初始化操作为:程序需要

2) Eg:

class A
{
public:
    int x;
    string str;
};


int main()
{
    A a;
    cout << a.str << endl;
    cout << a.x << endl;
    system("pause");
}

• 此时将会合成默认构造函数,但该函数仅调用了string 的默认构造函数对str 进行初始化
• x成员仍未初始化,但此时在VS中运行正确,str为空字符,x未定义
• 此时初始化操作为:编译器需要

Q2:以下四种情况下编译器将合成有用的默认构造函数 ——即编译器需要时

1) 类中含有"带有默认构造函数" 的类对象成员

2) 类的基类"带有默认构造函数"

3) 带有虚函数的类

4) 带有虚基类的类

Q3:“带有 Default Constructor”的 Member Class Object

说明:若一个类没有任何构造函数,但它内含一个成员对象,该成员对象有默认构造函数,那个这个类的 implicit default constructor 就是 ” nontrivial”,编译器需要为该类合成出一个默认构造函数

1) Eg: 不满足程序的需求,无自定义构造函数

class A
    {
    public:
        A();
    };

    class B
    {
    public:
        A a;
        char * ptr;
    };

    int main()
    {
        B b;
        //...
    }

• 在上述程序中,将合成一个默认构造函数
• 合成的默认构造函数仅调用A的默认构造函数来处理 B::a
• 并无任何代码处理 B::ptr
• B::a 的初始化时编译器的责任,而 B::ptr的初始化时程序员的责任

2) Eg:不满足程序的需求,且存在自定义构造函数

    class A
    {
    public:
        A();
    };

    class B
    {
    public:
        B(){ ptr = 0; }
        A a;
        char * ptr;
    };

    int main()
    {
        B b;
        //...
    }

上述类B的构造函数将被扩展为:

    B()
        {
            a.A::A();   //强行插入调用类成员对象的默认构造函数的代码,按声明顺序插入
            ptr = 0;
        }

• 在上述程序中,将不会合成默认构造函数,因为已经人为定义了
• 如果类中含有类对象成员,则该类的每一个构造函数都必须调用每一个类对象成员的默认构造函数
• 在无法合成的情况下,将在用户代码执行前,强行插入调用必要的默认构造函数的代码

Q4:“带有Default Constructor”的 Base Class

说明,若类继承自带有默认构造函数的基类,则该继承类在编译的时候需要调用基类的默认构造函数。按声明顺序调用。

对于同时存在类对象成员的情况:按声明顺序先调用基类的默认构造函数,再按声明顺序调用类成员对象的默认构造函数

Q5:“带有一个 Virtual Function ”

说明:若有以下两种情况,需要合成默认构造函数:

1) class声明(或继承)一个虚函数
2) class派生子一个继承串链,其中有一个或多个virtual base class

以下扩张行为将发生在编译器:

1) 编译器生成一个 virtual function table,其中放置类的虚函数的地址
2) 每一个类对象中,编译器将合成一个额外的指针成员(vptr),内含与其相关的 类 vtbl 的地址

• 对类定义的每一个构造函数,编译器将安插一些代码来为类对象的 vptr 设置初值,放置何时的 vitual table 的地址
• 对没有定义构造函数的类,将合成默认构造函数,以便正确的初始化每一个类对象的 vptr

Q6:“带有一个Virtual Base Class”

说明:共同点 – 虚基类在派生类中的位置必须在执行期准备妥当

对于以下例子进行分析:

    class X{ public: int i; };
    class A : public virtual X{ public: int j; };
    class B : public virtual X{ public: double d; };
    class C : public A, public B { public: int k; };

    void foo(A * pa)
    {
        pa->i = 1024;
    }

    int main()
    {
        foo(new A);
        foo(new C);
    }

分析:编译器将无法固定住 foo()中 “通过 pa 而存取的 X::i 的实际偏移位置”,因为 pa 的真正类型无法确定。编译器必须改变 “执行存取操作的代码”,使得 X::i 可以延迟至执行器才确定下来。

一种办法:在派生类对象的每一个虚基类中安插一个指针,派生类中所有通过引用与指针来存取一个虚基类的操作都可以通过相关指针完成。foo()可改写为:
    void foo(A * pa)
    {
        pa->__vbcX->i = 1024;
    }

其中,__vbcX表示编译器生成的指向虚基类 X 的指针。__vbcX 是在类对象的构造期间生成的,对类所定义的每一个构造函数,编译器将要安插那些 “允许每一个虚基类的执行期存取操作的代码”。

AI影像组学在结直肠癌诊疗中的应用:从特征提取到临床决策 影像组学通过高通量计算从医学影像中提取定量特征,揭示肿瘤内部的微观生物学行为,这些特征反映了纹理异质性、形状不规则度等影像表型。其核心原理在于将图像数据转化为可分析的数字特征,结合机器学习算法进行模式识别,从而实现对疾病状态的精准预测。这一技术的价值在于能够无创、定量地评估肿瘤特性,为精准医疗提供关键支持。在临床实践中,AI驱动的影像组学模型广泛应用于结直肠癌的诊疗全链条,包括肿瘤良恶性鉴别、基因突变预测、治疗反应评估和预后分析等场景。通过整合影像组学特征与临床数据,可以构建预测模型,辅助医生进行更准确的诊 阅读详情

相关推荐

ESP32+micro-ROS机器人开发实战:轻量级ROS2嵌入式集成

ROS2是现代机器人软件栈的核心框架,其基于DDS的分布式通信与QoS保障能力为多节点协同提供基础支撑;而micro-ROS作为专为微控制器优化的ROS2兼容中间件,解决了资源受限设备(如ESP32)接入ROS2生态的关键难题。其通过分层架构将DDS通信下沉至上位机Agent,使MCU仅需运行轻量Client,大幅降低内存开销(实测<180KB)并保留标准ROS2接口语义。该方案广泛应用于教育机器人、移动底盘、传感器节点等嵌入式场景,尤其适合基于ESP-IDF开发的Wi-Fi/BLE物联网机器人系统。本文以

weixin_29025501的博客 400

VS编译报错:error C2512: “testStruct”: 没有合适的默认构造函数可用

VS编译时出错,结构体“testStruct”没有合适的默认构造函数可用

m0_60352504的博客 1843

Trae编程工具Cline插件深度集成与Claude 3.7 API Key高级配置实战

本文详细介绍了如何在Trae编程工具中深度集成Cline插件并配置Claude 3.7 API Key的高级技巧。通过实战案例,展示了如何提升代码补全质量、实现多轮对话记忆及自定义代理设置,特别适合全栈工程师和需要私有化AI服务的团队。文章还涵盖了安装流程、API Key获取方式及企业级部署的最佳实践。

weixin_28829903的博客 436

c++ error C2512:没有合适的默认构造函数可用

这是我最近学习c++过程中遇到的一个问题,同时也说明了自定义类的使用,这里借用别人的例子来说明一下这个问题。 View Code 1 #include "stdafx.h" 2 using namespace std; 3 4 /* --- --- --- --- --- --- --- 武器类 --- --- --- --- --- --- */ 5...

a3amux18550的博客 4380

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

2019年电赛D题《简易电路特性测试仪》全过程

2019年全国大学生电子设计大赛D题《简易电路特性测试仪》硬件部分及故障分析

zzhao2580的博客 5万+

error C2512: “HelloWorld”: 没有合适的默认构造函数可用

error C2512: “HelloWorld”: 没有合适的默认构造函数可用 c++ newbie error C2512: no appropriate default constructor available 解决办法 在类中添加一个空的构造函数。问题解决 实例 错误程序 #include <iostream> #include "hellow...

weixin_40626724的博客 2381

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds.

在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多`

“Allen Su”的博客 2235

error: C2512: “Ui::XXX”: 没有合适的默认构造函数可用

更新需求: 起初AA类是一个普通C++类,用于处理一些数据,BB类(设计师界面类)继承自他 现在需要将AA类设计为设计师界面类,BB类、CC类等均可继承自他,共用AA的界面(共用部分控件) 现采用如下方式: 1、在BB的.h文件中声明命名空间 namespace Ui{ class BB; } 2、在.h文件中声明ui指针对象 private: Ui::AA *ui; ...

xumingyifrend的博客 2408

神经形态芯片:IBM TrueNorth技术详解以及应用案例

2018年的一项演示中,机器人使用TrueNorth处理了复杂的路径规划,功耗仅为传统系统的1/10。它通过模仿人脑的结构,解决了传统芯片在功耗和并行性上的痛点,并在图像识别、物联网和机器人等领域展现了强大潜力。:不同于传统芯片的时钟驱动,TrueNorth是事件驱动的。例如,工厂中的振动传感器使用TrueNorth检测设备故障的早期迹象,实现了更高效的维护策略,避免了停机时间。:在医疗领域,TrueNorth可以用于可穿戴设备,比如一个智能助听器,它能过滤噪音并增强特定声音,功耗低到可以用纽扣电池供电。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2477

【异常】OpenAI提示内容有误 Invalid prompt: your prompt was flagged as potentially violating our usage policy.

用户需优先调整提示内容,确保符合OpenAI的使用政策。若问题持续,建议结合请求ID和具体代码示例联系官方支持。同时,可参考腾讯云、Microsoft Q&A等平台提供的错误处理实践(如重试机制、日志记录)优化代码健壮性。

奶爸的编程之路,也就一周冷个三天 2075

类的6个默认成员函数:1.构造函数2.析构函数3.拷贝构造函数4.赋值操作符重载5.取地址操作符重载6.常const修饰取地址操作符重载

     如果类中什么成员都没有,简称空类。空类并非什么都没有,任何类在我们不写的情况下,都会自动生成6个默认成员函数。 class Date{}; 1. 构造函数 1.1 概念      构造函数是一个特殊的成员函数,名字和类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的声明周期只调用一次。 1.2 特征     1.函数名与类名相同    &nb

shuangweiyebai的博客 208

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++默认构造函数

最近在看《深度探索C++对象模型》,看的头大。对于c++默认构造函数,一直有两个错误的认识。 1,没有定义默认构造函数的类都会被编译器生成一个默认构造函数。 2,编译器生成的默认构造函数会初始化所有数据成员。 而lippman在书中告诉我们 以上两个理解是错误的。 先看第2条,举个例子。 #include using namespace std; class Base {

学习笔记 804

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

编译器自动生成默认构造函数的四种情况

在以下四种情况中,如果类中没有定义一个默认构造函数,则编译器会自动生成一个nontrivial的默认构造函数,而不是一个不做事情的trivial默认构造函数:1.内含一个成员变量,而这个成员变量所属的类中含有默认构造函数,则此时需要为此类生成一个implicit default constructor(隐式的默认构造函数),这个implicit default constructor是nontri...

weixin_33752045的博客 1382

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++中若类中没有默认构造函数,如何使用对象数组

前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: 1 #include <memory> 2 #include <iostream> 3 4 using namespace std; 5 ...

1812

java 初始化类的成员变量,在无参的构造函数中给成员变量赋值和在成员变量后直接指定默认值有什么区别

在这个例子中,value1 是在构造函数中初始化赋值的,而 value2 则是在定义时指定的默认值。可控性不同:在构造函数中进行赋值的方式可以更加灵活,可以根据需要对成员变量进行特定的初始化操作,而默认值方式则不能满足这种需求。默认值的赋值时机不同:成员变量的默认值是在对象创建时赋值的,而在构造函数中进行的赋值则是在对象创建后,构造函数执行时进行的。赋值方式不同:成员变量的默认值是在定义时直接指定的,而在构造函数中进行的赋值则需要编写相应的语句来实现。

KissTooTrue的博客 815

string容器构造函数的四种形式

#include<iostream> #include<string> using namespace std; //string容器构造函数 void test1() { //默认构造函数 string s1; const char* s = "hello world"; string s2(s); cout << "s2=" << s2 << endl; string s3(s2); cout << "s3=" &l.

courage_lizy的博客 230

java中数组的结构_java中数组元素作为类的成员是构造函数的写法,如下例

importjava.util.Scanner;publicclassa1_07{staticclassmatris{privateintrow;privateintcol;privatedoubledata[][];publicmatris(){row=2;col=2;doubledata1[][]={{1,2},{3,4}};}pub...import java.util.Scanner;pu...

weixin_35851553的博客 433

C++构造函数的初始化列表

构造函数初始化列表 详细内容可以看《Effective C++》的条款4 对非内置类型成员变量,推荐使用类构造函数的初始化列表,但有时必须用带有初始化列表的构造函数: 没有默认构造函数的成员类对象 const成员或引用类型的成员 构造函数初始值列表只能说明用于初始化成员的值,而不限定初始化的具体执行顺序,成员的初始化顺序与它们在类定义中的出现顺序一致。 构造函数的执行可以分成两个阶段,初始化阶段...

zh_ch_yu的博客 337

C++类与对象(中)---类的6个默认成员函数:构造函数,析构函数,拷贝构造函数,赋值运算符重载,取地址及const取地址操作符重载,const 成员

类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成6个默认成员函数:构造函数,析构函数,拷贝构造函数,赋值操作符重载函数,取地址操作符重载,const取地址操作符重载 构造函数 代码演示: #include<iostream> using std :: cout; using std :: ...

wang_yiduo的博客 327

C++默认构造函数——深入理解

错误认识1:若程序员没有自己定义无参数的构造函数,那么编译器会自动生成默认构造函数,来进行对成员函数的初始化。 错误认识2:编译器合成出来的default constructor会明确设定'“class内每一个data member的默认值”。但这两种种认识是有误的,不全面的。 正确认识: 默认的构造函数分为有用的和无用的,所谓无用的默认构造函数就是一个空函数、什么操作也不做,而有用的默

HAN Kai 6万+

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

一、默认构造函数 1、默认无参构造函数 2、默认拷贝构造函数 二、构造函数调用规则 1、构造函数规则说明 2、代码示例 - 只定义拷贝构造函数 3、代码示例 - 只定义有参构造函数

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6482

C++中默认构造函数和构造函数初始化列表

1、默认构造函数和构造函数 (1)构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void))。 (2)默认构造函数:默认构造函数是在调用时不需要显示地传入实参的构造函数。 一个类如果自己没有定义构造函数,则会有一个无参且函数体也是空的默认构造函数。只要程序员定义了构造函数,编译器就不会再提供默认构造函数了。 定义默认构造函数有两种方式,...

king_weng的博客 1万+

C++ 构造函数详解

在定义类的成员函数的时候,一般的成员函数与普通的全局函数没有太大的区别,在定义函数的时候都需要说明要返回的类型,但是,类中有一种函数比较特殊,函数名与类名相同,且没有返回值类型,这中函数称为构造函数,它承担着类初始化的工作,非常重要。常用的构造函数有默认构造函数、一般构造函数、拷贝构造函数、转换构造函数、移动构造函数。

a1367666195的博客 1万+

构造函数,拷贝构造函数,赋值操作符的调用时机

#include class TEST { public: TEST() { cout<<"默认构造函数"<<endl; } TEST(const TEST&t) { cout<<"拷贝构造函数"<<endl; } TEST &operator =(const TEST&t) { cout<<"赋值操作符"<<endl; return *this; } };

coderchen 1408
上一篇: 1.3 编程范式
下一篇: 2.2 复制构造函数的构造操作
Virtual_Func
博客等级 码龄11年 38粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值