[ProgClub list] Learning C++

John Elliot jj5 at progclub.org
Mon Oct 10 23:35:03 AEDT 2011

Here's a quote from Bjarne Stroustrup in The C++ Programming Language 
about learning C++. Makes me feel like I should be learning C++. (That's 
a long road...) :P -- JE

The most important thing to do when learning C++ is to focus on concepts 
and not get lost in language-technical details. The purpose of learning 
a programming language is to become a better programmer; that is, to 
become more effective at designing and implementing new systems and at 
maintaining the old ones. For this, an appreciation of programming and 
design techniques is far more important than understanding of details; 
that understanding comes with time and practice.

C++ supports a variety of programming styles. All are based on strong 
static type checking, and most aim at achieving a high level of 
abstraction and direct representation of the programmer's ideas. Each 
style can achieve its aims effectively while maintaining run-time and 
space efficiency. A programmer coming from a different language (say C, 
Fortran, Smalltalk, Lisp, ML, Ada, Eiffel, Pascal, or Modula-2) should 
realize that to gain the benefits of C++, they must spend time learning 
and internalizing programming styles and techniques suitable to C++. The 
same applies to programmers used to an earlier and less expressive 
version of C++.

Thoughtlessly applying techniques effective in one language to another 
typically leads to awkward, poorly performing, and hard-to-maintain 
code. Such code is also most frustrating to write because every line of 
code and every compiler error message reminds the programmer that the 
language used differs from "the old language." You can write in the 
style of Fortran, C, Smalltalk, etc., in any language, but doing so is 
neither pleasant nor economical in a language with a different 
philosophy. Every language can be a fertile source of ideas of how to 
write C++ programs. However, ideas must be transformed into something 
that fits with the general structure and type system of C++ in order to 
be effective in the different context. Over the basic type system of a 
language, only Pyrrhic victories are possible.

C++ supports a gradual approach to learning. How you approach learning a 
new programming language depends on what you already know and what you 
aim to learn. There is no one approach that suits everyone. My 
assumption is that you are learning C++ to become a better programmer 
and designer. That is, I assume that your purpose in learning C++ is not 
simply to learn a new syntax for doing things the way you used to, but 
to learn new and better ways of building systems. This has to be done 
gradually because acquiring any significant new skill takes time and 
requires practice. Consider how long it would take to learn a new 
natural language well or to learn to play a new musical instrument well. 
Becoming a better system designer is easier and faster, but not as much 
easier and faster as most people would like it to be.

It follows that you will be using C++ -- often for building real systems 
-- before understanding every language feature and technique. By 
supporting several programming paradigms (Chapter 2), C++ supports 
productive programming at several levels of expertise. Each new style of 
programming adds another tool to your toolbox, but each is effective on 
its own and each adds to your effectiveness as a programmer. C++ is 
organized so that you can learn its concepts in a roughly linear order 
and gain practical benefits along the way. This is important because it 
allows you to gain benefits roughly in proportion to the effort expended.

In the continuing debate on whether one needs to learn C before C++, I 
am firmly convinced that it is best to go directly to C++. C++ is safer, 
more expressive, and reduces the need to focus on low-level techniques. 
It is easier for you to learn the trickier parts of C that are needed to 
compensate for its lack of higher-level facilities after you have been 
exposed to the common subset of C and C++ and to some of the 
higher-level techniques supported directly in C++. Appendix B is a guide 
for programmers going from C++ to C, say, to deal with legacy code.

Several independently developed and distributed implementations of C++ 
exist. A wealth of tools, libraries, and software development 
environments are also available. A mass of textbooks, manuals, journals, 
newsletters, electronic bulletin boards, mailing lists, conferences, and 
courses are available to inform you about the latest developments in 
C++, its use, tools, libraries, implementations, etc. If you plan to use 
C++ seriously, I strongly suggest that you gain access to such sources. 
Each has its own emphasis and bias, so use at least two.

More information about the list mailing list