Вот пример.
#include <iostream>
class my_strcmp
{
private:
char *m_src;
char *m_dest;
public:
my_strcmp(char *a, char *b);
int strcmp();
};
/** Initializer list in constructor **/
my_strcmp::my_strcmp(char *a, char *b) : m_src(a), m_dest(b)
{
//std::cout<<"Constructor called"<<std::endl;
}
int my_strcmp::strcmp()
{
while( (*src++ == *dest++) && ( *src != '\0') )
{
}
if( (*src=='\0') && (*dest == '\0') )
{
//std::cout<<"Data matches"<<std::endl;
return 0;
}
else
{
return -1;
}
}
int main(int argc, char *argv[])
{
if( argc > 2 )
{
my_strcmp example(argv[1],argv[2]);
std::cout<< (example.strcmp()?"Un-Match":"Match");
std::cout<<std::endl;
}
else
{
std::cout<<"Pass right arguments" << std::endl;
}
return 0;
}
Что я получу по следующему?
/** Initializer list in constructor **/
my_strcmp::my_strcmp(char *a, char *b) : m_src(a), m_dest(b)
{
//std::cout<<"Constructor called"<<std::endl;
}
и почему бы не начать инициализацию в теле? в чем заключается выигрыш?
В простом примере, подобном этому, вы мало выигрываете. Но если m_src
или m_dest
были более крупными, более сложными объектами (у которых был свой собственный конструктор по умолчанию), тогда может получиться больше, потому что объекты сначала будут построены по умолчанию, а затем назначены (вид траты на весь построенный по умолчанию) работа, которая была выполнена).
Кроме того, некоторые типы не имеют конструкторов по умолчанию, поэтому они не могут быть построены по умолчанию и назначены в теле конструктора и должны быть инициализированы в списке инициализаторов.