C++中作用域,名字查找与函数重载

杂七杂八的记录一下免得忘了:

1,using 声明声明的是名字,所以会把函数以及其重载全部带进去

2,函数不能用返回值重载,不能用顶层const重载,可以用底层const重载

3,类的成员函数可以在类内部声明,在类外部声明,这个外部指的是类作用域的外层作用域。所以下面的代码是会报错的

namespace A {
    class Foo{
        Foo();
    };
}

namespace B {
    A::Foo::Foo() {
    }
}

而这样就不会报错:

namespace A {
    namespace B{
        class Foo{
            Foo();
        };
    }
    B::Foo::Foo() {
    }
}

4, 函数调用时,首先会把看得见的函数全部包含进来,然后全部当成重载,再从中选一个,在引入重载时会引入:using 声明,using 指示,如果函数包含自定义类型,还会把该自定义类型所包含的重载引入进来,还有各种模板函数的名字。然后再从中选一个。这也是为什么swap通常要声明成友元而不是成员函数,为什么用swap和用move的方式不一样。

5,理解命名空间在各个文件中是连续的,它在各个命名空间中是连续的并不意味的只要使用一句using namespace sss;就能将sss中所有的名字都引入--我们只能引入看得见的 sss 中的  所有的 名字。这也是为什么有了using namespace std;还需要加各种头文件的原因。命名空间是为了避免名字冲突,命名不连续是为了可以让每个人负责不同的文件。即使我要增加名字的命名空间第一次定义在别的文件,我直接写个namespace xx {}也就行了,其他人只要把我的头文件加入进去,就相当于把我添加的名字也加进去了。

6, 结合5,6,可以推测,所谓的包含类的命名空间中的所有的名字,不包含对应的头文件,那么该头文件添加的名字是不会被添加进去的, 哪怕在编译时加上了那个头文件,不include一下还是会错

7,由于各种引入重载,也需要小心重命名的问题。

posted on 2015-10-08 23:38  远近闻名的学渣  阅读(283)  评论(0)    收藏  举报

导航