• Trusted by:

Hire C++ developers and engineers

Sam Varshavchik, United States

Member since September 16, 2012
Sam is a senior freelance developer and architect with over 20 years of experience developing in the financial industry. Click to continue

Dmitrii Polutov, Australia

Member since May 30, 2013
Dmitrii is a Software Engineer with a strong background in the development, design, and maintenance of new and existing software. He has extensive experience programming across multiple platforms, writing C and C++ code for over two decades. Click to continue

Richard Rozsa, Netherlands

Member since June 12, 2013
Richard Rozsa offers a vision of data as a self formatting entity. For more than 30 years, he's delivered top quality technical architecture, programming, testing and solutions for complex problems--on-time and within budget. He's extremely flexible and able to integrate as a standalone freelancer or within teams. Click to continue

Gustav Stieger, Australia

Member since June 7, 2013
Gustav is a top engineer and programmer with twenty years of experience with all levels of software and architecture. A creative abstract and theoretical thinker with the ability to turn ideas into re-usable modules and solutions, Gustav has worked at all levels of participation, from contractor to technical lead. Click to continue

Victor Tyutyunov, Ukraine

Member since February 2, 2014
Victor is a successful lead engineer with extensive experience in the development of high-loaded distributed systems, data processing, and data analysis. Click to continue

Antonio Bello, Poland

Member since April 8, 2013
Antonio is an experienced, self-motivated, results-driven, flexible freelance professional who specializes in turning business ideas into software solutions. He covers the entire software development life cycle, from concept to final product, using the best technologies. Click to continue

Ken Whaley, Russia

Member since September 6, 2012
Ken is a top architect, engineer, and developer with over 30 years of experience in the field. He has a proven ability to understand, optimize, enhance, and create from scratch significant software tools and workflows with large user bases that greatly magnify productivity for large groups of engineers. Ken is eager to take on new challenges and has done so with teams of all sizes and compositions. Click to continue

Sasa Mrvos, Croatia

Member since August 15, 2013
Sasa is a top architect/developer with a background in desktop, embedded systems, servers, and industrial solutions. He loves challenges, and if there is a hard or seemingly impossible project, he just might like it. He enjoys working on signal processing, image processing, number crunching, compression, protocols, machine vision, compilers/parsers, and algorithms in general. Click to continue

Scott Ferrett, Germany

Member since December 6, 2013
Scott is a freelance architect and lead developer with extensive experience in C++, C#, and SQL. He has contributed to the ANSI standards for both C++ and SQL. He excels with problems that are best solved with multiple cooperative processes. Click to continue
A hiring guide
The Vital Guide To C++ Developer Interviewing

C++ is a powerful general purpose multi-paradigm programming language. The language's immense set of features, its overall complexity, lack of elegant external tooling that other popular languages have, and access to low-level resources makes this one of the most difficult programming languages to master. Taming this mammoth beast requires much experience and wisdom.

