privateのint i = 5や構造体の初期化をこの場所でするのとコンストラクタの: を使って初期化するのとは処理内容はどう違うのでしょうか?
またコンストラクタの定義内{ }の中ですることは初期化ではなく代入なのは知っているんのですが参考書のほうではデータの初期化はコンストラクタ初期化しにて行うとあるんのですが
書いてある場所でも宣言と初期化を行っても同じ数値が出力されるため同じく初期化されてると思われます、、違いを教えてくれますでしょうか?

        #include <iostream>
        #include <string>
        #include <sstream>
        using namespace std;
        template<typename type>class test {
        private:

            typedef struct  {
                type x;
                type y;
                string name;
            }st;

            st t{0,0,"no name"};
            type *p;
            st *stp;

            int a;
            int b;
            string name;
            int i = 5;
        public:
            static int counter;

            //test(){   }

            test(int aa = 0,int bb = 0,string n ="no name"):a(aa),b(bb),name(n)
            {

            }


            string view()const {
                ostringstream os;
                os << a << " : " << b << " : " << name <<" : "<<"\n";
                return os.str();
            }


            int getcounter()const {
                return counter;
            }


        };

        ostream& operator<<(ostream& os, const test<int> &t);

        istream& operator>>(istream& is, test<int> &t);