Kurs i

Modern C++ for Java Developers

Java designades som en slags förenklad C++. Det är lätt att låta sig förledas av likheterna i syntaxen. Dessvärre finns det många fallgropar att falla i för Java programmerare, eftersom vissa saker ser lika ut men fungerar på ett fundamentalt annorlunda sätt.

Denna grundkurs riktar sig till rutinerade Java programmerare, som på snabbast tänkbara sätt vill börja med programutveckling i C++. Vi använder konsekvent Java som referensram och illustrerar likheter och pekar på skillnader.

Självklart använder vi modern C++, vilket innebär C++14, ett modernt designperspektiv och frekvent användning av standardbibloteket.

Vi kan inte motstå att citera Bjarne Stroupstrup, språkets upphovsman när han uttalar sig om detta:

Within C++ is a smaller, simpler, safer language struggling to get out.

Där han sätter fokus på att

...code that is statically type safe, has no resource leaks, and catches many more programming logic errors than is common in code today. And it will run fast.
Detta får du lära dig på kursen
  • Förstå hur C++ skiljer sig åt från Java, t.ex. pekare/referenser, kopieringskonstruktorer och destruktorer
  • Programmera i modern C++
  • Effektivt använda standardbiblioteket
  • Designa egna datatyper
  • Förstå och tillämpa insikter gällande minneshantering i C++
Innehåll

Background and Overview

Några ord om hur språket utvecklats och vad som avses med "Modern C++".
  • Langauge evolution
  • The concept Modern C++
  • Syntax summary
  • Simple compilation
  • C++ reference

Similarities with Java

Vi startar med de enkla delarna av språket där C++ och Java är tämligen lika, såsom variabel deklaration, olika former av uttryck, satser, funktioner och liknande. Vi kikar också på en del fallgropar man som Java programmerare bör vara observant på.
  • Data typer
  • Duck-typing in C++ or how to use auto
  • Expressions
  • Statements
  • Function declarations and function calls
  • Uses of namespaces, instead of packages and how it differs

Differences to Java

I Java kan varje klass fungera som en ingång till applikationen. Detta är inte möjligt i C++, det finns bara en entry-point till en appliktion. I Java kan man allokera data i bara en enda minnes-area, i C++ har du minst tre olika minnes-areor att välja mellan. I detta avsnitt reder vi ut skillnaden. Varför har C++ en pre-processor och varför saknar Java en?
  • Organization of compilation units
  • Data areas and life-cycles
  • Global data in the data area
  • Local data in the stack area
  • Dynamic data in the heap
  • How to act in the absence of a garbage-collector?
  • Include is not the same as import
  • Taking advantage of the pre-processor (CPP)
  • The merit of inlining
  • An executable JAR file, is not the same as a compiled C++ program. How do you build apps in C++?

Pointers and references

Här reder vi ut skillnaderna mellan pekare och två formerna av referenser; lvalue resp rvalue references.
  • Pointer declarations
  • Dereferencing operator
  • Address operator
  • Pointer arithmetics
  • Dangling pointers
  • The illusion of arrays
  • Nativ text strings and the danger of using them
  • Pointers to struct/class objects
  • Function pointers
  • References
  • Call-by reference
  • Return by-reference
  • What is move semantics
  • Rvalue references

Lambda Expressions

Med införandet av lambda uttryck har C++ definitivt tagit steget in bland moderna och hippa programspråk. Lite kul är det visst att C++ hann före Java med att införa detta viktiga språkbegrepp.
  • Lambda syntax
  • Passing free variables by reference or value
  • Functions taking lambdas as parameters and/or returning lambdas

Text Strings and Regexes

Majoriteten av buggarna i C/C++ program härrör från pekar-baserade text-strängar. Bara genom att konsekvent använda std::string i stället, så ökar programkvalitén signifikant. Här går vi igenom hur du använder string klassen på bästa sätt och hur du bäst använder stödet för reguljära uttryck.
  • Why using std::string instead of nativ strings
  • Overview of std::string and its functions/operators
  • What is SSO (Short String Optimization) and how it is used
  • Working with legacy strings
  • Character oriented functions
  • Multi-line string literals
  • What is a regex
  • The regex support in modern C++
  • Matching text data to patterns
  • Searching using patterns
  • Replacing text fragments using patterns
  • Using regex iterators
  • Typical use cases
  • Splitting and joining strings

I/O Streams and Files