Trustpilot
Toptal on TV
"Toptal is killing it, it kind of owns this market."
Andrew Ross Sorkin Reviews Toptal
Cnbc 02e66b
"Tech companies simply cannot find the quality employees they want to hire. The solution: Toptal."
Liz Claman´s Review of Toptal
Fox 7ef901
Toptal in the press
“Despite accelerating demand for coders, Toptal prides itself on almost Ivy League-level vetting.”
Selina Wang
“Toptal allows corporations to quickly assemble teams that have the right skills for specific projects.”
Steven Norton
Testimonials
“We had a great experience with Toptal. They paired us with the perfect developer for our application and made the process very easy. It was also easy to extend beyond the initial time frame, and we were able to keep the same contractor throughout our project. We definitely recommend Toptal for finding high quality talent quickly and seamlessly.”
Ryan Morrissey
CTO @ Applied Business Technologies, LLC
“Working with Toptal has been a great experience. Prior to using them, I had spent quite some time interviewing other freelancers and wasn't finding what I needed. After engaging with Toptal, they matched me up with the perfect developer in a matter of days. The developer I'm working with not only delivers quality code, but he also makes suggestions on things that I hadn't thought of. It's clear to me that Amaury knows what he is doing. Highly recommended!”
George Cheng
CEO @ Bulavard, Inc.
“We've had multiple needs for various development talent and Toptal doesn't disappoint. They truly focus on matching the best developer to our specific engagements, and they continue to stay connected in an effort to exceed our expectations at all times”
Mindle Hastings
Sr. Product Manager @ Bodybuilding.com
“I've been very happy with Juraj. He is efficient, writes great code, and is an extremely nice guy to work with. Most importantly, he is self-motivated -- in his initial pass at the code base he has contributed several optimizations and stability improvements.”
Matt Cotton
Dev Team Lead @ eFolder
“Toptal helped us achieve our goals by really understanding what we were looking for. They worked with us very closely to figure out what the right talent looked like -- from a technical, cultural perspective -- and helped us get the onboarding done quickly so the talent could be effective as soon as possible. ”
Jay Tring
Technical Team Lead, CSR Connect, Australia @ CSR Limited
“As an internet marketing company specializing in pay-per-click management, our clients frequently ask us to provide services that fall outside the scope of our primary business. We have found Toptal to be exactly the resource we need to connect with contractors so we can deliver our clients top tier web development talent at a reasonable cost.”
Pashmina Lalchandani
Owner @ Flowsimple
“When you're growing quickly and your internal resources are strapped, you need to find a way to move forward regardless. We couldn't have done it without Toptal. From content creation to programming and design, we were able to leverage the expertise of Toptal's network to move even faster that we could have otherwise. They prioritized finding us the right person, not just a person. Every single one they introduced us to was not only qualified and professional, but also eager to help us.”
Josh Leskar
Manager @ Udemy
“As a Toptal qualified front-end developer, I also run my own consulting practice. When clients come to me for help filling key roles on their team, Toptal is the only place I feel comfortable recommending. Toptal's entire candidate pool is the best of the best. Toptal is the best value for money I've found in nearly half a decade of professional online work.”
Ethan Brooks
CTO @ Langlotz Patent & Trademark Works, Inc.
“One of our most time consuming problems is finding qualified staff. We need to find the correct platform to advertise on, create a proper ad, filter through tons of applications, interview and test the applicants' capabilities, and finally take a risk by hiring. This was the old way of doing things. The new way: describe the job position to our Toptal account manager, interview a few qualified applicants, and hire with a risk-free trial -- much faster, a lot easier, and with incredible results.”
Catalin S. Balaci
Owner @ EvoBits Information Technology SRL
“Toptal has been extremely helpful to us in finding top remote talent. The ratio from interview to hire with Toptal candidates is the highest I've ever experienced in my professional career.”
Philipp Berner
Co-founder and CTO @ KeepSafe
“I struggled for weeks with a Youtube API-specific problem and couldn't find anyone to solve it. Toptal immediately identified the right consultant who took the time to investigate the issue and resolve it quickly. The process was seamless and I will continue to use Toptal with any other issues that arise.”
Rohit Gupta
CEO @ Bollyshake
“I really enjoyed my experience with Toptal. Searching for a developer was both painless and engaging, and the first match was a perfect fit! Toptal is a fantastic way to find talented developers for small or large aspects of your project.”
Willem Shepherd
Creative Director @ Mookieyams
“John has been so great to work with! He has met all our requirements, done a speedy job with excellence, and has completed everything we’ve asked him to. Working with him has been a great experience.”
Jenny Lord
Communications Project Manager @ Lake Pointe Church
“We struggled for weeks to find a developer or architect with expertise in a niche API, but to no avail. When we linked up with Toptal, they connected us with the very expert we needed, and a week later we were hard at work making progress! The whole process was very smooth and we ended up with a new feature we couldn't have done without Toptal.”
Thomas Honeyman
COO @ FindMySong
Hire a top C++ developer now.
Toptal is a marketplace for top C++ developers, engineers, programmers, coders, architects, and consultants. Top companies and start-ups choose Toptal freelancers for their mission-critical software projects.
Full
profile
Sam VarshavchikUnited States
Sam is a senior freelance developer and architect with over 20 years of experience developing in the financial industry.
[click to continue…]
C++SQLPerljQueryLinux RHEL/CentOSLinuxMySQL
Hire
Full
profile
Dmitrii PolutovAustralia
Dmitrii is a Software Engineer with a strong background in the development, design, and maintenance of new and existing software. He has extensive experience programming across multiple platforms, writing C and C++ code for over two decades.
[click to continue…]
C++CCocoaXcodeiOSMac OS XMySQLUI Kit
Hire
Full
profile
Richard RozsaNetherlands
Richard Rozsa offers a vision of data as a self formatting entity. For more than 30 years, he's delivered top quality technical architecture, programming, testing and solutions for complex problems--on-time and within budget. He's extremely flexible and able to integrate as a standalone freelancer or within teams.
[click to continue…]
C++CSQLC#ASP.NETASP.NET MVC.NETASP.NET Web FormsjQueryVisual Studio 2012Microsoft Visual C++Visual StudioVisual Studio 2008
Hire
Full
profile
Gustav StiegerAustralia
Gustav is a top engineer and programmer with twenty years of experience with all levels of software and architecture. A creative abstract and theoretical thinker with the ability to turn ideas into re-usable modules and solutions, Gustav has worked at all levels of participation, from contractor to technical lead.
[click to continue…]
C++VB.NETC#JavaScriptSQLMicrosoft Visual StudioWindowsSQL Server Management StudioSQL Server
Hire
Full
profile
Victor TyutyunovUkraine
Victor is a successful lead engineer with extensive experience in the development of high-loaded distributed systems, data processing, and data analysis.
[click to continue…]
C++JavaScriptNode.jsPostgreSQLMySQLBack-end Development
Hire
Full
profile
Antonio BelloPoland
Antonio is an experienced, self-motivated, results-driven, flexible freelance professional who specializes in turning business ideas into software solutions. He covers the entire software development life cycle, from concept to final product, using the best technologies.
[click to continue…]
C++Objective-CSQLSwiftC#JavaC/C++JavaScriptASP.NET.NETiOS SDKNode.jsGit
Hire
Full
profile
Ken WhaleyRussia
Ken is a top architect, engineer, and developer with over 30 years of experience in the field. He has a proven ability to understand, optimize, enhance, and create from scratch significant software tools and workflows with large user bases that greatly magnify productivity for large groups of engineers. Ken is eager to take on new challenges and has done so with teams of all sizes and compositions.
[click to continue…]
C++HTML5JavaScriptCPHPPerlObjective-CPythonMS Visual StudioXcode
Hire
Full
profile
Sasa MrvosCroatia
Sasa is a top architect/developer with a background in desktop, embedded systems, servers, and industrial solutions. He loves challenges, and if there is a hard or seemingly impossible project, he just might like it. He enjoys working on signal processing, image processing, number crunching, compression, protocols, machine vision, compilers/parsers, and algorithms in general.
[click to continue…]
C++CVisual StudioArduinoWindows
Hire
Full
profile
Scott FerrettGermany
Scott is a freelance architect and lead developer with extensive experience in C++, C#, and SQL. He has contributed to the ANSI standards for both C++ and SQL. He excels with problems that are best solved with multiple cooperative processes.
[click to continue…]
C++C#C/C++Agile Software DevelopmentWindowsAPI Design
Hire

