04. 命名空间,函数重载,内联

Posted nutshelln

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04. 命名空间,函数重载,内联相关的知识,希望对你有一定的参考价值。

一.命名空间

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.返回值和调用约定没有效果

C函数编译后基本只保存了函数名,无法重载。

C++处理函数时,会将作用域,函数名,参数列表,返回值,调用约定等都保存起来。

打开开发人员命令行工具,探索vs的名称粉碎,输入undname可解析函数签名,例如:

技术图片

 

 头文件中如下写,可以实现C调用C++,或者C++调用C:

#pragma once
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

int myadd(int a, int b);


#ifdef __cplusplus
}
#endif // __cplusplus

以上是关于04. 命名空间,函数重载,内联的主要内容,如果未能解决你的问题,请参考以下文章

C++入门(命名空间缺省参数函数重载引用内联函数)

超详细的C++入门学习(命名空间,缺省参数,内联函数,函数重载等)

C++入门语法第一篇:(命名空间缺省参数函数重载引用内联函数)

C++初阶:入门总结命名空间 | 缺省参数 | 函数重载 | 引用 | 内联函数

C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

C++ 初阶 新语言入门介绍:命名空间,(全/半)缺省函数,函数重载,引用,内联,auto