首页 > 编程语言 >C++(构造函数参数列表初始化)

C++(构造函数参数列表初始化)

时间:2024-07-25 15:07:21浏览次数:13  
标签:初始化 int 成员 C++ 列表 函数参数 构造函数

目录

在C++中,构造函数参数列表初始化(initializer list)是一种用于在对象创建时初始化成员变量的语法。这种方式在性能和可读性方面具有一些优势,尤其是当成员变量是类类型或常量时。



1. 构造函数参数列表初始化的语法

构造函数参数列表初始化的语法是在构造函数的定义中使用一个冒号(:)后跟一个初始化列表。每个成员变量的初始化在列表中通过括号(())或大括号({})进行。

class ClassName {
public:
    ClassName(int a, int b) : member1(a), member2(b) {
        // 构造函数体
    }

private:
    int member1;
    int member2;
};


2. 为什么使用参数列表初始化

  1. 效率

    • 在构造函数体内初始化成员变量通常会导致先调用默认构造函数,然后再赋值。

      而参数列表初始化则避免了这种情况,直接通过初始化列表进行初始化,从而提高了效率。

  2. 常量和引用成员

    • 常量成员(const)和引用成员(&)必须在初始化列表中初始化,因为它们不能在构造函数体内赋值。
  3. 成员类类型

    • 如果成员是一个类类型对象,那么使用初始化列表可以直接调用其构造函数进行初始化,而不是先调用默认构造函数再进行赋值。


3. 示例

#include <iostream>
#include <string>

class Person {
public:
    // 构造函数,使用参数列表初始化
    Person(const std::string& n, int a) : name(n), age(a) {}

    // 显示信息
    void displayInfo() {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }

private:
    std::string name;
    int age;
};

int main() {
    // 创建对象
    Person p("Alice", 30);
    p.displayInfo();

    return 0;
}
Name: Alice, Age: 30


4. 常量和引用成员的示例

#include <iostream>

class Sample {
public:
    // 构造函数,使用参数列表初始化
    Sample(int a, int b) : ref(a), const_member(b) {}

    void displayInfo() {
        std::cout << "Reference: " << ref << ", Constant: " << const_member << std::endl;
    }

private:
    int& ref;             // 引用成员
    const int const_member; // 常量成员
};

int main() {
    int x = 10;
    Sample s(x, 20);
    s.displayInfo();

    return 0;
}


5. 使用参数列表初始化的注意事项

  1. 初始化顺序

    • 初始化列表中成员的初始化顺序是根据它们在类定义中的声明顺序,而不是在初始化列表中的顺序。需要注意这一点以避免潜在的错误。
  2. 避免冗余

    • 尽量避免在构造函数体内对已经在初始化列表中初始化过的成员再次进行赋值操作。


6. 总结

构造函数参数列表初始化在C++中是一个非常重要的特性,它提高了代码的效率和可读性,尤其在处理常量、引用成员以及类类型成员时。



标签:初始化,int,成员,C++,列表,函数参数,构造函数
From: https://www.cnblogs.com/keye/p/18323171

相关文章

  • C++数据和运算符
    回顾:XX.c  gcc专门编译C文件/g++XX.cpp g++专门编译C++文件.exe  执行.out#数据:数据类型****作用******对于计算机来说:编译器预算对象(变量)分配的内存空间大小对于用户来说:方便区分每种数据所代表的含义。什么类型参与运算最后结果还是什么类型基本类型......
  • C++深拷贝构造函数解决浅拷贝的堆区内存重复释放问题
    1.简单介绍先简单介绍一下浅拷贝和深拷贝:浅拷贝->简单的赋值拷贝操作,默认的拷贝构造函数就是浅拷贝。深拷贝->在堆区重新申请空间,进行拷贝操作。2.问题展示下面用代码示例明了地展示默认拷贝构造函数浅拷贝带来地堆区内存重复释放问题:#include<iostream>usingnamespace......
  • C++ printf/std::cout如何重定向到日志文件中
    在C++中,可以使用标准库中的头文件提供的ofstream类来打开文件,并使用std::freopen函数将stdout重定向到该文件。以下是一个示例代码,展示如何将printf输出重定向到日志文件中:#include<cstdio>#include<fstream>intmain(){std::ofstreamlogFile("log.txt",std::ios:......
  • 静态链表(C++)
    一,静态链表简介静态链表使用连续的内存,每个结点记录一个数据和指向下一结点的指针。可以高效的进行插入删除操作。是用整形游标代替结点指针的“单链表”。结构结点类型structnode{size_tcurser;intvalue;};静态链表类型链表中储存结点构成的数组str......
  • ONNXRuntime_C++安装教程
    1打开VisualStudio2017,新建空项目helloworld 2浏览输入onnxruntime,安装第一个,版本选择1.18.1 3配置PATH环境变量4配置项目包含目录 5配置库目录6配置链接器 配置opencVhttps://blog.csdn.net/qq_27825451/article/details/103036687 无法启动应用......
  • SvelteKit - 1. 初始化项目
    官方doc-createaproject1、基本环境(下面是我这里的环境,亲测用node14和16install会报错)node:20.9.0npm:10.1.02、初始化项目npmcreatesvelte@latestmy-appcdmy-appnpminstallnpmrundevcreate时的选择:其中第一步选择创建应用的类型,有三个可供选......
  • C++自学笔记15(数组)
    指针是C++中数组的工作方式,没有指针基础可以看笔记6。数组就是一堆变量的集合,有没有感觉与结构体很相似?让我们来考虑下在结构体中我们仅仅是定义了几个变量例如定义x,y坐标与speed速度。如果我们需要64个变量表示某个东西的64种状态,那么你会看到inta0=0;inta1=1;inta2......
  • C++自学笔记16(字符串与字符串字面量)
    当我们想在电脑上以文本方式表示东西时,一个单词、一个句子、一大段文章都叫做字符串。字符串就是为了我们去处理文字文本的方法。字符串实际上就是字符组成的数组或指针(数组就是指针的一种)。(有人会问数组不是储存数字么?怎么储存字符?因为ASCLL码表将所有字母、数字、符号翻译......
  • C++11——lambda表达式
    一、前言在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。intmain(){ intarray[]={4,1,8,5,3,7,0,9,2,6}; //默认按照小于比较,排出来结果是升序 sort(array,array+sizeof(array)/sizeof(array[0])); //如果需要降序,需要改变元素......
  • C++学习笔记(03)——通讯录管理系统设计
    记录一下利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信息删除联系人:按照姓名进行删除指定联系人查找联系人:按照姓名查看指定联系人......