コマンドプロンプトでchcp 65001のあと質問のプログラムを走らせると状況は再現しますね。
C++
1#include <iostream>
2#include <string>
3#include <cstring>
4using namespace std;
5
6int main() {
7 string name;
8 cin >> name;
9 cout << "名前は" << name << "です。" << endl;
10 cout << "c_str "<< strlen(name.c_str()) << endl;
11 cout << "string::length" << name.length() << endl;
12 for (int i = 0; i < name.length(); i++) {
13 cout <<" '" << name[i] << ":"<< (int)name[i] << endl;
14 }
15 return 0;
16}
Text
1>g++ test.cpp --input-charset=utf-8 --exec-charset=utf-8
2>a
3山田
4名前は です。
5c_str 0
6string::length2
7 ' :0
8 ' :0
何を解決したいかによりますけれど、C++言語のお勉強の過程で気になったこと、という話なら、あなたの間違いではないので「気にしない」ことにして、Shift JIS環境に合わせてやればよいと思います(コンソールはcp932、ソースもShiftJIS、できればコンパイル時に--input-charset=cp932 --exec-charset=cp932をつける)。
なお、私の手元で
text
1chcp 65001
2>copy con test.txt
3山田^z
^zはCTRL+zですが、これでtest.txtとしてサイズ2byteのファイルが出来て、バイナリエディタで覗くと 00 00 となっているので、これはWindowsレベルの問題、という気がします。