C ++ Primer: Capítulo 7 Resumen


clase Capítulo 7

7.1 la definición de tipos de datos abstractos

La idea básica de la clase: la abstracción de datos, la encapsulación.
la abstracción de datos: que se basa en la separación de las interfaces e implementaciones de programación y técnicas de diseño. Una interfaz de usuario que comprende las operaciones que se pueden realizar, por miembros de la clase de datos incluyen, responsable de varias funciones necesarias para el cuerpo privado y la definición de la función de la interfaz de clase.
Interfaz y clase de implementación del paquete de separación aplicación. Clase envasados detalles ocultar implementación, el usuario puede utilizar la interfaz para lograr algunos no se puede acceder.

  1. clase de usuario es programadores de usuario final, en lugar de la aplicación.
  2. Clase diseñadores a considerar la clase de implementación, la clase es fácil de usar, sólo la interfaz de usuario uso clase clase, independientemente del mecanismo de implementación de la clase.

Introducción de funciones miembro

  1. función miembro sólo puede ser declarado fuera de la clase, la clase o clases pueden ser definidas; declaraciones de funciones que no son miembros y sólo fuera de la definición de clase.
  2. función miembro definido dentro de la función en línea clase es implícita.

La introducción de esta

  1. este es un parámetro implícito en sí es puntero constante , lo que indica el objeto de la función se llama.
  2. este parámetro se define de manera implícita, los parámetros personalizados o variables con nombre que esto es ilegal.
//this的类型:Sales_data * const
total.isbn(); // this=&total;

La introducción de funciones miembro const

  1. En los métodos constantes, este es un per se a la que se refiere y el puntero es constante .
  2. objeto constante, y el objeto de referencias y punteros constantes sólo pueden llamar a métodos constantes ; objeto ordinario puede llamar a funciones miembro ordinarias y métodos constantes.
  3. Para funciones const miembro , que apuntan a esta constante, objetos constantes pueden ser invocados y objeto const, la función, la flexibilidad y mejor; para funciones miembro ordinarias , que esta cantidad punto muy, la cantidad sólo se puede llamar muy sujeto.
// f:成员函数
// 第1个const:返回值是常量
// 第2个const:形参是常量
// 第3个const:函数是常量成员函数
const int A::f(const int ci) const 
{
    return ci;
}

Definir una función para devolver este objeto

A& A::f(A& a)
{
    .....
    return *this; // 返回调用该函数的对象
}
a1.f(a2); // 返回对a1的引用

La definición de la clase correspondiente de las funciones que no son miembros

  1. Las declaraciones de funciones y definiciones almacenan por separado. No miembro de las mismas declaraciones de funciones generales en el archivo de cabecera y la declaración de la clase.
  2. Perteneciente a la misma clase y array IO no copia tipo, se puede pasar por referencia.
  3. Salida realiza tareas de función deben reducirse para controlar el formato, como saltos de línea agregados generalmente por el usuario.

constructor

  1. Constructor nombre de la clase y el nombre del mismo tipo, de no retorno, no pueden ser declarados como const, para inicializar un miembro de datos de objetos de clase.
  2. constructor por defecto (sin argumentos); Síntesis constructor por defecto (el constructor creado por el compilador).
  3. Síntesis constructor por defecto sólo es adecuado para la clase muy simple, clase común debe definir un constructor por defecto. Debido a que sólo cuando cualquier función constructor de la clase no se ha declarado, el compilador por defecto constructor se sintetiza, integrado en o del tipo de compuesto (array, puntero) miembros de datos no está definido inicialización por defecto; incluye otros miembros de la clase de tipo de clase y el tipo de clase no tiene constructor por defecto, el compilador no puede ser sintetizado constructor por defecto.
  4. Inicialización del constructor lista.

Copiar la asignación de clase y el destructor

  1. El compilador puede sintetizar las operaciones de copia, misiones y destrucción. Pero aparte de la clase asignación de recursos requiere la clase de objeto (por ejemplo, la gestión de memoria dinámica), la versión a menudo sintetizado de fracaso.
  2. El uso de vectores o cuerda pueden evitar la complejidad de la asignación y liberación de memoria.

7.2 paquete de control de acceso

