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

C++构造函数初始化列表

时间:2023-11-03 15:36:36浏览次数:42  
标签:初始化 name int age len score C++ 构造函数

构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用初始化列表。

C++构造函数初始化列表_代码规范

C++构造函数的初始化列表使得代码更加简洁,请看下面的例子:

#include <iostream>
    using namespace std;
    class Student{
    private:
        char *m_name;
        int m_age;
        float m_score;
    public:
        Student(char *name, int age, float score);
        void show();
    };
    //采用初始化列表
    Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
        //TODO:
    }
    void Student::show(){
        cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
    }
    int main(){
        Student stu("小明", 15, 92.5f);
        stu.show();
        Student *pstu = new Student("李华", 16, 96);
        pstu -> show();
        return 0;
    }

运行结果:小明的年龄是15,成绩是92.5李华的年龄是16,成绩是96

C++构造函数初始化列表_程序员_02

如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添加了一个冒号:,后面紧跟m_name(name), m_age(age), m_score(score)语句,这个语句的意思相当于函数体内部的m_name = name; m_age = age; m_score = score;语句,也是赋值的意思。

使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。初始化列表可以用于全部成员变量,也可以只用于部分成员变量。下面的示例只对 m_name 使用初始化列表,其他成员变量还是一一赋值:

Student::Student(char *name, int age, float score): m_name(name){
        m_age = age;
        m_score = score;
    }

注意,成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。请看代码:

C++构造函数初始化列表_成员变量_03

#include <iostream>
    using namespace std;
    class Demo{
    private:
        int m_a;
        int m_b;
    public:
        Demo(int b);
        void show();
    };
    Demo::Demo(int b): m_b(b), m_a(m_b){ }
    void Demo::show(){ cout<<m_a<<", "<<m_b<<endl; }
    int main(){
        Demo obj(100);
        obj.show();
        return 0;
    }

运行结果:2130567168, 100

在初始化列表中,我们将 m_b 放在了 m_a 的前面,看起来是先给 m_b 赋值,再给 m_a 赋值,其实不然!成员变量的赋值顺序由它们在类中的声明顺序决定,在 Demo 类中,我们先声明的 m_a,再声明的 m_b,所以构造函数和下面的代码等价:

Demo::Demo(int b): m_b(b), m_a(m_b){
        m_a = m_b;
        m_b = b;
    }

给 m_a 赋值时,m_b 还未被初始化,它的值是不确定的,所以输出的 m_a 的值是一个奇怪的数字;给 m_a 赋值完成后才给 m_b 赋值,此时 m_b 的值才是 100。

obj 在栈上分配内存,成员变量的初始值是不确定的。

初始化 const 成员变量

构造函数初始化列表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用初始化列表。例如 VS/VC 不支持变长数组(数组长度不能是变量),我们自己定义了一个 VLA 类,用于模拟变长数组,请看下面的代码:

class VLA{
    private:
        const int m_len;
        int *m_arr;
    public:
        VLA(int len);
    };
    //必须使用初始化列表来初始化 m_len
    VLA::VLA(int len): m_len(len){
        m_arr = new int[len];
    }

VLA 类包含了两个成员变量,m_len 和 m_arr 指针,需要注意的是 m_len 加了 const 修饰,只能使用初始化列表的方式赋值,如果写作下面的形式是错误的:

class VLA{
    private:
        const int m_len;
        int *m_arr;
    public:
        VLA(int len);
    };
    VLA::VLA(int len){
        m_len = len;
        m_arr = new int[len];
    }

标签:初始化,name,int,age,len,score,C++,构造函数
From: https://blog.51cto.com/u_15641375/8171318

相关文章

  • C++使用多线程将数据写入文件
    #include<iostream>#include<vector>#include<thread>#include<fstream>//使用多线程将数据写入文件voidwriteToFile(conststd::vector<std::string>&data,conststd::string&filename){//创建一个文件输出流std::ofstreamfile......
  • C++中string类基本使用的详细归纳
    目录:string类的初始化操作实例化得到一个string类对象之后的常用成员函数的操作2.1从外部键盘获取输入的方式(注意与C风格字符串做区别)2.2比较string对象2.3遍历每个字符2.4string类中的insert()增加成员函数2.5string类中的erase()删除成员函数2.6常用基本操作......
  • C++使用new来初始化指向类的指针
    C++使用new来初始化类的指针1.ClassName*p=newClassName;调用默认构造函数。如果类里没有写默认构造函数,会使用编译器帮我们生成的,但不会初始化成员变量,如classNoConstructor//没写构造函数的类{public:~NoConstructor(){}voidprintVal(){......
  • c++实现哈希桶
    闭散列的回顾在前面的学习中我们知道了闭散列的运算规则,当两个数据计算得到的位置发生冲突时,它会自动的往后寻找没有发生冲突的位置,比如说当前数据的内容如下:当插入的数据为33时计算的位置为3,可是位置3已经被占领了并且4也被占领了,但是位置5没有被占领所以插入数据33就会占领位置5,......
  • c: Eclipse IDE for Embedded C and C++ Developers - 2023-09
    https://www.eclipse.org/downloads/            ......
  • c++ STL源码解读
    红黑树map,key不能添加相同的key,如果添加不会报错,但是添加不进去 #include<iostream>#include<map>#include<set>usingnamespacestd;intmain(intargc,charconst*argv[]){map<int,int>a;a.insert(make_pair(1,1));a.insert(make_pair(1,......
  • 安装MySQL初始化问题由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可
    1.关于安装MySQL初始化遇到的问题出现的是如下图错误 这是安装mysql-8.0.25初始化的时候我遇到的报错解决方法如下:安装微软常用运行库合集[下载地址,没有积分的可以评论区联系我](https://download.csdn.net/download/qq_42603590/19686518)安装好之后就不会报错了好了之......
  • C++ 移动构造函数详解
    目录移动构造函数是什么?复制构造和移动构造对比改进的拷贝构造移动构造实现移动构造优点左值、右值、左值引用、右值引用std::move参考移动构造函数是什么?移动构造是C++11标准中提供的一种新的构造方法。先举个生活例子,你有一本书,你已经不想看了,但我非常想看,那么我有哪......
  • python tkinter事件循环中一直检测初始化加载文件有没有加载成功
     pythontkinter事件循环中一直检测初始化加载文件有没有加载成功importtkinterastkdefcheck_file_loaded():#检查文件是否加载成功的逻辑iffile_loaded:#文件加载成功,执行相应操作print("文件加载成功")else:#文件未加......
  • C++_点云和C++函数处理
    点云问题原始点云拼接-运动畸变是指在一帧时间内,激光雷达或者其载体在发生运动后,产生的点云位置不一样的问题点云是没有畸变的,每条激光线束最终会形成一个闭合的圆形===利用运动模型来做运动畸变补偿和ICP方式这些数据包进行点云组帧激光雷达重叠区域......