The Vital Guide To C++ Developer Interviewing

C++ is a powerful general purpose multi-paradigm programming language. It powers some of the most performance intensive applications, and serves well to satisfy some particular niches, including but not limited to desktop applications, embedded applications, device drivers, game engines, and more. The language’s immense set of features, its overall complexity, lack of elegant external tooling that other popular languages have, and access to low-level resources makes this one of the most difficult programming languages to master. Taming this mammoth beast requires much experience and wisdom.

Harnessing the power of C++ requires nothing short of experience and wisdom

Harnessing the power of C++ requires nothing short of experience and wisdom

This hiring guide will help you identify C++ developers who not only know the basics, but also understand its relevant concepts in-depth and know their way around the various challenges and pitfalls of this powerful programming language.

Basics

Questions like the following are meant to figure out how familiar the candidate is with C++, and to see if they know all the quirks and nuances of the language.

Q: Consider the following snippet of code:

string ext = "";
switch(ext) {
case "cpp":
case "cc":
        cout << "C++ source file" << endl;
case "java":
        cout << "Java source file" << endl;
default;
        cout << "Unknown extension" << endl;
}

Explain what, if anything, is wrong with it? How can you improve this code or work around any issue in it?

The switch statement, in C++, only accepts types that are integral, enumerated or class which has a single conversion function to an integral or enumerated type. std::string in C++ is not a primitive type.

In C/C++, switch statements are typically implemented as branch tables. Generating them for integers, integer-like or enumerated types is easy, which is not the case for strings.