Här går vi igenom hur du använder formatterad in- och utmatning till terminalen, filer och buffertar. Dessutom, hur du hanterar binära filer. Vi visar också på hur allt detta skiljer sig åt jämfört med hur I/O hanteras i Java.
  • ostream / ofstream / ostringStream
  • istream / ifstream / istringstream
  • Bi-directional I/O with fstream
  • Manipulators
  • The input idiom
  • Line-oriented input
  • Word-oriented input
  • Character-oriented input

Helper Types

Genomgång av några hjälptyper som används på andra ställen
  • Pair
  • Tuple
  • Date-times
  • Durations
  • Clocks
  • Date formatting
  • Random number generators

Container Types

Standardbiblioteket innehåller ett flertal mycket användbara container-datatyper. Vi gör också en jämförelse med java.util.*
  • Sequence containers and typical methods
  • vector / dequeue / array
  • list / forward_list
  • Associative containers
  • Tree vs. hash implementations
  • Unique vs. multi-key versions
  • set / unordered_set
  • map / unordered_map
  • Container adapters

Iterators and Intervals

Här går vi igenom det för nästa kapitel mycket viktiga iterator begreppet och vad som menas med ett intervall
  • What is an iterator
  • What is a range and how is it used
  • Iterator categories
  • I/O iterators
  • End-point adapter functions

STL Algorithms

Standardbiblioteket har ett stort utbud av "smör&bröd" funktioner som utför typiska programmeringsuppgifter, såsom kopiering, sökning, sortering, aggregering med mera. Här går vi igenom hur du använder dessa på bästa sätt.
  • What is a std::* algorithm
  • The STL architecture
  • How to pass the business logic into algorithm functions
  • Understanding *_n and *_if suffixes of functions
  • Using functions with predicates
  • Using back_insereter iterators
  • Transforming and aggregating
  • Sorting
  • Populating data inot containers

Classes (User Defined Types)

Först nu i kursen, går vi igenom hur man skapar egna klasser. Detta är givetvis helt avsiktligt. Vi gör jämförelser med Java och lägger stor tonvikt på begrepp helt okända för en Java programmerare, som copy-constructor, destructor och assignment-operator, samt hur de är relaterade till minneshantering.
  • What is a user-defined type
  • Specification vs. implementation
  • Member variables and functions
  • Object creation (instantitation)
  • Visibility
  • Constructors
  • Destructor
  • Inline member functions
  • Member overloading
  • The pointer 'this'

Class Member Forms

Klasser kan innehålla mer än bara variabler och funktioner och här går vi igenom vilka dessa är.
  • Class variables and functions
  • Member references
  • Read-only variables
  • Const marked functions
  • Inner classes and they differ to ditto in Java
  • Friend declarations

Constructors and Destructors

Det finns en hel del specialformer av konstruktorer och här går vi igenom vilka dessa är.
  • Initialization
  • Default constructor
  • Destructor
  • Copy constructor
  • Assignment operator
  • Pitfalls
  • Standardized class form
  • Enforcing compiler-generated members
  • Deleting compiler-generated members
  • Type conversion constructor
  • Type conversion operator
  • What is move semantics
  • Move constructor
  • Move assinment operator

Heap Allocated Objects

Här går vi igenom hur du skapar dynamiska objekt
  • What is dynamic memory anyway
  • Using the new and delete operators
  • Pitfalls
  • The placement variant of new

Exceptions

Exception begreppet i Java är tämligen likt det i C++, eftersom Gosling tog det och införde det rätt upp och ned i Java. Men det finns trots det en del skillnader som vi identifierar. Det är här du kommer att riktig värdesätta destruktorer och upptäcka hur pass smidigt det är jämfört med vad du kan åstadkomma i Java.
  • What is an exception
  • Throwing exceptions
  • Catching exceptions
  • The merrits of automatic destructions during throw
  • Exceptions in the standard library
  • Pitfalls

Templates

Modern C++ handlar i stor utsträckning om att hantera funktions- och klassmallar. I detta kapitel går vi igenom att du behöver veta för kunna använda mallar på bästa sätt. Kodmallar skiljer sig ganska markant åt, jämfört med generics i Java, trots att det finns vissa syntaktiska likheter.
  • What is a template
  • Function templates
  • Class Templates
  • Member function templates
  • Template parameter forms
  • Type eqiuvalence
  • Template specialization
  • Pitfalls
  • Type traits
  • Using decltype()
  • Variadic templates

Operator Overloading

Här går vi igenom allt du behöver veta om hur du överlagrar operatorer i C++ och lite om varför det aldrig kom till Java. Att kunna omdefiniera operatorer för dina egna datatyper är viktigt för på på bästa sätt skapa ett DSL (Domain Specific Language), vilket handlar om att lyfta programmeringsnivån för att öka kvalitén och minska buggfrekvensen och därmed korta utvecklingstid och kostnad.
  • What is operator overloading
  • Syntax
  • Overloadable operators
  • Rule set
  • Overloading of arithemtic operators
  • Overloading of relational operators
  • Overloading of I/O operators
  • Overloading of ++/-- operators
  • Overloading of the index operator
  • Overloading of the arrow operator
  • Overloading of the function-call operator

Inheritance and Virtual Functions

Så har vi kommit fram till arv och dynamisk bindning, två begrepp som är fundamentala i Java, men som vi ska se, inte lika fundamentala i modern C++. Vi reder ut begreppen och diskuterar fallgropar.
  • Why do I inherit in C++, but extend in Java
  • Syntax
  • Protected visibility
  • There is no such thing as package visibility in C++
  • Invocation of super-class members
  • References and pointers of root class type
  • Performing down-casts using dynamic_cast
  • Constructor initialization order
  • Base class visibility
  • Virtual member functions and why they are important
  • What is the key difference between virtual methods and non-virtual methods in C++ and how do they compare to Java
  • How do I make a class and/or method abstract in C++
  • Use of override and final specifiers
  • Multiple inheritance and why you need to be careful
  • Implementing Java-style interfaces in C++

The Pre-Processor

C/C++ förlitar sig på ett speciella steg före själva kompileringen. I detta steg kopieras filer in, macron expanderas och det är också möjligt att villkora inkluderingen av valda kodsegment.
  • Include files
  • CPP constants
  • Pre-defined constants
  • Conditional compilation
  • Include guards
  • CPP macro functions
  • Stringification and name catenation
  • Assertions

Building C++ Applications

I detta avsnitt går vi in på alla detaljer i hur man bygger C++ applikationer och skapar bibliotek, såväl statiska som dynamiska.
  • Compilation steps
  • What is an abstract syntax tree (AST)
  • The assembler
  • Inline assembly code
  • The linker
  • Name mangling of C++ names
  • Inspecting the linker symbol table
  • The loader
  • Tracing executions
  • Compiler flags for warnings
  • Compiler flags for optimizations
  • Compiler flags for debugging
  • Creating a static archive file
  • Creating a dynamic linked library

Build Tools and Open-Source Libraries

I detta avrundande avsnitt gör vi en översikt över byggverktyg och några open-source bibliotek vi tycker är bra att känna till.
  • Make
  • GNU Autotools
  • Premake
  • CMake
  • Gradle
  • Doxygen
  • Google Test
  • log4cxx
  • Boost

Standards and Guidelines

Till slut avrundar vi med att diskutera hur man kan följa evolveringen av C++ standarden och riktlinjer för programming enligt "Modern C++".
  • Tracking the standard
  • Tracking compilers and what they support
  • Online compilers
  • The big C++ conference (cppcon)
  • The C++ Core Guidelines
  • GSL - The Guidelines Support Library
SnabbFakta
Namn
Modern C++ for Java Developers
Längd
4 dagar
Nivå
Beginner
Målgrupp
Rutinerade Java programmerare
Förkunskaper
Praktiska kunskaper och erfarenhet i Java programmering
Teknisk miljö
  • C++14 compliant C++ compiler, such as gcc or clang
  • A decent IDE such as Jetbrains CLion
  • Ubuntu Linux or Cygwin
Relaterade Kurser
KursLängdNivå
Intermediate Modern C++3 dagarIntermediate
Unit Testing in C++ 1 dagarIntermediate
Threads Programming using Modern C++3 dagarAdvanced
Linux Systems Programming using Modern C++ 3 dagarAdvanced
C++ 11/14 for C++ Programmers 2 dagarIntermediate
Schemalagd Kurs

Pris

24000 kr + moms

Vi ger 20% rabatt för tillkommande deltagare från samma företag på samma kurstillfälle. Läs mer om vår samma-företags-rabatt.

Aktuella KursDatum
Startdatum Plats
29 maj 2017 Stockholm City
12 jun 2017 Stockholm City
27 jun 2017 Stockholm City
Företagsintern Kurs

Om du beställer en företagsintern kurs kommer vi till er och håller kursen i era egna lokaler. Priset bestäms av vår prismodell och baseras på antalet kursdagar, antalet deltagare, samt i förekommande fall resa och logi.

Prisexempel för NN deltagare

PPP kr + moms

Antal
Område

Läs mer om vår prismodell och beställningsvillkor.