Инициализация объекта в C ++ - PullRequest
       1

Инициализация объекта в C ++

1 голос
/ 23 февраля 2012

Я смотрю на чей-то код, я не понимаю, как объект инициализируется здесь:

template <typename String>
void test_numbers()
{
  SampleClass<String> compare;
  String lhs = "abc";
  String rhs = "efg";
  check_equality(compare(lhs, rhs), true);
}

Сравнение объектов создается из класса SampleClass, а затем присваивается 2 строки при передаче в качестве параметра. Как работает эта инициализация? Любые комментарии? предложения?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012
//I am initialised with my default constructor (no args) 
SampleClass<String> compare;

//I am initialised with my `const char*` constructor (and assignment operator)   
String lhs = "abc";
String rhs = "efg";

//Compare (already initialised) is being invoked by it's `operator()`
check_equality(compare(lhs, rhs), true);

сравнение уже построено. В нем реализовано operator(), что позволяет ему отображаться как функция, принимающая аргументы.

Вы можете легко сделать свой собственный.

struct op_test{
    int i;
    op_test(int i_) : i(i_){}
    int operator()(int j)const { return j*i; }
};
:::
op_test ot(5);
ot(6); //5*6

Причина, по которой это полезно, в том, что мы можем делать что-то подобное.

std::vector<int> a(700); //700 ints

std::transform(a.begin(), a.end(), b.begin(), op_test(5));
//or
std::transform(a.begin(), a.end(), b.begin(), &my_func); //calls a function
std::transform(a.begin(), a.end(), b.begin(), [](int i){ return i*5; }); //lambda

см. Здесь: http://msdn.microsoft.com/en-us/library/5tk49fh2(v=vs.80).aspx полезно с http://en.cppreference.com/w/cpp/algorithm

0 голосов
/ 23 февраля 2012

Он просто создает автоматическую переменную типа SampleClass<String>.Затем вызывается operator() с двумя String аргументами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...