resueltos que programacion nombres matriz funciones ejercicios ejemplos caracteres cadenas arreglo array almacenar c++ type-conversion implicit-conversion

programacion - que es un array en c++



Empujando hacia atrĂ¡s la cuerda al vector de objetos (3)

Class Foo tiene un ctor no explícito que toma un argumento de tipo std::string (es decir, Converting constructor ), lo que significa que puede ser implícitamente lanzado desde std::string .

f.push_back(str); // implicit casting from std::string to Foo f.push_back(Foo(str)); // explicit casting from std::string to Foo

Tenga en cuenta que si hace que el ctor sea explicit , el lanzamiento implícito será prohibido.

class Foo { public: explicit Foo(std::string s) : _s(s) {} // ~~~~~~~~ private: std::string _s; };

y entonces

f.push_back(str); // invalid now f.push_back(Foo(str)); // still valid

Estaba buscando un código que escribí para un proyecto escolar, que en una inspección más cercana me pareció extraño. Tenía una clase similar a la siguiente:

class Foo { public: Foo(std::string s) : _s(s) {} private: std::string _s; }; int main() { std::string str = "Hiyo"; std::vector<Foo> f; f.push_back(str); // Compiles. Weird to me though. f.push_back(Foo(str)); // Predictably, this compiles as well. return 0; }

¿Por qué la primera llamada a push_back una declaración válida, aunque str no es un Foo ?


Creo que en el primer retroceso automáticamente se inicializa Foo(str) Así que básicamente es lo mismo!


El primer push back inicializará automáticamente un objeto Foo dado un objeto string ; a través de su lista de inicializadores.

(Espera un objeto Foo , obtiene una cadena: ¿puede inicializarse un objeto Foo con una sola cadena? Sí, su lista de inicializadores tiene un solo elemento y el objeto se inicializa desde ese elemento).

Para detalles, ver por ejemplo: