首頁 > 後端開發 > C++ > 沒有公共預設構造函數可以實現物件數組初始化嗎?

沒有公共預設構造函數可以實現物件數組初始化嗎?

Patricia Arquette
發布: 2024-12-20 09:41:10
原創
200 人瀏覽過

Can Object Array Initialization Be Achieved Without a Public Default Constructor?

不帶預設建構子的物件陣列初始化

考慮以下程式碼:

#include <iostream>
class Car
{
private:
  Car(){};
  int _no;
public:
  Car(int no)
  {
    _no=no;
  }
  void printNo()
  {
    std::cout<<_no<<std::endl;
  }
};
void printCarNumbers(Car *cars, int length)
{
    for(int i = 0; i<length;i++)
         std::cout<<cars[i].printNo();
}

int main()
{
  int userInput = 10;
  Car *mycars = new Car[userInput];
  for(int i =0;i < userInput;i++)
         mycars[i]=new Car[i+1];
  printCarNumbers(mycars,userInput);
  return 0;
}
登入後複製

此程式碼旨在旨在建立一個汽車數組,但編譯時遇到錯誤,指出Car() 建構子是私有的。問題是,可以在不公開 Car() 建構函數的情況下執行初始化嗎?

為了解決這個問題,可以使用placement-new,如下所示:

class Car
{
    int _no;
public:
    Car(int no) : _no(no)
    {
    }
};

int main()
{
    void *raw_memory = operator new[](NUM_CARS * sizeof(Car));
    Car *ptr = static_cast<Car *>(raw_memory);
    for (int i = 0; i < NUM_CARS; ++i) {
        new(&amp;ptr[i]) Car(i);
    }

    // destruct in inverse order    
    for (int i = NUM_CARS - 1; i >= 0; --i) {
        ptr[i].~Car();
    }
    operator delete[](raw_memory);

    return 0;
}
登入後複製

Placement-new 允許在特定位置分配記憶體並建構物件。在這種情況下,會指派raw_memory,然後使用placement-new在ptr指向的位址建構Car物件。

利用placement-new,可以實現汽車陣列的初始化,同時尊重 Car() 建構函數的隱私

以上是沒有公共預設構造函數可以實現物件數組初始化嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板