C++ has at least four different initialization notations, some of which overlap.
Parenthesized initialization looks like this:
std::string s("hello");
int m=int(); //default initialization
You can also use the = notation for the same purpose in certain cases:
std::string s="hello";
int x=5;
For POD aggregates, you use braces:
int arr[4]={0,1,2,3};
struct tm today={0};
Finally, constructors use member initializers:
struct S {
int x;
S(): x(0) {} };
This proliferation is a fertile source for confusion, not only among novices. Worse yet, in C++03 you can't initialize POD array members and POD arrays allocated using new[]. C++11 cleans up this mess with a uniform brace notation:
class C
{
int a;
int b;
public:
C(int i, int j);
};
C c {0,0}; //C++11 only. Equivalent to: C c(0,0);
int* a = new int[3] { 1, 2, 0 }; /C++11 only
class X {
int a[4];
public:
X() : a{1,2,3,4} {} //C++11, member array initializer
};
With respect to containers, you can say goodbye to a long list of push_back() calls. In C++11 you can initialize containers intuitively:
// C++11 container initializer
vector<string> vs={ "first", "second", "third"};
map singers =
{ {"Lady Gaga", "+1 (212) 555-7890"},
{"Beyonce Knowles", "+1 (212) 555-0987"}};
Similarly, C++11 supports in-class initialization of data members:
class C
{
int a=7; //C++11 only
public:
C();
};