C++组合类型中默认成员初始化方法有哪些

来源:前端技术作者:新井头衔:网络博主
导读:本期聚焦于小伙伴创作的《C++组合类型中默认成员初始化方法有哪些》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++组合类型中默认成员初始化方法有哪些》有用,将其分享出去将是对创作者最好的鼓励。

C++中的组合类型主要指类和结构体,默认成员初始化指的是在创建组合类型对象时,若没有显式给成员赋值,成员会自动获得预设的初始值。不同的初始化方法有不同的生效逻辑,下面逐一介绍常见的实现方式。

C++组合类型中默认成员初始化方法有哪些

类内初始值初始化

从C++11标准开始,允许在组合类型的成员声明时直接赋予初始值,这就是类内初始值。当创建对象时没有通过其他方式给该成员赋值,就会使用这个预设的初始值。

#include <iostream>
#include <string>

struct Student {
    // 类内初始值,默认初始化为18
    int age = 18;
    // 类内初始值,默认初始化为空字符串
    std::string name = "";
};

int main() {
    Student s1;
    std::cout << "默认年龄: " << s1.age << std::endl;
    std::cout << "默认姓名: " << s1.name << std::endl;
    return 0;
}

这种方式的好处是初始化逻辑和成员声明放在一起,可读性更强,也避免了忘记初始化成员的问题。

构造函数初始化列表初始化

组合类型的构造函数可以通过初始化列表为成员设置默认值,当创建对象时调用该构造函数且没有传入对应参数,就会使用初始化列表中的值。

#include <iostream>

class Person {
private:
    int id;
    float salary;
public:
    // 构造函数初始化列表,设置默认id为1001,默认salary为3000.0
    Person() : id(1001), salary(3000.0) {}
    
    // 带参数的构造函数,会覆盖默认值
    Person(int inputId, float inputSalary) : id(inputId), salary(inputSalary) {}
    
    void printInfo() {
        std::cout << "ID: " << id << ", Salary: " << salary << std::endl;
    }
};

int main() {
    Person p1;
    p1.printInfo(); // 输出默认初始化的id和salary
    
    Person p2(1002, 4500.0);
    p2.printInfo(); // 输出传入的参数值
    return 0;
}

需要注意的是,初始化列表的初始化优先级高于类内初始值,如果同时存在,会优先使用初始化列表的值。

默认构造函数与值初始化

如果用户没有定义任何构造函数,编译器会自动生成默认构造函数,此时如果创建对象时使用组合类型名 对象名{}的形式进行值初始化,内置类型成员会被初始化为0,类类型成员会调用其自身的默认构造函数。

#include <iostream>

struct Data {
    int num;
    double score;
};

int main() {
    Data d1{}; // 值初始化,num为0,score为0.0
    std::cout << "num: " << d1.num << ", score: " << d1.score << std::endl;
    return 0;
}

如果创建对象时没有加花括号,比如Data d1;,对于内置类型成员,是否初始化取决于变量是全局还是局部,局部的内置类型成员不会被默认初始化,值是未定义的,这也是容易出现bug的地方。

不同方法的优先级说明

当多种默认初始化方式同时存在时,生效的优先级顺序如下:

  • 构造函数初始化列表的优先级最高,会直接覆盖其他默认值
  • 其次是类内初始值,当没有初始化列表赋值时生效
  • 最后是值初始化的默认规则,当既没有初始化列表也没有类内初始值时,使用值初始化的规则

注意事项

首先,类内初始值不能使用圆括号,比如int age(18);是不合法的,只能用等号或者花括号,比如int age = 18;或者int age{18};

其次,对于常量成员和引用类型成员,必须在构造函数初始化列表中完成初始化,不能使用类内初始值之外的其他方式,否则会编译报错。

最后,如果组合类型包含数组成员,类内初始值不能直接初始化数组,需要通过构造函数初始化列表或者默认构造函数的逻辑来完成数组的默认初始化。

C++组合类型默认成员初始化类成员初始化结构体初始化修改时间:2026-07-21 13:30:36

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。