我正在测试课程并且我创建了这个课程
class Point
{
private:
int x,y;
public:
void setit(int new_x,int new_y);
void set_x(int new_x);
void set_y(int new_y);
int get_x();
int get_y();
};
现在我继续编写了所有公共函数的函数定义,但是,
当我写void set(int new_x,int new_y);
时,有些事让我困惑不解
功能定义
void Point::setit(int new_x, int new_y){
Point::set_x(new_x);
Point::set_y(new_y);
}
void Point::setit(int new_x, int new_y){
set_x(new_x);
set_y(new_y);
}
我注意到前两个函数定义具有完全相同的效果。
我认为没有::运算符就行不通,因为它会搜索类外的函数,因为我不再表示它们在Point类中
任何人都可以解释为什么它们都有相同的效果吗?
谢谢。
答案 0 :(得分:6)
::
是范围解析运算符;它可以告诉编译器到哪里查找名称。
Point::set_x
只是用于调用成员函数的扩展语法。
set_x(new_x);
是
的缩写this->set_x(new_x);
和
Point::set_x(new_x);
等同于
this->Point::set_x(new_x);
它允许您选择当类隐藏父类中的函数时要调用的函数。例如:
struct A {
void f();
};
struct B : public A {
void f(); // Hides A::f
};
B binst;
binst.f(); // Calls B::f
binst.A::f(); // Calls A::f
使用此语法可以做的一件事是从基类的重写虚函数调用父类的成员函数,允许您使用基类提供的“默认实现”。您也可以在课外进行,类似于隐藏功能:
struct A {
virtual void f() {
cout << "A::f" << endl;
}
};
struct B : public A {
virtual void f() override {
cout << "B::f" << endl;
A::f(); // if we just did f(), it would call B::f, and we
// would get infinite recursion
}
};
B b;
b.f(); // prints B::f A::f
b.A::f(); // prints B::f
答案 1 :(得分:2)
在类成员函数中,所有类成员名都在范围内,因此找到set_x
。
此外,类名本身在类成员函数中是可见的(据说是注入),因此也找到了Point::set_x
。但出于同样的原因,Point::Point::set_x
和Point::Point::Point::Point::set_x
也是命名函数的方法。
答案 2 :(得分:1)
::
是范围解析运算符。要访问Point
类'命名空间范围内的函数,您可以使用::
运算符,但因为函数setit(int new_x, int new_y)
已与set_x
处于同一范围内且set_y
,无需定义这些功能的总体范围。该程序将在最本地范围内调用具有匹配符号的函数到set_x
和set_y
。