especificadores de acceso: público, privado

  1. se utiliza para definir la interfaz pública para las clases y las funciones miembro del objeto visible; privada para encerrar implementa la interfaz para la función miembro es visible.
  2. estructura de acceso predeterminado es público, permisos de acceso por defecto de clase son privadas. Si todos los miembros de la clase son públicos, usando struct; si hay clases privadas, clase de uso.

Amigo: Deje que la otra clase o función a los miembros de acceso no públicos de la propia clase

  1. declaraciones amigo sólo pueden aparecer en una clase que especifica el acceso sólo, en lugar de una declaración de la función normal, es una declaración de función no puede ser omitido.
  2. El mejor comienzo en la definición de clase o declaración posición centralizada antes de que finalice el amigo.

Otras características como 7.3

miembros de la Clase: un tipo de miembro, las funciones miembro en línea, función miembro sobrecargado, los miembros de datos variables (la mutables), miembros de datos de clase inicializan

  1. La definición y el uso de los miembros ordinarios no pueden orden, pero los miembros deben definir primero el tipo de reutilización. miembros de tipo general se encuentran en el tipo de lugar para comenzar, y por lo general utilizan typedef usando.
  2. Si alguno de los constructor de la declaración de la clase, el compilador no se pondrá por defecto constructor se sintetiza, si se desea constructor por defecto debe ser declarado explícitamente.
  3. función miembro implícitamente en línea explícita tipo de línea exterior de la junta.
  4. declaraciones de separación de funciones y definiciones comunes, la declaración de función en el archivo de cabecera, definen la función del mismo nombre en el archivo de origen. Excepción: las funciones en línea, funciones constexpr y clases definidas en el archivo de cabecera.
  5. Para los miembros de datos variables const objeto, métodos constantes son modificables.
  6. El valor inicial de la clase a ser representado por un signo o tirantes iguales.

Volver * esta función de miembro.

  1. Para el regreso * esta función, si no se hace referencia al tipo de retorno, la función devuelve una copia del objeto, si el tipo de retorno es una referencia, devuelve el objeto en sí.
  2. métodos constantes regresan * esto como una referencia, a continuación, su tipo de retorno es una referencia constante.
  3. Dependiendo de si el parámetro es un const, métodos constantes determinaron si las funciones sobrecargadas.
class A
{
    A &f1(int x) // 返回*this
    {
        return *this;
    }
    A &f2(const int x) // 形参是const
    {
        return *this;
    }
    A &f3(int x) const; // 成员函数是const
    {
        return *this;
    }
};

clase Tipo

  1. Los miembros de la clase y el tipo de clase de la lista tiene nada que ver. Para ambas clases, incluso si la misma lista de miembros, que también son diferentes tipos.
  2. declaraciones adelantadas: sólo temporalmente no define la clase de declaración de la clase, entonces la clase es un tipo incompleto. Sólo tipo incompleto se utiliza para definir el tipo de punto de referencia, o puntero, un incompleto parámetros declaración de tipo o valores de retorno de función.
  3. Sólo después de la finalización de todas las clases se define considerada de clase, por lo que cuando los miembros de datos de la declaración de clase, la clase no se especifica totalmente, sólo se refieren al punto de declaración de la clase o tipo de puntero, el tipo no puede ser declarada. Para crear una clase de objetos o miembros acceder a la clase después de la definición de clase.

amigo Revisited

  1. funciones y clases miembro de la clase a sí mismos pueden ser utilizados como un amigo.
  2. Una clase de amigo clase designada, los Amigos de las funciones miembro de la clase meta se puede acceder a todos los miembros de esta clase.
  3. La amistad no es transitiva. Cada clase sólo es responsable de controlar sus funciones de clase y amigo Amigo.
  4. Si la función sobrecargada como un amigo, la necesidad de funciones sobrecargadas en cada función como una declaración amigo.
  5. Declaración amigo sólo afecta el acceso, no es una declaración verdadera. Antes de la declaración de la clase y el uso de funciones amigas, mejor primera declaración real.

