C ++ è un ibrido non perché consente di scrivere codice in stile C, ma perché supporta diversi paradigmi di programmazione, come procedurale, orientato agli oggetti e generico. Il C ++ non ti costringe in un modo di fare le cose, e questa è la sua forza, perché i diversi problemi possono essere risolti più facilmente utilizzando diversi paradigmi.
IMHO, it would be better if the language/compiler forced to some extent programmers to write more elegant code.
Quindi devi prima definire cosa significa elegante . Quindi dovresti vedere se la tua definizione di elegante è appropriata a tutti i domini e piattaforme problematici per i quali viene usato il C ++. Uno stile di codifica che sia elegante per scrivere un word processor per Windows potrebbe essere completamente inadatto per scrivere un sistema embedded.
Considera di scrivere codice C ++ per l'esecuzione su un DSP. Innanzitutto, il compilatore C ++ per quel DSP potrebbe semplicemente non supportare alcune funzionalità di C ++, come gli stream. In secondo luogo, sei strongmente limitato dalla velocità della CPU e probabilmente dalla memoria, quindi alcune funzionalità del C ++ potrebbero semplicemente uccidere le tue prestazioni. Ad esempio potrebbe essere necessario evitare le funzioni virtuali per motivi di velocità. Tali considerazioni cambierebbero radicalmente il tuo stile di programmazione, rispetto a quello che useresti su un PC, e C ++ lo consente.
Per riassumere, C ++ è un linguaggio enorme e complicato con molte funzionalità. Esistono molte ragioni per cui qualsiasi sottoinsieme di queste funzionalità potrebbe non essere applicabile a un particolare progetto: velocità, portabilità, supporto del compilatore o persino esperienza e familiarità del programmatore. Per questo motivo, il linguaggio che impone allo sviluppatore di utilizzare determinate funzionalità rispetto ad altre per qualsiasi attività specifica è una cattiva idea. Pensa a Java, dove la lingua impone che ogni funzione debba essere un metodo di una classe. Ci sono così tanti casi in cui la creazione di una classe solo per avvolgere un metodo è scomoda e inutile, e tuttavia devi farlo perché il linguaggio ti costringe a.