Do I need to explicitly call the base virtual destructor?
No, destructors are called automatically in the reverse order of construction. (Base classes last). Do not call base class destructors.
No, destructors are called automatically in the reverse order of construction. (Base classes last). Do not call base class destructors.
It runs when a shared library is loaded, typically during program startup. That’s how all GCC attributes are; presumably to distinguish them from function calls. GCC-specific syntax. Yes, this works in C and C++. No, the function does not need to be static. The destructor runs when the shared library is unloaded, typically at program … Read more
I believe there is a difference. Let’s rename them so that we can talk about them more easily: const double PI1 = 3.141592653589793; constexpr double PI2 = 3.141592653589793; Both PI1 and PI2 are constant, meaning you can not modify them. However only PI2 is a compile-time constant. It shall be initialized at compile time. PI1 … Read more
When you write an implementation file (.cpp, .cxx, etc) your compiler generates a translation unit. This is the source file from your implementation plus all the headers you #included in it. Internal linkage refers to everything only in scope of a translation unit. External linkage refers to things that exist beyond a particular translation unit. … Read more
You can set the precision directly on std::cout and use the std::fixed format specifier. double d = 3.14159265358979; cout.precision(17); cout << “Pi: ” << fixed << d << endl; You can #include <limits> to get the maximum precision of a float or double. #include <limits> typedef std::numeric_limits< double > dbl; double d = 3.14159265358979; cout.precision(dbl::max_digits10); … Read more
Use QString::number(): int i = 42; QString s = QString::number(i);
Any functions into which you pass string literals “I am a string literal” should use char const * as the type instead of char*. If you’re going to fix something, fix it right. Explanation: You can not use string literals to initialise strings that will be modified, because they are of type const char*. Casting … Read more
[*] (Background: I have some experience implementing C and C++ compilers.) Variable-length arrays in C99 were basically a misstep. In order to support VLAs, C99 had to make the following concessions to common sense: sizeof x is no longer always a compile-time constant; the compiler must sometimes generate code to evaluate a sizeof-expression at runtime. … Read more
The component type of containers like vectors must be assignable. References are not assignable (you can only initialize them once when they are declared, and you cannot make them reference something else later). Other non-assignable types are also not allowed as components of containers, e.g. vector<const int> is not allowed.
C++11 added alias declarations, which are generalization of typedef, allowing templates: template <size_t N> using Vector = Matrix<N, 1>; The type Vector<3> is equivalent to Matrix<3, 1>. In C++03, the closest approximation was: template <size_t N> struct Vector { typedef Matrix<N, 1> type; }; Here, the type Vector<3>::type is equivalent to Matrix<3, 1>.