alcance 7,4 clase

  1. Una clase es un ámbito. Fuera del ámbito de, el objeto, y los punteros de referencia operador de selección miembro - miembros de datos y funciones miembro de la clase visitada por el operador alcance ((y>):. Miembro de tipo :) clase de acceso.
  2. lista de parámetros alcance y el cuerpo de la función después de que el nombre de la clase en la clase.
  3. Búsqueda de nombres (proceso de encontrar la mejor correspondencia con los nombres de sentencia) normalmente desde adentro hacia afuera , en primer lugar encontrar los nombres de código utilizadas en el bloque anterior, a continuación, busque en el ámbito de inclusión.
  4. Cuando se define una clase, el compilador primero recopilar declaraciones de miembros hasta que todo visibles después de que el cuerpo de la función clase compilada.
  5. No redefine representar un tipo de nombre de dominio en la clase envolvente.
  6. No se recomienda su uso como parámetro el nombre de un miembro de la función miembro de la clase.
  7. Si la función de búsqueda de nombre en el cuerpo de una función miembro, la primera función en el cuerpo y en el nombre del antiguo uso de búsqueda de código, a continuación, busque en la clase, y, finalmente, el ex definición de la función miembro de la función de búsqueda de dominio.

7,5 constructor Revisited

lista de inicialización del constructor

  1. Constructores recomiendan valor inicial. La diferencia entre la inicialización y asignación está relacionada con la eficacia subyacente de los antiguos miembros de datos initialize directos, que se inicializa mediante asignación. En particular, cuando los miembros son const, referencia, o pertenecientes a un cierto tipo de clase no se proporciona un constructor predeterminado, los valores iniciales deben ser proporcionados por la lista constructor de inicialización .
  2. lista de inicialización Constructor sólo muestra los valores para los miembros de inicialización cuya secuencia de inicialización se ejecuta en el orden definido por los miembros. En consonancia con los miembros de la orden de hacer el mejor constructor declarado valor inicial, para evitar el uso de ciertos miembros de los otros miembros inicializados.
  3. Si los argumentos de constructor para todos proporcionan un constructor argumento por defecto es el constructor por defecto.

constructor encargado

  1. Otros usos del constructor encargado pertenece al constructor de la clase lleva a cabo su propio proceso de inicialización, o confiar a poseer algunos (o todos) responsabilidad de otros constructores.
#include <iostream>
#include <string>
using namespace std;

std::istream &read(std::istream &is, Sales_data &item);

class Sales_data
{
public:
    Sales_data(string s, unsigned cnt, double rev) : bookNo(s), units_sold(cnt), revenue(cnt * rev) {}

    Sales_data() : Sales_data("", 0, 0) {}
    Sales_data(string s) : Sales_data(s, 0, 0) {}
    Sales_data(std::istream &is) : Sales_data()
    {
        read(is, *this);
    }

private:
    string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;

    friend std::istream &read(std::istream &is, Sales_data &item);
};

std::istream &read(std::istream &is, Sales_data &item)
{
    int price;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = item.units_sold * price;
    return is;
}

int main()

    return 0;
}

El papel constructor por defecto

  1. Cuando el objeto es un valor predeterminado se inicializa o la inicialización se lleva a cabo automáticamente constructor predeterminado.
  2. situación de inicialización por defecto se produce: el valor inicial sin ningún alcance se define en un bloque de variable no estática o matriz; clase misma contiene un miembro de un tipo de clase y constructor predeterminado sintético; miembros iniciales de un tipo de clase no está en la lista de valores constructor inicializado explícitamente.
  3. Inicializa el valor de la ocurrencia de: proporcionar un valor inicial cuando el número de serie de inicialización es menor que el tamaño de la matriz; valor inicial no se utiliza para definir una variables estáticas locales; escribir expresiones de la forma T () se inicializa valor solicitado explícitamente.
  4. Si definir otros constructores, es preferible proporcionar un constructor por defecto.
  5. A A (); es una declaración de función, A a; Se crea un un objeto de clase.

