C++中数组的构造函数初始化列表

Posted

技术标签:

【中文标题】C++中数组的构造函数初始化列表【英文标题】:constructor initialization list for an array in c++ 【发布时间】:2017-12-13 11:48:47 【问题描述】:

我在下面有一个创建学生成绩记录的课程。构造函数为数组分配内存并为数组中的每个元素设置一个默认值。我必须传入这个默认值的值。我的问题是,我可以使用构造初始化列表或任何其他方式分配内存并初始化数组的值吗?我不使用动态分配newdelete

 //header file for main.cpp

#include<iostream>

using namespace std;

const int SIZE = 5;
template <class T>
class StudentRecord

    private:
        const int size = SIZE;
        T grades[SIZE];
        int studentId;
    public:
        StudentRecord(T defaultInput);//A default constructor with a default value
        void setGrades(T* input);
        void setId(int idIn);
        void printGrades();
;

template<class T>
StudentRecord<T>::StudentRecord(T defaultInput)

    //we use the default value to allocate the size of the memory
    //the array will use
    for(int i=0; i<SIZE; ++i)
        grades[i] = defaultInput;




template<class T>
void StudentRecord<T>::setGrades(T* input)

    for(int i=0; i<SIZE;++i)
    
        grades[i] = input[i];
    


template<class T>
void StudentRecord<T>::setId(int idIn)

    studentId = idIn;


template<class T>
void StudentRecord<T>::printGrades()

    std::cout<<"ID# "<<studentId<<": ";
    for(int i=0;i<SIZE;++i)
        std::cout<<grades[i]<<"\n ";
    std::cout<<"\n";



#include "main.hpp"

int main()

    //StudentRecord is the generic class
    StudentRecord<int> srInt();
    srInt.setId(111111);
    int arrayInt[SIZE]=4,3,2,1,4;
    srInt.setGrades(arrayInt);
    srInt.printGrades();

    return 0;

【问题讨论】:

有什么理由不能使用 std::vector? C++ 没有运行时可变长度数组,除非通过内存分配。因此,您的选择是使用分配或使用一个足够大的数组以实现 SIZE 的最大可能值并存储每个对象中使用的实际数字。 【参考方案1】:

是的,你可以。下面是一个例子。 Here you can see it working:

class A

        int valLen;
        int* values;
        vector<int> vect;

    public:
        A(int len, ...)
        
            va_list args;
            va_start(args, len);
            valLen = len;
            for(int i=0; i<valLen; i++)
            
                vect.push_back(va_arg(args, int));  
            
            values = &vect[0];
            va_end(args);
        

        void print()
        
            for(int i=0; i<valLen; i++)
                cout << values[i]<<endl;
        
;

int main()

    A aVals[] =A(3, 50,6,78), A(5, 67,-10,89,32,12);

    for(int i=0; i<2; i++)
    
        aVals[i].print();
        cout<<"\n\n";
    
    return 0;

注意:构造函数的第一个参数是数字count,即要传递的值的数量。如果count 是固定的,那么您可以跳过并在constructor 中进行适当的更改。

【讨论】:

你不是在这里创建一个包含 5 个对象的数组,每个对象都有自己的值吗?我在问如何创建一个对象,该对象具有一个名为 grades 的变量,该变量是一个存储 5 个值的数组。所以我想知道是否可以使用构造初始化列表来初始化该数组的值?

以上是关于C++中数组的构造函数初始化列表的主要内容,如果未能解决你的问题,请参考以下文章

函数调用或构造函数调用中的 C++ 数组初始化

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

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

是否可以在 C++ 的成员初始化程序列表中初始化数组?

为啥 C++ 列表初始化也会考虑常规构造函数?

C++初始化列表构造函数VS普通构造函数