Pertanyaan Bagaimana cara menginisialisasi variabel anggota const di kelas?


#include <iostream>

using namespace std;
class T1
{
  const int t = 100;
  public:

  T1()
  {

    cout << "T1 constructor: " << t << endl;
  }
};

Ketika saya mencoba menginisialisasi variabel anggota const t dengan 100. Tapi itu memberi saya kesalahan berikut:

test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static

Bagaimana saya bisa menginisialisasi a const nilai?


75
2018-01-24 06:53


asal


Jawaban:


Itu const Variabel menentukan apakah suatu variabel dapat dimodifikasi atau tidak. Nilai konstan yang ditetapkan akan digunakan setiap kali variabel tersebut direferensikan. Nilai yang diberikan tidak dapat dimodifikasi selama eksekusi program.

Bjarne Stroustrup penjelasan merangkumnya secara singkat:

Kelas biasanya dinyatakan dalam file header dan file header biasanya dimasukkan ke dalam banyak unit terjemahan. Namun, untuk menghindari aturan penghubung yang rumit, C ++ mengharuskan setiap objek memiliki definisi yang unik. Aturan itu akan rusak jika C + + memungkinkan definisi entitas di kelas yang perlu disimpan dalam memori sebagai objek.

SEBUAH const variabel harus dideklarasikan di dalam kelas, tetapi tidak dapat didefinisikan di dalamnya. Kita perlu mendefinisikan variabel const di luar kelas.

T1() : t( 100 ){}

Di sini tugasnya t = 100 terjadi dalam daftar penginisialisasi, jauh sebelum initilisasi kelas terjadi.


89
2018-01-24 07:22



Yah, kamu bisa membuatnya static:

static const int t = 100;

atau Anda bisa menggunakan penginisialisasi anggota:

T1() : t(100)
{
    // Other constructor stuff here
}

42
2018-01-24 06:56



Ada beberapa cara untuk menginisialisasi anggota const di dalam kelas ..

Definisi anggota const secara umum, perlu inisialisasi variabel juga ..

1) Di dalam kelas, jika Anda ingin menginisialisasi const, sintaksnya seperti ini

static const int a = 10; //at declaration

2) Cara kedua bisa

class A
{
  static const int a; //declaration
};

const int A::a = 10; //defining the static member outside the class

3) Nah jika Anda tidak ingin menginisialisasi pada deklarasi, maka cara lain adalah melalui konstruktor, variabel perlu diinisialisasi dalam daftar inisialisasi (tidak di dalam badan konstruktor). Itu harus seperti ini

class A
{
  const int b;
  A(int c) : b(c) {} //const member initialized in initialization list
};

23
2018-06-25 03:56



  1. Anda dapat meng-upgrade kompilator Anda untuk mendukung C ++ 11 dan kode Anda akan bekerja dengan sempurna.

  2. Gunakan daftar inisialisasi di konstruktor.

    T1() : t( 100 )
    {
    }
    

12
2018-01-24 06:57



Solusi lainnya adalah

class T1
{
    enum
    {
        t = 100
    };

    public:
    T1();
};

Jadi t diinisialisasi ke 100 dan tidak dapat diubah dan bersifat pribadi.


5
2017-11-18 10:46



Jika anggota adalah Array, itu akan menjadi sedikit rumit daripada yang normal:

class C
{
    static const int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

atau

int* a = new int[N];
// fill a

class C {
  const std::vector<int> v;
public:
  C():v(a, a+N) {}
};

3
2017-10-01 04:35



Cara lain yang mungkin adalah ruang nama:

#include <iostream>

namespace mySpace {
   static const int T = 100; 
}

using namespace std;

class T1
{
   public:
   T1()
   {
       cout << "T1 constructor: " << mySpace::T << endl;
   }
};

Kerugiannya adalah bahwa kelas-kelas lain juga dapat menggunakan konstanta jika mereka menyertakan file header.


2
2018-03-12 18:27



Jika Anda tidak ingin membuat const anggota data di kelas statis, Anda dapat menginisialisasi const anggota data menggunakan konstruktor kelas. Sebagai contoh:

class Example{
      const int x;
    public:
      Example(int n);
};

Example::Example(int n):x(n){
}

jika ada banyak const anggota data di kelas Anda dapat menggunakan sintaks berikut untuk menginisialisasi anggota:

Example::Example(int n, int z):x(n),someOtherConstVariable(z){}

2
2018-06-03 20:52