关于C++域作用符

1.引用全局作用域中的变量,函数等

1
2
3
4
5
6
7
int a;

void foo() {
int a = 2;
std::cout << a << std::endl; //函数作用域中的局部变量
std::cout << ::a << std:: endl; //全局作用域的全局变量
}

2.指定某个范围(类,命名空间等)内的成员

1
2
3
4
5
6
7
8
class Demo {
public:
void foo();
}

void Demo::foo() { //指定foo为类Demo的成员函数
std::cout << "Hello World" << std::endl; 这里的的域作用符就是指定使用命名空间std中的cout,endl对象
}

解释以下代码为什么会报错:

1
2
3
4
5
class A {};
class B : A {};
class C : B {
A a;
};

C++标准规定,名字查找顺序中,基类的查找顺序优先于类所在的命名空间.这里是私有继承,因为C无法访问B的私有成员,所以报错,修改方式如下:

1
2
3
4
5
6
7
8
9
10
11
class A {};
class B : public A {};
class C : public B {
A a;
};

class A {};
class B : A {};
class C : B {
::A a;
};
script>