You created a function handle that accepts three parameters with dummy names a b c. The code of the function handle says that when the function handle is invoked it should accept and ignore up to three parameters and should return a handle to testfuncopt but it should not itself invoke that function.
Then you attempt to invoke the function handle you just created passing in variables a b c from the current environment. That is failing because variable a does not exist.
If you had happened to have a b c in your environment then they would have been accepted by the function handle and ignored and the handle to testfuncopt would be returned. num2str would then fail trying to convert the function handle to string.
You talk about evaluating at an initial point and you have an x0 that looks like it might be an initial point for something but you are not passing it to your function handle and it is only one variable not three.
I think what you want is
objective = @(x) testfuncopt(x(1:2), x(3:4), x(5));
disp(['Initial Objective: ' num2str(objective(x0))])