C ++ Primer: dentro de los miembros de datos estáticos const inicialización de clase y constexpr estática de (7.58 Respuestas al ejercicio)


1. Antecedentes

  En la versión china de C ++ Primer (quinta edición), página 270, los miembros de datos de la inicialización estática clase describen a continuación:

Podemos proporcionar un valor inicial dentro de un estático clase de tipo const número entero de miembro, sino que requiere un miembro estático debe ser un tipo constante literal de constexpr.

  La frase anterior no se entiende bien. Con el fin de encontrar el autor correspondiente Descripción:

podemos proporcionar inicializadores de clase para los miembros estáticos que tienen const tipo integral y debe hacerlo para los miembros estáticos que son constexprs de tipo literal.

  Como significado general Inglés:

Podemos proporcionar un valor inicial para el miembro de datos estáticos const int clase interna. constexprs miembro estático deben ser proporcionados dentro del valor inicial de la clase.

  comprensión personal:

  1. Los tipos aritméticos, incluyendo número entero y de coma flotante. Número entero incluyendo bool, char, int, corto, largo, etc. Incluyendo flotador flotador y doble, etc. (véase C ++ Primer, página 30).
  2. const int tipo de miembros de datos estáticos (es decir, los const estáticos int miembros de datos) puede ser inicializado con el valor inicial de la clase.
  3. constexprs miembro estático (es decir, los miembros de datos constexpr estáticas) debe ser proporcionado con un valor inicial para inicializar la clase.

2. Ejemplos

2.1 miembros de datos estáticos

#include <iostream>
using namespace std;
class A
{
public:
    //整型的静态成员
    static bool b;
    static char c;
    static int i;
    //浮点型的数据成员
    static float f;
    static double d;

    // static int i1 = 1;       // 错误:带有类内初始值设定项的成员必须为常量
    // static double d1 = 3.14; // 错误:带有类内初始值设定项的成员必须为常量
};

bool A::b = true;
char A::c = 'a';
int A::i = 1;
float A::f = 1.5;
double A::d = 2.5;

int main()
{
    cout << A::b << endl;
    cout << A::c << endl;
    cout << A::i << endl;
    cout << A::f << endl;
    cout << A::d << endl;
    return 0;
}

Los resultados operativos

resumen:

  1. los miembros generales de datos estáticos sólo pueden ser declaradas en la clase y fuera de la definición de clase y de inicialización.

2.2 miembros de datos estáticos const

#include <iostream>
using namespace std;
class A
{
public:
    //整型的静态成员
    static const bool b1;
    static const char c1;
    static const int i1;
    //浮点型的数据成员
    static const float f1;
    static const double d1;

    //整型的静态成员
    static const bool b2 = false;
    static const char c2 = 'b';
    static const int i2 = 2;
    //浮点型的数据成员
    // static const float f2 = 3.5;  // 错误:"const float" 类型的成员不能包含类内初始值设定项
    // static const double d2 = 4.5; // 错误:"const double" 类型的成员不能包含类内初始值设定项

    // char m1[i1];// 错误:i1的常量还未初始化
    char m2[i2];
};

const bool A::b1 = true;
const char A::c1 = 'a';
const int A::i1 = 1;
const float A::f1 = 1.5;
const double A::d1 = 2.5;

const bool A::b2;
const char A::c2;
const int A::i2;

int main()
{
    cout << A::b1 << endl;
    cout << A::c1 << endl;
    cout << A::i1 << endl;
    cout << A::f1 << endl;
    cout << A::d1 << endl;
    cout << "---------------------------------------" << endl;
    cout << A::b2 << endl;
    cout << A::c2 << endl;
    cout << A::i2 << endl;
    return 0;
}

Los resultados operativos

resumen:

  1. miembros de datos estáticos const se pueden declarar dentro de la clase, y se definen fuera de la inicialización de la clase. Cuando se declara en la clase, los miembros de datos estáticos const aún no inicializadas, no real const.
  2. static const int miembros de datos se pueden declarar e inicializan dentro de la clase, la clase definida fuera. Cuando dentro de la declaración de la clase y la inicialización, los miembros de datos estáticos const son realmente const.
  3. Si los miembros de datos static const disponibles su tiempo de compilación valor de la , puede ser necesario definir alternativa (como se indica por el número de matriz, etc.). Si no se sustituye (por ejemplo, como parámetros, etc.), debe contener una instrucción de definición. Recomendar o no alternativa se define fuera de la clase una vez.
  4. Si el miembro de datos no es estático const int (int, char, int, corto , largo , etc.) , la clase no se ha inicializado.

