讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何定义结构体_c++ struct构造函数使用方法【入门】

胖辰小哥_6248

胖辰小哥_6248

发布时间:2026-02-12 17:39:11

|

779人浏览过

|

来源于php中文网

原创

能,C++中struct可定义构造函数,语法与class一致,但默认访问权限为public;含const或引用成员时必须用初始化列表;定义构造函数后不再为聚合类型,失去{}初始化能力。

c++如何定义结构体_c++ struct构造函数使用方法【入门】

struct 能不能写构造函数?能,但得按 C++ 规则来

可以,C++ 中 struct 和 class 在语法上几乎完全等价,唯一默认区别是成员访问权限:struct 默认 public,class 默认 private。所以你完全可以给 struct 写构造函数,包括默认构造、带参构造、委托构造、甚至初始化列表——只要符合 C++ 标准(C++11 起完全支持)。

常见错误是照搬 C 风格写法,比如只用 {} 初始化或依赖编译器自动生成,结果发现成员没被正确初始化,尤其含指针、对象成员时容易出未定义行为。

  • 必须显式定义构造函数才能控制初始化逻辑;否则编译器可能生成默认构造(若无用户定义构造),也可能不生成(若有其他构造但没默认的)
  • 如果结构体含 const 成员或引用成员,**必须**在构造函数初始化列表中赋值,不能在函数体内用 =
  • 聚合类型(aggregate)一旦定义了任何构造函数,就不再是聚合体,不能再用 {...} 进行聚合初始化(如 MyStruct s{1, "abc"}; 会报错)

怎么写一个带参数的 struct 构造函数?直接像 class 一样写

语法和 class 完全一致,只是把 class 换成 struct。注意初始化列表优先于函数体执行,对资源管理、对象成员构造很关键。

struct Point {
    int x, y;
    Point() : x(0), y(0) {}                    // 默认构造
    Point(int x_, int y_) : x(x_), y(y_) {}   // 带参构造
    Point(const Point& other) : x(other.x), y(other.y) {}  // 拷贝构造
};

使用示例:

立即学习“C++免费学习笔记(深入)”;

Point p1;           // 调用默认构造,x=0, y=0
Point p2(3, 4);     // 调用带参构造,x=3, y=4
Point p3 = {5, 6};  // ✅ 仍可聚合初始化(因为没定义构造函数?等等——这里其实 p3 会调用带参构造,不是聚合!见下条)

⚠️ 注意:上面 p3 = {5, 6} 实际触发的是 Point(int, int) 构造(C++11 起支持直接列表初始化匹配构造函数),不是传统聚合初始化。如果删掉所有构造函数,它才变成纯聚合初始化。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

struct 构造函数里初始化对象成员要注意什么?别漏掉初始化列表

当 struct 含有非 POD 类型成员(如 std::string、std::vector 或自定义类),其构造顺序由声明顺序决定,且**必须通过初始化列表调用其构造函数**,否则会先默认构造再赋值,多一次开销,还可能出错(比如成员没默认构造函数)。

  • 错误写法:MyStruct(string s) { name = s; } → name 先被默认构造,再赋值
  • 正确写法:MyStruct(string s) : name(s) {} → 直接构造,一步到位
  • 如果成员是 const std::string 或 std::string&,不用初始化列表会编译失败
  • 初始化列表中成员顺序必须和声明顺序一致,否则实际初始化顺序仍按声明顺序,容易引发未定义行为(比如用后声明的成员初始化先声明的成员)

什么时候不该给 struct 加构造函数?保持聚合性有实际好处

如果你希望结构体能被广泛用于 C 兼容接口、内存拷贝、序列化(如 memcpy、fwrite)、或需要静态/零初始化(如全局变量、static 局部变量),那就**不要定义任何构造函数**,让它保持聚合类型(aggregate)。

聚合类型的特征是:无用户定义构造函数、无 private/protected 非静态成员、无虚函数、无基类、无默认成员初始化器(C++11 之前)。满足这些,就能用 {} 初始化、支持 std::is_aggregate_v<t></t> 检测、兼容 C ABI。

例如网络协议结构体:

struct Header {
    uint32_t len;
    uint16_t type;
    uint8_t  flags;
    // ❌ 不要加任何构造函数,否则 sizeof 可能变、ABI 可能不兼容、memset 初始化失效
};

真正需要构造逻辑时(比如校验字段、自动填充时间戳、资源分配),再加;否则宁可写个独立的工厂函数,如 make_header(uint32_t l),保持 struct 干净。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

作者最新文章

yandex入口

2026-11-05 16:11

yandex首页

2026-11-05 16:13

Yandex.tm引擎首页

2026-11-05 16:15

Yandex.tm搜索引擎

2026-11-05 16:17

Yandex引擎首页

2026-11-05 16:19

Yandex官网网页版

2026-11-05 16:21

Yandex.tm引擎入口

2026-11-05 16:22

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7139

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2378

2023.09.20

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

5065

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2150

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5371

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7139

2023.08.02

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn