変数のスコープ範囲

新しい言語を習得するとき、気になるのが変数のスコープ範囲まわりの仕様。で、こんなの書いてフィーリングを確かめる。

#include 
#include 

int calledcount = 0;

int test1(std::string str)
{
    std::cout << str << '\n' ;
//  std::strcat(str,"+") ;
    str = "HOGEFUGA" ;
    std::cout << str << '\n' ;
    return(0) ;
}

int test2(std::string& str)
{
    std::cout << str << '\n' ;
    str = "HOEHOE" ;
    std::cout << str << '\n' ;
    return(0);
}

int test3()
{
    extern int calledcount ;
    calledcount++ ; 
}

int test4(int a)
{
    static int memoryit ;
    if (a == 0) 
    {
        memoryit = a ;
    } else {
        memoryit = memoryit + a ;
        std::cout << memoryit << '\n' ;
    }
    return(0) ;
}

int test5(std::string& str)
{
    std::string work = "workstring" ;
    str = work ;
    std::cout << str << '\n' ;
    return(0) ;
}
int main()
{
    std::string str = "TEST1" ;
    test1(str) ;
    std::cout << str << '\n' ;

    str = "TEST2" ;
    test2(str) ;
    std::cout << str << '\n' ;

    test3();
    test3();
    std::cout << calledcount << '\n' ;

    test4(0) ;
    test4(10) ;
    test4(2) ;
    test4(1) ;

    std::cout << "now test5\n" ;
    test5(str) ;
    std::cout << str << '\n' ;
    return(0) ;
}

で、実行結果はこれ。

TEST1
HOGEFUGA
TEST1
TEST2
HOEHOE
HOEHOE
2
10
12
13
now test5
workstring
workstring

興味深いのはtest5の結果。これ最後は表示されないんじゃないかとか思ってたんだけど、関数の中で設定された値がそのまま引き継がれた。string型の変数ってポインタで実体はどこは他のところにあって、代入文ではポインタだけがはいって実体は移送されないと思ってた。ところが関数抜けた後も中で設定した他のインスタンスから代入した値もちゃんととれてる。うーむ、そーゆーものなのか。

・・・いまにして思うとtest3はソース別にしないと意味ないような気がしてきたw