One way to work around this limitation, in this particular case, is by using a map:

map<string, string> m;
m["cpp"] = "C++ source file";
m["cc"] = m["cpp"];
m["java"] = "Java source file";

string ext = "cc";
string r = m[ext];
if(r != "") {
	cout << r << endl;
} else {
	cout << "Unknown extension" << endl;
}

In case ext is expected to hold unknown values, you might want to use m.find(ext) != m.end() to determine if the key actually exists first. This is because the [] operator will automatically increase the container’s size everytime a non-existence key is used.

Q: How do you implement a variadic function in C++?

Functions that can accept a variable number of arguments can be declared using an ellipsis as its last parameter:

int int_sum(int n, ...)

For example, the following function will accept an argument, n, followed by any number of additional arguments.

int int_sum(int n, ...) {
	va_list args;
	va_start(args, n);
	int r = 0;
	while(n--) {
		int x = va_arg(args, int);
		r += x;
	}
	va_end(args);
	return r;
}

However, starting C++11, Variadic templates can be used to achieve similar results, as they are type safe and do not perform automatic type conversions.

Q: What are the different ways of passing parameters in a function call? Explain how they are different.

  • Pass by value: this causes the parameter’s value to be copied. Typically used for primitive types where the overhead of copying the value is minimal. In newer standards, such as C++11, with move semantics even complex objects may be efficiently passed by value.

  • Pass by reference: this causes the parameter inside the function to alias the variable passed when the function is called. Parameters can also be passed by const reference. This is very similar to what pass by value does, except the underlying object is not copied.

Additionally, pass by pointer can be considered another way of passing parameters. Although not the most recommended way of passing parameters, this works by passing the memory location of a variable by value, allowing the function to access the original variable’s contents, as if by reference. Typically used when it is important to pass NULL as the parameter. However, recommended ways of dealing with optional parameters involve the use of external libraries.

Q: What is the expected output for the following snippet of code:

int a[2];
int *x = &a[0];
*x = 2;
*(++x) = 4;
cout << a[0] << endl;
cout << a[1] << endl;

Explain.

The expected output of this program is:

2
4

This is because:

  • We start by declaring an array of 2 ints.
  • We are then taking a pointer to the first element in x.
  • Next, we are updating the value pointed at by x to 2.
  • Finally, we are Incrementing the pointer to move to the 2nd element and updating the value pointed at by x now to 4.

Q: How are exceptions handled in C++?

In C++, exceptions are handled using try-catch blocks:

try {
	// Something that may throw an exception
} catch(int ex) {
}

Exceptions are thrown using a throw statement:

throw 42;

Here, 42 is the parameter which will be passed to the handler as the only argument. Within a catch block, this parameter can be omitted to rethrow the current exception.

In a try-catch block, multiple exception handlers can be specified using multiple catch blocks. The type specified for the catch block will determine if it will be used to handle a particular exception.

And, Beyond

Even though C++ is closer to the metal than most other popular programming languages, there is still a lot going on under the hood. A great C++ developers is very likely to have gained this knowledge, sometimes out of sheer curiosity and sometimes the hard way.

Q: In the following snippet of code:

int *arr1 = new int[10];
int arr2[10];
// ...
delete[] arr1;

Why is the delete[] statement necessary for variable arr1, but not for arr2? How can this be re-written using smart pointers?

Memory allocated dynamically using new or new[] must be deallocated to reclaim the used memory. This is because C++ doesn’t have a garbage collector to deallocate those resources automatically. The delete[] operator works on an array of objects that destroys each element before marking the memory as reusable on the heap.

The declaration line for arr1 could be replaced with the following:

unique_ptr<int[]> arr1(new int[10]);

This will automatically destroy and deallocate the array as soon as the smart pointer object goes out of scope.

Q: What is stack unwinding? What are its implications on object storage?

Stack unwinding happens when an exception is thrown. This is when function entries are removed from the stack up until an exception handler is found. In C++, stack unwinding will also cause stack variables to be destroyed automatically.

However, depending on how and when memory was allocated, stack winding may cause memory leaks. For example:

void leaky(bool panic) {
	SomeClass *scp = new SomeClass();
	if(panic) {
		throw 42;
	}
	delete scp;
}

Here, if panic is true, an exception will be thrown causing the program to never reach the delete statement and thus preventing the SomeClass instance to be deallocated from the heap.

