Klassen Member Array Initialisierung in C++

Gast #4712728
Lesenswert?

Hallo Forum o/

ich habe eine Frage zur Initialisierung von Array Membern einer Klasse 
in C++ in der Initialisierungsliste. Beim CodeReview ist mir öfters 
sowas hier unter gekommen:

Deklarationen:
1
*.h
2
float bufferA[A][B]
3
int buffer[C]
4
AnotherClass* array[D]

Dazugehöriger Klassenconstruktor Definition dann:
1
*.cpp
2
MyClass::MyClass() :
3
bufferA({}),
4
buffer({}),
5
array({})

Hier meckert mir PC-Lint diese Vorgehensweise aber an, bspw:
1
Type mismatch (initialization) (int [4320] = int)

Deshalb meine Frage: ist die Initialisierung so überhaupt zulässig? 
Konnte darüber leider nichts finden. Gibt es denn überhaupt dann eine 
Möglichkeit dies in der Initialisierungsliste zu tun? Die Möglichkeit im 
Konstruktorrumpf selbst ist mir bekannt.

Schönen Gruß,
Peter
#4712780
Lesenswert?

Je nun, mit welcher C++-Version bist du unterwegs, was sagt der Compiler 
dazu, was hast du dazu auf den einschlägigen Internetseiten (z.B. 
Cplusplus.com) nachgelesen, und was steht dazu in deinem C++-Buch?

Jemand, der Codereviews durchführt, sollte all diese Antworten 
griffbereit haben.

Oliver
Gast #4712804
Lesenswert?

Mea culpa - die dazugehörigen Informationen waren für wahr ein wenig 
dünn. Genauer:

* C++03
* mein gcc sagt überhaupt nichts dazu
* Die Aussagen auf bspw. stackoverflow sind widersprüchlich, zum 
Beispiel hier: 
http://stackoverflow.com/questions/11837078/initialize-a-constant-sized-array-in-an-initializer-list
* Meine Literatur gibt nur Material her für eine direkte Initialisierung 
mit Werten: array{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

Mir geht es aber explizit um die Möglichkeit mit ({ }), sowie der 
best-practise Variante
Gast #4730457
Lesenswert?

Torsten R. schrieb:
> PC lint ist auch nur ein "Compiler" und wird auch so seine bugs haben.
> Initializer Syntax ist ja erst mit C++11 aufgenommen worden. Kann PC
> Lint C++11?
>
> Persönlich finde ich die leeren Arrays in der in der
> Initialisierungsliste ja recht überflüssig.

Bei der Initialisierung mit {} werden die Array-Elemente auf 0 gesetzt.
Bei sowas - int data[17]; - steht irgendwelcher Mist drin.

Gruß Pit
Gast #4730472
Lesenswert?

Pit schrieb:
> Bei der Initialisierung mit {} werden die Array-Elemente auf 0 gesetzt.

Genauer gesagt wird für jedes Array-Element der Standardkonstruktor 
aufgerufen. In Falle der primitiven Datentypen wären das dann die 
"Pseudo"-Konstruktoren int() und float(), die definitionsgemäß mit 0 
bzw. 0.0f initialisieren.
#4730805
Lesenswert?

> Hier meckert mir PC-Lint diese Vorgehensweise aber an, bspw:
> Type mismatch (initialization) (int [4320] = int)

Dann scheint es die leere Intializer-Liste für Arrays nicht richtig zu 
verstehen und hat "{}" dann zu "{0}" übersetzt, was aber auch valides 
C++ ist und genau das gleiche, "::memset(array,0,sizeof(array));", 
machen sollte

Schönes Beispiel, wie veraltete Richtlinien den Einsatz verbesserter 
Verfahren be(/ver)hindern können.

Kauf dir ein besseres Lint oder glaub den Compilerwarnings.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren