在 C++ 中初始化物件陣列

Jinku Hu 2023年1月30日 2021年4月29日
  1. 使用 new 運算子在 C++ 中使用引數化建構函式初始化物件陣列
  2. 使用 std::vector::push_back 函式初始化帶有引數化建構函式的物件陣列
  3. 使用 std::vector::emplace_back 函式初始化帶有引數化建構函式的物件陣列
在 C++ 中初始化物件陣列

本文將演示在 C++ 中用引數化建構函式初始化物件陣列的多種方法。

使用 new 運算子在 C++ 中使用引數化建構函式初始化物件陣列

new 運算子是 C++ 動態記憶體管理介面的一部分,它等效於 C 語言中的 malloc 函式。請注意,動態記憶體管理需要使用者分配指定固定大小的記憶體並將其在不再需要時返回給系統的流程。

new 用於從系統請求固定數量的位元組,如果呼叫成功,它將返回指向儲存區域的指標。在下面的示例中,我們定義了一個名為 Pair 的類,它具有兩個建構函式和一個 printPair,以將資料成員輸出到控制檯。首先,我們需要使用 new 運算子分配一個由四對組成的 Pairs 陣列。接下來,我們可以使用 for 迴圈遍歷陣列,並且每次迭代都使用引數化的建構函式初始化該元素。請注意,應該在程式退出之前使用 delete 操作符釋放分配的陣列。還要注意,delete [] 符號對於取消分配陣列的每個元素是必需的。

#include <iostream>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;

class Pair {
    int x, y;
public:
    Pair() = default;
    Pair(int a, int b) : x(a), y(b) {}

    void printPair() const {
        cout << "x: " << x << endl << "y: " << y << endl;
    }
};
int main(){
    Pair *arr = new Pair[4];

    for (int i = 0; i < 4; ++i) {
        arr[i] = Pair(i * 2, i * i);
    }

    for (int i = 0; i < 4; ++i) {
        arr[i].printPair();
    }

    delete [] arr;
    return EXIT_SUCCESS;
}

輸出:

x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9

使用 std::vector::push_back 函式初始化帶有引數化建構函式的物件陣列

另外,更多的無頭方法是將物件儲存在 std::vector 容器中,該容器將提供內建函式來動態初始化新元素。即,Pair 定義保持不變,但是每次迭代時,我們將呼叫 push_back 函式,並將其從第二個建構函式傳遞給 Pair 值。從好的方面來說,我們不必擔心記憶體資源的釋放。他們會自動清理。

#include <iostream>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;

class Pair {
    int x, y;
public:
    Pair() = default;
    Pair(int a, int b) : x(a), y(b) {}

    void printPair() const {
        cout << "x: " << x << endl << "y: " << y << endl;
    }
};
int main(){
    vector<Pair> array;

    for (int i = 0; i < 4; ++i) {
        array.push_back(Pair(i * 2, i * i));
    }

    for (const auto &item : array) {
        item.printPair();
    }

    return EXIT_SUCCESS;
}

輸出:

x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9

使用 std::vector::emplace_back 函式初始化帶有引數化建構函式的物件陣列

用引數化建構函式初始化物件陣列的另一種方法是利用 std::vector 類的 emplace_back 函式。這樣,我們只需要傳遞 Pair 建構函式的值,而 emplace_back 會自動為我們構造一個新元素。像以前的方法一樣,該方法也不需要使用者擔心記憶體管理。

#include <iostream>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;

class Pair {
    int x, y;
public:
    Pair() = default;
    Pair(int a, int b) : x(a), y(b) {}

    void printPair() const {
        cout << "x: " << x << endl << "y: " << y << endl;
    }
};
int main(){
    vector<Pair> array;

    for (int i = 0; i < 4; ++i) {
        array.emplace_back(i * 2, i * i);
    }

    for (const auto &item : array) {
        item.printPair();
    }

    return EXIT_SUCCESS;
}

輸出:

x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Array