C++ (generally pronounced "see plus plus") is a general-purpose, high-level programming language. It is a statically-typed free-form multi-paradigm language supporting procedural programming, data abstraction, object-oriented programming, and generic programming. Since the 1990s, C++ has been one of the most popular commercial programming languages.
Bjarne Stroustrup developed C++ (originally named "C with Classes") in 1983 at Bell Labs as an enhancement to the C programming language. Enhancements started with the addition of classes, followed by, among other features, virtual functions, operator overloading, multiple inheritance, templates, and exception handling. The C++ programming language standard was ratified in 1998 as ISO/IEC 14882:1998, the current version of which is the 2003 version, ISO/IEC 14882:2003. A new version of the standard (known informally as C++0x) is being developed.
In 1983, the name of the language was changed from C with Classes to C++. New features that were added to the language included virtual functions, function name and operator overloading, references, constants, user-controlled free-store memory control, improved type checking, and a new comment style (//). In 1985, the first edition of The C++ Programming Language was released, providing an important reference to the language, as there was not yet an official standard. In 1989, Release 2.0 of C++ was released. New features included multiple inheritance, abstract classes, static member functions, const member functions, and protected members. In 1990, The Annotated C++ Reference Manual was released and provided the basis for the future standard. Late addition of features included templates, exceptions, namespaces, new casts, and a Boolean type.
As the C++ language evolved, a standard library also evolved with it. The first addition to the C++ standard library was the stream I/O library which provided facilities to replace the traditional C functions such as printf and scanf. Later, among the most significant additions to the standard library, was the Standard Template Library.
After years of work, a joint ANSI-ISO committee standardized C++ in 1998 (ISO/IEC 14882:1998). For some years after the official release of the standard in 1998, the committee processed defect reports, and published a corrected version of the C++ standard in 2003. In 2005, a technical report, called the "Library Technical Report 1" (often known as TR1 for short) was released. While not an official part of the standard, it gives a number of extensions to the standard library which are expected to be included in the next version of C++. Support for TR1 is growing in almost all currently maintained C++ compilers.
No one owns the C++ language, as it is royalty-free. However, the standard document itself is not freely available.
Stroustrup addressed the origin of the name in the preface of later editions of his book, The C++ Programming Language, adding that "C++" might be inferred from the appendix of George Orwell's Nineteen Eighty-Four. Of the three segments of the fictional language Newspeak, the "C vocabulary" is the one dedicated to technical terms and jargon. "Doubleplus" is the superlative modifier for Newspeak adjectives. Thus, "C++" might hold the meaning "most extremely technical or jargonous" in Newspeak.
When Rick Mascitti was questioned informally in 1992 about the naming, he indicated that it was given in a tongue-in-cheek spirit. He never thought that it would become the formal name of the language.
For many years, different C++ compilers implemented the C++ language to different levels of compliance to the standard, and their implementations varied widely in some areas such as partial template specialization. Recent releases of most popular C++ compilers support almost all of the C++ 1998 standard . One particular point of contention is the export keyword, intended to allow template definitions to be separated from their declarations. The first compiler to implement export was Comeau C++, in early 2003 (5 years after the release of the standard); in 2004, beta compiler of Borland C++ Builder X was also released with export. Both of these compilers are based on the EDG C++ front end. It should also be noted that many C++ books provide example code for implementing the keyword export (for example, Beginning ANSI C++ by Ivor Horton) which will not compile, but there is no reference to the problem with the keyword export mentioned. Other compilers such as Microsoft Visual C++ and GCC do not support it at all. Herb Sutter, secretary of the C++ standards committee, has recommended that export be removed from future versions of the C++ standard *, but finally the decision was made to leave it in the C++ standard.
Stanley B. Lippman documents in his in-depth book "Inside the C++ Object Model" (1996) how compilers convert C++ program statements into an in-memory layout. Lippman worked on implementing and maintaining C-front, the original C++ implementation at Bell Labs.
The C++ standard library incorporates the C standard library with some small modifications to make it work better with the C++ language. Another large part of the C++ library is based on the Standard Template Library (STL). This provides such useful tools as containers (for example vectors and lists), iterators (generalized pointers) to provide these containers with array-like access and algorithms to perform operations such as searching and sorting. Furthermore (multi)maps (associative arrays) and (multi)sets are provided, all of which export compatible interfaces. Therefore it is possible, using templates, to write generic algorithms that work with any container or on any sequence defined by iterators. As in C, the features of the library are accessed by using the #include directive to include a standard header. C++ provides sixty-nine standard headers, of which nineteen are deprecated.
Using the standard library--for example, using std::vector or std::string instead of a C-style array--can help lead to safer and more scalable software.
The STL was originally a third-party library from HP and later SGI, before its incorporation into the C++ standard. The standard does not refer to it as "STL", as it is merely a part of the standard library, but many people still use that term to distinguish it from the rest of the library (input/output streams, internationalization, diagnostics, the C library subset, etc.).
Most C++ compilers provide an implementation of the C++ standard library, including the STL. Compiler-independent implementations of the STL, such as STLPort, also exist. Other projects also produce various custom implementations of the C++ standard library and the STL with various design goals.
new/delete, bool, reference types, inline functions, default arguments, function overloading, namespaces, classes (including all class-related features such as inheritance, member functions, virtual functions, abstract classes, and constructors), operator overloading, templates, the :: operator, exception handling, and runtime type identification.
Contrary to popular belief, C++ did not introduce the const keyword first. Const was formally added to C shortly before it was adopted by C++.
C++ also performs more type checking than C in several cases (see "Incompatibility with C" below).
Comments starting with two slashes ("//") were originally part of C's predecessor, BCPL, and were reintroduced in C++.
Several features of C++ were later adopted by C, including declarations in for loops, C++-style comments (using the // symbol), and inline, though the C99 definition of the inline keyword is not compatible with its C++ definition. However, C99 also introduced features that do not exist in C++, such as variadic macros and better handling of arrays as parameters; some C++ compilers may implement some of these features as extensions, but others are incompatible with existing C++ features.
A very common source of confusion is a subtle terminology issue: because of its derivation from C, in C++ the term object means memory area, just like in C, and not class instance, which is what it means in most other object oriented languages. For example, in both C and C++, the statement int i; defines an object of type int, that is the memory area where the value of the variable i will be stored on assignment.
C++ is often considered to be a superset of C, but this is not strictly true. Most C code can easily be made to compile correctly in C++, but there are a few differences that cause some valid C code to be invalid in C++, or to behave differently in C++.
Perhaps the most commonly encountered difference is that C allows implicit conversion from void* to other pointer types, but C++ does not. So, the following is valid C code:
int *i = malloc(sizeof(int) * 5); /* Implicit conversion from void* to int* */
but to make it work in both C and C++ one would need to use an explicit cast:
int *i = (int *) malloc(sizeof(int) * 5);
Another common portability issue is that C++ defines many new keywords, such as new and class, that may be used as identifiers (e.g. variable names) in a C program.
Some incompatibilities have been removed by the latest (C99) C standard, which now supports C++ features such as // comments and mixed declarations and code. However, C99 introduced a number of new features that conflict with C++ (such as variable-length arrays, native complex-number types, and compound literals), so the languages may be diverging more than they are converging.
In order to intermix C and C++ code, any C++ functions which are to be called from C-compiled code must be declared as extern "C".
int main() { }
The C++ Standard requires that main() returns type int. A program which uses any other return type for main() is technically not Standard C++, although many compilers do not enforce this strictly. The Standard also does not say what the return value of main() actually means. Traditionally, it is interpreted as the return value of the program itself. The Standard guarantees that returning zero from main() indicates successful termination. Unsuccessful termination can be indicated by returning a nonzero value. Some common return values are defined as macros, for example EXIT_FAILURE. This allows each operating system to define these values differently.
If, as in this example, execution reaches the end of main() without encountering a return statement, zero is returned implicitly. Only the main function has this implicit return statement. In any other non-void function, reaching the end of the function without meeting a return statement is undefined behaviour.
#include <ostream> // for std::endl #include <iostream> // for std::cout int main() { std::cout << "Hello World!" << std::endl; return 0; }
std refers to the namespace of the cout object. The std namespace provides a named scope for objects in the C++ Standard Library. In this example, we make use of the scope resolution operator (::) to provide the std namespace qualification of the cout object and the endl function. Such a qualification helps to disambiguate the C++ Standard Library cout object from any other objects or functions which may have the same name.
For more examples, see C++ examples.
The OO principle is that all and only the functions that can access the internal representation of a type should be encapsulated within the type definition. C++ supports this (via member functions and friend functions), but does not enforce it: the programmer can declare parts or all of the representation of a type to be public, and is also allowed to make public entities that are not part of the representation of the type. Because of this, C++ supports not just OO programming but other weaker decomposition paradigms, like modular programming.
It is generally considered good practice to make all data private or protected, and to make public only those functions that are part of a minimal interface for users of the class, that hides implementation details.
Multiple inheritance is another controversial C++ feature. Multiple inheritance allows a class to be derived from more than one base class; this can result in a complicated graph of inheritance relationships. For example, a "Flying Cat" class can inherit from both "Cat" and "Flying Mammal". Some other languages, such as Java, accomplish something similar by allowing inheritance of multiple interfaces while restricting the number of base classes to one (interfaces, unlike classes, provide no implementation of function members).
C++ supports several kinds of static (compile-time) and dynamic (run-time) polymorphism. Compile-time polymorphism does not allow for certain run-time decisions, while run-time polymorphism typically incurs more of a performance penalty.
Static polymorphism
+, !=, <, or &) to result in a function call that depends on the types of the operands they are used on.
Dynamic polymorphism
C++ also provides a dynamic_cast operator, which allows the program to safely attempt conversion of an object into an object of a more specific object type (as opposed to conversion to a more general type, which is always allowed). This feature relies run-time type information. Objects known to be of a certain specific type can also be cast to that type without dynamic_cast, which is less safe but does not require compiler support for run-time type information.
By virtue of inherited objects being polymorphic, it may not be possible for the compiler to determine the type of the object at compile time. The decision is therefore put off until runtime, and is called dynamic dispatch. In this way, the most specific implementation of the function is called, according to the actual run-time type of the object. In C++, this is commonly done using virtual function tables. This may sometimes be bypassed by prepending a fully qualified class name before the function call, but calls to virtual functions are in general always resolved at run time.
This example program makes use of virtual functions, polymorphism, and inheritance to derive new, more specific objects from a base class. In this case, the base class is a Bird, and the more specific Swan is made.
C++ has been the subject of much debate. Some of the most commonly levelled criticisms include:
C++ | Class-based programming languages | Curly bracket programming languages | Multi-paradigm programming languages | Programming languages
C++ | سي++ | C++ | C++ | Си плюс плюс | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | سیپلاسپلاس | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | C++ | ภาษาซีพลัสพลัส | C++ | C++ | C++ | C++