Q: What is a function-try-block? What are these ideally used for?

A function-try-block allows you to attach a sequence of exception handlers after the function body that effectively treats the entire function body as a try block. This way, any exception that occurs with the function body may be handled by one of the catch blocks following it.

Ideally this syntax is used to log exceptions rather than handling them. Sometimes these are also used to modify the exception and rethrow them.

Q: What are templates? In terms of function declarations, how is this different from function overloading?

Templates are what allow C++ to define a group of classes, functions, types or variables in a parameterized manner. For example, the following definition of a function template:

template<typename T>
T add(T a, T b) {
	return a+b;
}

… will allow a developer to use the function add with any type that supports the + operator.

add(5, 1); // will use int add(int, int)
add(‘e’, ‘t’); // will use char add(char, char)

Templates allow classes, functions, etc. to be declared in a type “independent” way as long as the behavior remains the same. The compiler automatically generates the necessary code for every instance of the templated function or class used.

Templates are also not limited to types. They can also be used with expressions of a particular type. For example:

template<typename T, int a>
T add(T b) {
	return a+b;
}
add<int, 5>(1)

When it comes to functions, unlike function templates, function overloading requires you to explicitly define the behavior of each instance of the function.

Q: What are special member functions in C++? Briefly explain their use and state their defaults when not explicitly defined.

The default constructor, destructor, copy constructor and copy assignment (along with move constructor and assignment as introduced in C++11) are the special member functions in C++.

The default constructor is called when objects of a class are instantiated without passing any arguments. When no constructors are defined for a class, the default constructor is automatically defined as a function that is no-op.

The destructor, meant to serve as the opposite of constructors, allows an object to clean after itself before it is deallocated from memory. When not defined, similar to the default constructor, a no-op function is automatically declared on the class.

The copy constructor is essentially a constructor that accepts an argument of its own type by const reference. This constructor is meant to create a clone of the object being passed. When not defined, a default that copies all the members of the object is defined if and only if no move constructor or assignment function is defined.

The copy assignment function is called when an object is being assigned to another variable of the same type that is already initialized. Automatic default declaration follows the same rule as copy constructor as stated above.

Move constructor and assignment functions are similar to copy constructor and assignment functions, except that these are called when the values of the source object are no longer necessary and may be taken over by the destination object. The default behavior moves all members, but is automatically declared only when no copy constructor, assignment function, or move assignment function is declared.

Q: Does C++ allow multiple inheritance? What are some pitfalls of multiple inheritance and how can you work around them in C++?

C++ allows multiple inheritance. A class can extend one or more classes by providing a comma-separated list of their names:

class SomeClass: public ParentClass1, public ParentClass2 {
	// …
};

One of the pitfalls of multiple inheritance is ambiguity. For example, both ParentClass1 and ParentClass2 in the example above may have methods declared with the exact same signature. Attempting to call these inherited methods on SomeClass will cause the compiler to complain about this ambiguity - exactly which inherited method should be called? This issue can be worked around with explicit qualification:

SomeClass *sc = new SomeClass;
sc->ParentClass1::parentMethod();
sc->ParentClass2::parentMethod();

Another with multiple inheritance is the diamond problem. Let us assume that both ParentClass1 and ParentClass2 were derived from the same class:

class ParentClass1: public RootClass { /* … */ };
class ParentClass2: public RootClass { /* … */ };

… and if the RootClass had some public method named rootMethod, then calling that method would automatically result in ambiguity. This is because both ParentClass1 and ParentClass2 has inherited these methods, and to SomeClass this is ambiguous. One possible way of working around this issue is to use virtual inheritance:

class ParentClass1: public virtual RootClass { /* … */ };
class ParentClass2: public virtual RootClass { /* … */ };

Wrap up

The questions outlined in this guide cover some basic and some tricky aspects of C++. But just like its possibilities, the language’s hidden surprises are limitless, and that makes it difficult to cover everything about C++ in interviews. Therefore it is essential to evaluate a candidate’s competency and deep understanding of C++ through their ability to convey their ideas clearly and vividly.

We hope these questions will help you as a guide in your search for a true C++ expert. These rare elites may be hard to come by, but they will clearly stand out from the rest of the pack.

Hire C++ developers now
Alvaro 1506e7

My team is going to personally help you find the best candidate to join your team.

Alvaro Oliveira
VP of Talent Operations