Olá Christopher! Tudo bem?
Isso funciona por causa dos tipos de dados. Pense nas variáveis que criamos. Cada variável é um espaço que reservamos no computador para guardar um dado. No c#, os espaços reservados são diferentes dependendo do tipo de dado. Por isso, precisamos declarar que temos um número inteiro, um número decimal ou uma string, por exemplo, que são tipos primitivos de dados.
Porém, existem os tipos de dados que nós mesmos podemos criar, através das classes. Uma conta é um tipo de dado que nós criamos, e um titular também. Então, toda vez que criamos um objeto do tipo "conta", é como se estivéssemos indo no computador, em uma gaveta onde só podemos guardar contas, e guardando aquela que declaramos.
Mas como criamos o objeto? Através do construtor. O construtor de conta, por exemplo, foi declarado como public Conta (Titular titular, int agencia, ...)
. Se queremos criar uma conta, devemos passar os dados na ordem específica que foi declarada no construtor. É essa ordem que faz com que os valores sejam atribuídos corretamente. Então é como se tivesse os dados de uma conta em uma gaveta em que só entram contas. Mas dentro dessa gaveta, há outras gavetinhas. Uma que comporta o titular, outra pra agencia e assim por diante.
Mas o titular também é um tipo que criamos. Então dentro da conta, dentro do titular, tem as gavetas específicas de cada atributo que passamos no construtor, como o nome, cpf e endereço. Assim, como criamos um objeto do tipo titular, ele também segue a ordem específica do construtor. A conta não guarda só o nome do titular, mas todas as informações que tem no objeto, nessa ordem declarada. Mas se quisesse, por exemplo, que o endereço aparecesse antes, você deveria declarar esse endereço antes.
No final, tudo tem uma relação com a ordem em que foi declarada no construtor e com esse "encaixe" de tipos de dados. É um pouco complexo de entender no começo, mas com a prática você vai assimilando melhor.
Qualquer dúvida, estou à disposição!
Espero ter ajudado e bons estudos!