Clase de conversión de tipo implícito.

  1. Conversión Constructor: Si la función constructor acepta un argumento , que se puede convertir en tales parámetros implícitamente el tipo.
  2. El compilador sólo permite realizar un paso de la conversión del tipo de clase.
  3. explícita constructor conversión implícita suprimida definido. explícita solamente un argumento del constructor es válida, los argumentos de constructor no contienen una pluralidad de conversión implícita; sólo tiene que utilizar la declaración explícita al constructor de la clase, no se repite tal como se define fuera de la clase; constructor explícito se puede utilizar inicialización directa, en lugar de la copia de inicialización; se puede mostrar en el elenco constructor explícito.
  4. Acepta un solo parámetro const char * Función de cadena de constructor no es explícita, y acepta un constructor capacidad vector de parámetros es explícito.
  5. Un tipo de tipo de conversión implícito que las variables temporales no pueden ser modificados, puede ser considerada como constante, se transmite sólo a la referencia constante, y no se transmite a la referencia no const (el valor de la variable temporal es un valor de referencia izquierda-const lado derecho se inicializa utilizando solamente).
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    //非explicit构造函数
    const char c = 'a';
    const char *p = &c;
    string s1(p);
    string s2 = (p);
    //explicit构造函数
    // vector<int> v1 = (10);
    vector<int> v1(10);//explicit构造函数只能直接初始化

    return 0;
}

polimerización Clase

  1. satisface la clase de agregado la condición: que todos los miembros son públicos; no define ningún constructor, no dentro de la clase de inicialización; no hay clases base y funciones virtuales.
  2. La lista de miembros inicial del valor de la clase agregada disponible entre llaves inicialización.
    Ejemplo:
#include <iostream>
using namespace std;
struct Sales_data
{
    string bookNo;
    unsigned units_sold; //聚合类无类内初始值
    double revenue;
};

int main()
{
    Sales_data item = {"978-0590353403", 25, 15.99};
    return 0;
}

clase literales

  1. Miembros de datos son tipos literales de categoría polimérico pertenece a los literales de clase.
  2. Otras categorías literales condición: miembros son literales tipo de datos; clase constexpr debe contener al menos un constructor, si la clase contiene un miembro de datos del valor inicial, el valor inicial de los miembros de tipo construido debe ser una expresión constante, o Si los miembros pertenecen a un determinado tipo de clase, el valor inicial de los propios miembros debe ser usada constexpr constructor; clase debe definir el destructor por defecto, el miembro responsable de la destrucción de la clase de objeto.
  3. Constexpr cuerpo de la función constructor es generalmente vaciar, todos los miembros de datos debe ser inicializado, el valor inicial o constructor constexpr, o una expresión constante.
class Debug
{
public:
    constexpr Debug(bool b = true) : hw(b), io(b), other(b){};
    constexpr Debug(bool h, bool i, bool o) : hw(h), io(i), other(o){};
    constexpr bool any()
    {
        return hw | io | other;
    }
    void set_io(bool b)
    {
        io = b;
    }
    void set_hw(bool b)
    {
        hw = b;
    }
    void set_other(bool b)
    {
        other = b;
    }

private:
    bool hw;
    bool io;
    bool other;
};

7.6 miembros de la clase estáticos

  1. Los miembros estáticos de una clase relacionada con la clase, independientemente de la clase de objeto.
  2. Los miembros estáticos puede ser pública o privada, puede ser una constante, de referencia, puntero, tipo de clase. Se ningún este puntero no se puede declarar métodos constantes.
  3. Los miembros estáticos se declaran dentro de una clase estática, visita con el operador alcance. función miembro puede acceder directamente a los miembros estáticos.
  4. (Definido fuera de la clase no puede ser duplicada cuando estáticos) funciones miembro estáticas dentro de la clase o clases pueden definirse exterior; miembros de datos estáticos deben estar fuera de la definición de la clase y la inicialización , y sólo puede ser definido y se inicializa una vez.
  5. miembro de la clase const int estática puede estar provisto de un valor inicial; constexpr estática debe ser proporcionado con un valor inicial de la clase.
  6. Si el compilador puede sustituir el valor de un miembro estático, estático const constexpr estática o no se puede definir, si no, tiene que haber una sentencia de definición de miembro estático.
  7. Los miembros estáticos, referencias y punteros pueden ser de tipo incompleto (declaración de la clase única clase sin definir temporalmente), la clase puede acceder sólo después de la definición de sus miembros en general, a excepción de un tipo incompleto; miembro estático puede hacer un argumento por defecto, los miembros de datos no estáticos no como un argumento predeterminado.
Publicado 77 artículos originales · ganado elogios 25 · Vistas a 10000 +

Supongo que te gusta

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