C++ | 类对象初始化

文章目录

  • 概述
  • 一、定义介绍
  • 二、操作教程
    • [1.直接初始化(Direct Initialization)](#1.直接初始化(Direct Initialization))
    • [2.复制初始化(Copy Initialization)](#2.复制初始化(Copy Initialization))
    • [3.列表初始化(List Initialization)](#3.列表初始化(List Initialization))

概述

本节介绍类对象初始化。

一、定义介绍

在C++中通过构造函数将类对象变量初始化为特定值的方法。

二、操作教程

1.直接初始化(Direct Initialization)

直接调用构造函数来初始化对象。

优点

  • 效率高:直接调用构造函数进行初始化,没有临时对象的创建和赋值过程。
  • 灵活性:支持所有形式的构造函数,包括那些只通过构造函数初始化的情况。

缺点

  • 语法复杂:当参数较多时,代码可读性较差。

适用场景

  • 需要高效初始化对象,特别是对于复杂类型或大型对象。
  • 使用带有多个参数或重载的构造函数。
cpp 复制代码
#include <iostream>

class MyClass {
public:
    int x;
    MyClass(int val) : x(val) {}
};

int main() {
    MyClass obj(10); // 直接初始化
    std::cout << "Direct Initialization: " << obj.x << std::endl;
    return 0;
}

2.复制初始化(Copy Initialization)

使用等号赋值进行初始化。

优点

  • 语法简洁:看起来更像赋值,易于理解和阅读。
  • 直观性:对于简单类型和标量类型,语法上接近于变量赋值。

缺点

  • 效率低:可能涉及临时对象的创建和赋值操作,特别是对于复杂对象。
  • 限制多:不适用于所有情况,如对象的移动语义和禁止复制的对象。

适用场景

  • 简单对象的初始化,特别是标量和POD(Plain Old Data)类型。
  • 不需要考虑性能开销的场景。
cpp 复制代码
#include <iostream>

class MyClass {
public:
    int x;
    MyClass(int val) : x(val) {}
};

int main() {
    MyClass obj = MyClass(20); // 复制初始化
    std::cout << "Copy Initialization: " << obj.x << std::endl;
    return 0;
}

3.列表初始化(List Initialization)

使用花括号进行初始化(C++11及以上)。列表初始化提供了一种更加统一和简洁的初始化语法,特别是在涉及到构造包含多个元素的容器时。

优点

  • 统一初始化语法:C++11引入的统一初始化语法,适用于几乎所有类型的初始化。
  • 防止缩窄转换:对于内置类型,可以防止数据类型的缩窄(narrowing)转换。
  • 易于维护:初始化方式更为一致,有助于代码维护和理解。

缺点

  • 支持有限:早期的C++98标准不支持这种语法,依赖于C++11及其后续标准。
  • 潜在歧义:在某些情况下,初始化列表的含义可能不如直接初始化明确。

适用场景

  • C++11及以上标准下的项目。
  • 需要统一初始化语法或防止类型缩窄转换的场景。
  • 初始化STL容器和自定义类型。
cpp 复制代码
#include <iostream>

class MyClass {
public:
    int x;
    MyClass(int val) : x(val) {}
};

int main() {
    MyClass obj{30}; // 列表初始化
    std::cout << "List Initialization: " << obj.x << std::endl;
    return 0;
}

来自:九七的C++
作者原创文章,文章版权归本文作者所有,未经作者同意请勿以任何方式进行复制、转载等盗版操作,请勿用于商业、违法用途!违者自行承担法律责任!

相关推荐
汪款学嵌入式2 分钟前
C语言常用字符串处理函数
c语言
Hunter_pcx14 分钟前
[C++技能提升]插件模式
开发语言·c++
左手の明天1 小时前
【C/C++】C++中使用vector存储并遍历数据
c语言·开发语言·c++
PaLu-LI1 小时前
ORB-SLAM2源码学习:Initializer.cc(13): Initializer::ReconstructF用F矩阵恢复R,t及三维点
c++·人工智能·学习·线性代数·ubuntu·计算机视觉·矩阵
呆呆珝1 小时前
RKNN_C++版本-YOLOV5
c++·人工智能·嵌入式硬件·yolo
.晚街听风~1 小时前
【无标题】
c语言
c++初学者ABC2 小时前
蓝桥杯LQ1044 求完数
c++·算法·lq蓝桥杯
_GR3 小时前
2013年蓝桥杯第四届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯
CodeClimb3 小时前
【华为OD-E卷 - VLAN资源池 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
计算机小混子4 小时前
C++实现设计模式---桥接模式 (Bridge)
c++·设计模式·桥接模式