2.3 Los miembros de datos estáticos constexpr

#include <iostream>
using namespace std;
class A
{
public:
    //整型的静态成员
    // static constexpr bool b1; // 错误:constexpr 静态数据成员声明需要类内初始值设定项
    // static constexpr char c1; // 错误:constexpr 静态数据成员声明需要类内初始值设定项
    // static constexpr int i1;  // 错误:constexpr 静态数据成员声明需要类内初始值设定项
    //浮点型的数据成员
    // static constexpr float f1;  // 错误:constexpr 静态数据成员声明需要类内初始值设定项
    // static constexpr double d1; // 错误:constexpr 静态数据成员声明需要类内初始值设定项

    //整型的静态成员
    static constexpr bool b2 = false;
    static constexpr char c2 = 'b';
    static constexpr int i2 = 2;
    //浮点型的数据成员
    static constexpr float f2 = 3.5;
    static constexpr double d2 = 4.5;

    // char m1[i1]; // 错误:i1的常量还未初始化
    char m2[i2];
};

// constexpr bool A::b1 = true;
// constexpr char A::c1 = 'a';
// constexpr int A::i1 = 1;
// constexpr float A::f1 = 1.5;
// constexpr double A::d1 = 2.5;
constexpr bool A::b2;
constexpr char A::c2;
constexpr int A::i2;
constexpr float A::f2;
constexpr double A::d2;

int main()
{
    cout << A::b2 << endl;
    cout << A::c2 << endl;
    cout << A::i2 << endl;
    cout << A::f2 << endl;
    cout << A::d2 << endl;
    return 0;
}

Los resultados operativos

resumen:

  1. constexpr miembro de datos estático debe declarar e inicializar dentro de la clase. Cuando dentro de la declaración de la clase y la inicialización, miembro de datos constexpr estática es verdaderamente const.
  2. Si los datos están disponibles a los miembros de su tiempo de compilación constexpr estática valor de la alternativa (como se indica por el número de matriz, etc.), puede ser necesario definir. Si no se sustituye (por ejemplo, como parámetros, etc.), debe contener una instrucción de definición. Recomendar o no alternativa se define fuera de la clase una vez.
  3. Si el miembro de datos constexpr número entero estática, si no, se puede realizar dentro de la inicialización de la clase.

3. Problema resuelto

Ejercicio 7.58: miembro de datos estático de las siguientes declaraciones y definiciones tienen mal? Por favor, explique por qué.

#include <iostream>
#include <vector>
using namespace std;

class Example
{
public:
    static double rate = 6.5;
    static const int vecSize = 20;
    static vector<double> vec(vecSize);
};

double Example::rate;
vector<double> Example::vec;

Respuesta:

  1. los miembros generales de datos estáticos sólo dentro de la declaración de la clase, que se define fuera de la clase y la inicialización. tasa no es constexpr const estático o estático, sino que los miembros de datos estáticos en general, la clase no se ha inicializado.
static double rate = 6.5;
//改为
static double rate;
  1. tipo vecSize es int const estático, la clase puede ser inicializado. vector VecSize que representa sólo el número de recipientes 20 se puede utilizar directamente al compilar Alternativamente, se define fuera de la clase definida son posibles o no, pero preferiblemente fuera de la definición de clase de un caso.
static const int vecSize = 20; // 正确
// 最好在类外添加定义
static const int vecSize;
  1. vecSize inicializa en clase, que puede ser utilizado para representar la capacidad del vector. vec miembros de datos estáticos sólo en general, la clase no se ha inicializado.
static vector<double> vec(vecSize);
// 改为
// 类内
static vector<double> vec;
// 类外
vector<double> Example::vec(vecSize);

modificado:

#include <iostream>
#include <vector>
using namespace std;

class Example
{
public:
    static double rate;
    static const int vecSize = 20;
    static vector<double> vec;
};

double Example::rate;
static const int vecSize;
vector<double> Example::vec(vecSize);
Publicado 77 artículos originales · ganado elogios 25 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_34801642/article/details/104948850
Recomendado
Clasificación