新闻详情

新闻详情

首页 / 资讯中心 / 详情

c++中类的对象初始化的实现示例

发布时间:2026/10/1 9:14:33来源:尧图网络
c++中类的对象初始化的实现示例
在 C 中类的对象初始化是创建对象时为其成员变量赋予初始值的过程核心依赖构造函数类的特殊成员函数。根据场景和需求对象初始化有多种方式下面详细介绍一、构造函数初始化的核心构造函数是与类同名的特殊成员函数用于对象创建时的初始化其特点无返回值无需写void可重载定义多个参数不同的构造函数若未手动定义编译器会生成默认构造函数无参仅为成员变量执行默认初始化。二、对象初始化的具体方式1. 默认初始化无参构造函数当类有默认构造函数无参构造函数时可直接创建对象无需传递参数。默认构造函数的来源手动定义类名()编译器自动生成仅当未定义任何构造函数时。示例123456789101112131415161718192021222324252627#include iostreamusingnamespacestd;classPerson {private:string name;intage;public:// 手动定义默认构造函数Person() {name Unknown;age 0;cout 默认构造函数被调用 endl;}voidshow() {cout Name: name , Age: age endl;}};intmain() {// 默认初始化调用默认构造函数Person p1;// 正确无参构造p1.show();// 输出Name: Unknown, Age: 0return0;}注意若手动定义了带参构造函数编译器不再生成默认构造函数此时需显式定义否则Person p1;会报错。2. 带参数的构造函数初始化通过自定义带参数的构造函数在创建对象时传递参数直接初始化成员变量。示例123456789101112131415161718192021222324classPerson {private:string name;intage;public:// 带参数的构造函数Person(string n,inta) {name n;// 为成员变量赋值age a;cout 带参构造函数被调用 endl;}voidshow() {cout Name: name , Age: age endl;}};intmain() {// 用带参构造函数初始化Person p2(Alice, 18);// 直接传递参数p2.show();// 输出Name: Alice, Age: 18return0;}3. 成员初始化列表推荐构造函数的成员初始化列表用于在进入构造函数体之前直接初始化成员变量而非在函数体内赋值。适用场景初始化const成员变量必须在定义时初始化初始化引用成员必须在定义时初始化初始化没有默认构造函数的成员对象如类的成员是另一个类的对象且该类无默认构造。语法123类名(参数列表) : 成员1(值1), 成员2(值2), ... {// 构造函数体可空}示例12345678910111213141516171819202122232425classPerson {private:string name;constintage;// const成员必须初始化int id;// 引用成员必须初始化public:// 成员初始化列表直接初始化成员Person(string n,inta,int i) : name(n), age(a), id(i) {// 构造函数体可做其他操作无需再给成员赋值cout 成员初始化列表被使用 endl;}voidshow() {cout Name: name , Age: age , ID: id endl;}};intmain() {intnum 1001;Person p3(Bob, 20, num);// 传递参数到初始化列表p3.show();// 输出Name: Bob, Age: 20, ID: 1001return0;}优势比在构造函数体内赋值更高效直接初始化而非先默认构造再赋值。4. 拷贝构造函数初始化用已存在的对象初始化新对象时会调用拷贝构造函数。拷贝构造函数的语法参数必须是同类对象的const引用123类名(const类名 已有对象) {// 用已有对象的成员初始化当前对象的成员}调用场景用对象 A 初始化对象 B类名 B A;或类名 B(A);对象作为函数参数按值传递函数返回对象按值返回。示例123456789101112131415161718192021222324252627282930classPerson {private:string name;intage;public:// 带参构造函数Person(string n,inta) : name(n), age(a) {}// 拷贝构造函数自定义Person(constPerson other) {name other.name;// 拷贝other的nameage other.age;// 拷贝other的agecout 拷贝构造函数被调用 endl;}voidshow() {cout Name: name , Age: age endl;}};intmain() {Person p4(Charlie, 22);// 先创建p4Person p5 p4;// 用p4初始化p5调用拷贝构造Person p6(p4);// 另一种写法同样调用拷贝构造p5.show();// 输出Name: Charlie, Age: 22p6.show();// 输出Name: Charlie, Age: 22return0;}注意若未手动定义拷贝构造函数编译器会生成默认拷贝构造函数浅拷贝。若类中包含指针成员浅拷贝可能导致内存问题需手动实现深拷贝。5. 列表初始化C11 及以上使用大括号{}初始化对象支持多种场景且更安全防止窄化转换如int不能隐式接收double的小数部分。示例1234567891011121314151617181920classPerson {private:string name;intage;public:// 带参构造函数支持列表初始化Person(string n,inta) : name(n), age(a) {}voidshow() { cout name , age endl; }};intmain() {// 列表初始化调用带参构造Person p7{David, 25};// 等价于 Person p7(David, 25);Person p8 {Eve, 26};// 也支持等号大括号p7.show();// David, 25p8.show();// Eve, 26return0;}优势统一初始化语法可用于内置类型、数组、容器等防止窄化转换如Person p{123.45, abc}会编译报错因参数类型不匹配。6. 委托构造函数C11 及以上允许一个构造函数调用同一个类的另一个构造函数减少代码重复。示例1234567891011121314151617181920212223242526classPerson {private:string name;intage;public:// 核心构造函数带参数Person(string n,inta) : name(n), age(a) {cout 核心构造函数被调用 endl;}// 委托构造调用带参构造函数默认name为Unknownage为0Person() : Person(Unknown, 0) {cout 委托构造函数无参被调用 endl;}// 委托构造调用带参构造函数仅指定agename默认GuestPerson(inta) : Person(Guest, a) {cout 委托构造函数仅age被调用 endl;}};intmain() {Person p9;// 调用无参委托构造 → 核心构造Person p10(30);// 调用单参委托构造 → 核心构造return0;}输出核心构造函数被调用委托构造函数无参被调用核心构造函数被调用委托构造函数仅age被调用7. 聚合类的初始化聚合类是一种特殊的类或结构体满足无用户定义的构造函数无私有 / 保护的非静态成员无基类无虚函数。聚合类可直接用初始化列表初始化成员按成员声明顺序。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

