Book-en-us
- Preface
- Chapter 01: Towards Modern C++
- Chapter 02: Language Usability Enhancements
- Chapter 03: Language Runtime Enhancements
- Chapter 04 Containers
- Chapter 05 Smart Pointers and Memory Management
- Chapter 06 Regular Expression
- Chapter 07 Parallelism and Concurrency
- Chapter 08 File System
- Chapter 09 Minor Features
- Chapter 10 Outlook: Introduction of C++20
- Appendix 1: Further Study Materials
- Appendix 2: Modern C++ Best Practices
Chapter 01: Towards Modern C++
Compilation Environment: This book will use clang++
as the only compiler used,
and always use the -std=c++2a
compilation flag in your code.
> clang++ -v |
1.1 Deprecated Features
Before learning modern C++, let's take a look at the main features that have deprecated since C++11:
Note: Deprecation is not completely unusable, it is only intended to imply that features will disappear from future standards and should be avoided. But, the deprecated features are still part of the standard library, and most of the features are actually "permanently" reserved for compatibility reasons.
The string literal constant is no longer allowed to be assigned to a
char *
. If you need to assign and initialize achar *
with a string literal constant, you should useconst char *
orauto
.char *str = "hello world!"; // A deprecation warning will appear
C++98 exception description,
unexpected_handler
,set_unexpected()
and other related features are deprecated and should usenoexcept
.auto_ptr
is deprecated andunique_ptr
should be used.register
keyword is deprecated and can be used but no longer has any practical meaning.The
++
operation of thebool
type is deprecated.If a class has a destructor, the properties for which it generates copy constructors and copy assignment operators are deprecated.
C language style type conversion is deprecated (ie using
(convert_type)
) before variables, andstatic_cast
,reinterpret_cast
,const_cast
should be used for type conversion.In particular, some of the C standard libraries that can be used are deprecated in the latest C++17 standard, such as
<ccomplex>
,<cstdalign>
,<cstdbool>
and<ctgmath>
etc.... and many more
There are also other features such as parameter binding (C++11 provides std::bind
and std::function
), export
etc. are also deprecated. These features mentioned above If you have never used or heard of it, please don't try to understand them. You should move closer to the new standard and learn new features directly. After all, technology is moving forward.
1.2 Compatibilities with C
For some force majeure and historical reasons, we had to use some C code (even old C code) in C++, for example, Linux system calls. Before the advent of modern C++, most people talked about "what is the difference between C and C++". Generally speaking, in addition to answering the object-oriented class features and the template features of generic programming, there is no other opinion or even a direct answer. "Almost" is also a lot of people. The Venn diagram in Figure 1.2 roughly answers the C and C++ related compatibility.
From now on, you should have the idea that "C++ is not a superset of C" in your mind (and not from the beginning, later References for further reading The difference between C++98 and C99 is given). When writing C++, you should also avoid using program styles such as void*
whenever possible. When you have to use C, you should pay attention to the use of extern "C"
, separate the C language code from the C++ code, and then unify the link, for instance:
// foo.h |
You should first compile the C code with gcc
:
gcc -c foo.c |
Compile and output the foo.o
file, and link the C++ code to the .o
file using clang++
(or both compile to .o
and then link them together):
clang++ 1.1.cpp foo.o -std=c++2a -o 1.1 |
Of course, you can use Makefile
to compile the above code:
C = gcc |
Note: Indentation in
Makefile
is a tab instead of a space character. If you copy this code directly into your editor, the tab may be automatically replaced. Please ensure the indentation in theMakefile
is done by tabs.If you don't know the use of
Makefile
, it doesn't matter. In this tutorial, you won't build code that is written too complicated. You can also read this book by simply usingclang++ -std=c++2a
on the command line.
If you are new to modern C++, you probably still don't understand the following small piece of code above, namely:
[out = std::ref(std::cout << "Result from C code: " << add(1, 2))](){ |
Don't worry at the moment, we will come to meet them in our later chapters.
Further Readings
- A Tour of C++ (2nd Edition) Bjarne Stroustrup History of C++
- C++ compiler support
- Incompatibilities Between ISO C and ISO C++
Changkun Ou © 2016-2024. The book is licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0, code is open sourced under the MIT License.
If you like the book, you could donate the author.