一.命名空间
C语言中为避免冲突,可能采用
项目名_模块名_名字 的形式,缺点是冗长
C语言中作用域:块,局部(函数),文件,全局
C++有采用命名空间
用法1:using namespace MyNamespace;
namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    int val = 9;//全局
    void f() {
    }
    struct MyStruct {
        int age;
        double score;
    };
}
using namespace MyNamespace;
int main() {   
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}
int Foo() {
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}
如果把using namespace MyNamespace;放在函数内部,则只在该函数内可见。
int main() {   
    using namespace MyNamespace;//把整个命名空间的所有名字导入当前作用域
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}
int Foo() {
    //本函数无法使用以下内容,编译出错
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}
用法2:
int main() {     
    MyNamespace::val = 100;
    MyNamespace::f();
    MyNamespace::MyStruct str{ 1,1.1234 };
    return 0;
}
用法3:
using MyNamespace::val;//把MyNamespace的val导入当前作用域
using MyNamespace::f;
using MyNamespace::MyStruct;
int main() {       
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}
命名空间可以不连续,可以写在多个文件中,例如:
namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    int val = 9;//全局
    void f() {
    }
    struct MyStruct {
        int age;
        double score;
    };
}
namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    double foo = 9;//全局
    void g() {
    }
}
命名空间可以嵌套:
namespace MyNamespace1 {
    namespace MyNamespace2 {
        namespace MyNamespace3 {
            int age = 100;
        }
    }
}
int main() {
    MyNamespace1::MyNamespace2::MyNamespace3::age = 0;
    return 0;
}
命名空间可以取别名:
namespace MyNamespace1 {
    namespace MyNamespace2 {
        namespace MyNamespace3 {
            int money = 100;
        }
    }
}
namespace Space = MyNamespace1::MyNamespace2::MyNamespace3;//取个别名,和命名空间原来的名字等价
using namespace Space;
int main() {
    money = 0;
    return 0;
}
using 指示可能会造成冲突:
namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    double foo = 9;//全局
    void f() {
    }
}
using namespace MyNamespace;
void f() {}
int main() {
    //f();//二义性,编译器可以看见两个f(),不知道调用谁
    MyNamespace::f();//明确指定调用MyNamespace的f()
    ::f();//明确指定调用全局命名空间的f()
    return 0;
}
一.函数重载
C语言中函数不能同名
C++可以重载函数
构成函数重载的条件:
1.作用域相同
2同名函数
3参数列表不同,参数类型、个数、位置任意一个不同均可
3.1参数类型不同
void f(int) {}
void f(double) {}
3.2参数个数不同
void f(int) {}
void f(int, int) {}
3.3参数位置不同
void f(int, double) {}
void f(double, int) {}
4.返回值和调用约定没有效果
原文:https://www.cnblogs.com/Nutshelln/p/12848271.html