ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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. 聚合类的初始化聚合类是一种特殊的类或结构体满足无用户定义的构造函数无私有 / 保护的非静态成员无基类无虚函数。聚合类可直接用初始化列表初始化成员按成员声明顺序。
返回列表