BP神经网络分类鸢尾花与红酒:手写实现与实验报告避坑指南 2026/10/1 13:43:20

BP神经网络分类鸢尾花与红酒:手写实现与实验报告避坑指南

简介:这是一套基于BP神经网络模型完成鸢尾花与红酒数据集分类的完整实践项目,适合作为机器学习课程设计、期末大作业或毕业设计的参考。项目包含Python源码、Jupyter Notebook演示、实验报告和答辩PPT,代码附有详细注释,即使基础薄…

阅读更多 →
猪目标检测数据集:634张实拍图+VOC/YOLO双格式标注 2026/10/1 13:43:20

猪目标检测数据集:634张实拍图+VOC/YOLO双格式标注

简介:本资源是一套面向计算机视觉初学者与农业AI研究者的猪类目标检测专用数据集,适用于YOLO、Faster R-CNN等主流检测模型的训练与验证。数据集共1903个文件,包含634张JPG格式猪图像(1–500KB)、634份PASCAL VOC标准X…

阅读更多 →
从Agent训练场到防作弊:构建可规模化的沙箱评测体系 2026/10/1 13:43:20

从Agent训练场到防作弊:构建可规模化的沙箱评测体系

1. Agent训练场的核心逻辑与规模背后做Agent开发这段时间,我越来越清楚一件事:真正难的不是把模型接进工具链,而是怎么在一个可控环境里反复验证它“能不能干正事”。DeepSeek把Agent训练场公开出来,我第一反应是终于有人把这件事…

阅读更多 →
WebSocket网页聊天室实战:从协议握手到多进程广播与部署避坑 2026/10/1 13:43:20

WebSocket网页聊天室实战:从协议握手到多进程广播与部署避坑

简介:这是一份面向Web开发初学者与即时通讯爱好者的实战型资源包,围绕WebSocket协议构建网页聊天室,帮助读者理解全双工通信、连接建立与消息收发等核心机制,并可作为课程设计或练手项目的参考实现。压缩包共5个文件,约…

阅读更多 →
space bunny:5分钟将Python脚本变成可分享的opencode在线环境 2026/10/1 13:43:20

space bunny:5分钟将Python脚本变成可分享的opencode在线环境

1. 项目概述:一场关于开源生态位争夺的实操复盘 “space bunny 连续 5 天登顶 opencode”——这句话在最近一周的技术社区里反复刷屏,不是因为某个新模型发布,也不是因为融资消息,而是因为它精准击中了当前开发者最敏感的神经&am…

阅读更多 →
若依框架路由跳转与参数传递全解析 2026/10/1 13:43:13

若依框架路由跳转与参数传递全解析

接手过不少若依(RuoYi)二次开发的需求,也带过不少刚接触这个框架的同事。几乎每个刚上手的人都会卡在同一个问题上:在列表页点一下“详情”按钮,怎么跳到另一个页面,还顺手把当前行的 ID 传过去&#xff1f…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