2012-10-28 35 views
1

我被檢驗出類和我做了這個類使用(::)在類的成員函數的定義

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); 
} 

我DEF注意到,先前的兩個功能因此具有完全相同的效果。

我認爲沒有::運算這是行不通的,因爲它會搜索類之外的功能,因爲我已經不意味着他們在Point類

任何人都可以解釋爲什麼他們都有同樣的效果?

謝謝。

+1

你能解釋爲什麼你認爲他們會有不同的表現嗎? – Johnsyweb

+0

@Johnsyweb我認爲沒有::運算符它不會工作,因爲它會在類之外搜索這些函數,因爲我不再表示它們在Point類中 –

+0

簡短回答:類成員函數定義的主體是該類的*範圍*的一部分。 – aschepler

回答

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 
+0

我讚賞了這一努力,但這對我來說太過先進了,我仍然在學習課程。我沒有學習結構或 - > –

+1

@MohamedAhmedNabil:呃...你問,不是嗎? :) –

+0

@EdS。我做了,但我只是想要一個更簡單的答案請:) –

1

::是範圍解析操作符。要訪問Point類名稱空間範圍內的函數,可以使用::運算符,但由於函數setit(int new_x, int new_y)set_xset_y的範圍相同,因此不需要定義這些函數的總體範圍。該程序將調用具有匹配符號的函數至set_xset_y在本地範圍內。

2

在類成員函數中,所有類成員名都在範圍內,因此找到set_x

此外,類名稱本身在類成員函數內部是可見的(據說是注入了),因此也找到了Point::set_x。但出於同樣的原因,Point::Point::set_xPoint::Point::Point::Point::set_x也是命名該函數的方法。

+0

我可能會採取我現在要說的另一個問題,但假設這一點:我有一個名爲printnumber的類之外的函數。如果我在屬於類Point的函數setit()中調用printnumber()。它會工作還是會假設printnumber()屬於Point –

+0

@MohamedAhmedNabil:全局名稱空間中的所有內容都處於範圍內,無處不在。 –

+0

偉大的東西,現在我undestand –

相關問題