2016-12-29 22 views
-1

我遵循YouTube教程,我可以創建基本的類,但教程沒有解釋Class :: Class如何工作,我搜索谷歌,但我只知道它被稱爲一元運算符,它是什麼但我不知道它如何處理類,請幫我解釋一下,非常感謝。C++一元運算符在類上使用的是什麼意思? (Class :: Class)

#include <iostream> 
#include <string> 

//Class 
class Mother { 

    public: 
     void msg(); 

}; 

void Mother::msg(){ //This is where i don't undrstand 
    std::cout << "Go home early sweetie" << std::endl; 
} 

class Daughter: public Mother { 

    public: 
     void getMsg(); 

}; 

void Daughter::getMsg(){ //Same as this 
    std::cout << "Mom said "; 
    msg(); 
} 


//Main 
int main() { 

    Daughter lucy; 
    lucy.getMsg(); 

    return 0; 
} 
+0

我在代碼中看不到一個一元運算符,但是當您在'Mother :: msg'和'Daughter :: getMsg'函數前面詢問類名時:請注意函數已定義在類聲明之外。所以如果你定義了一個成員函數,你必須給出這個類的名字,否則這個函數將是全局的。這是你問的嗎?爲什麼'母親::'在那裏?或者你在問構造函數嗎? –

+0

是@Karsten,我在詢問函數前面的類名 – ShadowLegend

+0

也可以告訴我這是什麼意思? 'Class :: Class:var {...}'這是否意味着變量是在類內定義的?與你所說的一樣的概念? – ShadowLegend

回答

0

在你的類,你聲明一個成員函數msg(),但你實際上並不存在定義它:

class Mother { 
public: 
    void msg(); 
}; 

通常這個聲明進入.h文件,現在要將函數定義放在.cpp文件中。但是你不能只寫

void msg() 
{ 
    // .. 
} 
在.cpp文件

,因爲這將定義一個全局函數,而不是一個成員函數。此外,編譯器無法知道您確實在嘗試定義成員函數,因爲此時可能會聲明幾個類。所以,你需要一種方法來告訴該函數生活在Mother類中的編譯器:

void Mother::msg() 
{ 
    //.. 
} 

同樣的語法被用於命名空間。從std命名空間走班string

std::string myString; 

編輯: 將特殊功能的構造,它具有相同的名稱類。其定義如下所示:

Mother::Mother() 
{ 
    // .. 
} 

在此構造函數中,可以初始化成員變量並一般設置類實例。所有的成員變量都是在那個時候創建​​的。現在如果你有一個想要傳遞參數給它的構造函數的類型的成員變量呢?假設你有一個成員var有一個構造函數的int

Mother::Mother() : 
    var(1) 
{ 
    // .. 
} 

所以var的構造函數的Mother的構造函數體之前調用,您可以將參數傳遞給它。

0

Class::Class()不是一元運算符 - 它是名爲Class的類的default constructor。換句話說,它是當你有一個聲明如被執行的代碼:

Class my_instance; 

Class another_instance(); 

在默認的構造函數的代碼通常初始化的數據字段或分配系統資源。默認構造函數(或任何構造函數)的副本是破壞函數,表示爲Class::~Class() - 通常會釋放資源。當然,構造函數和析構函數可以做各種各樣的事情 - 它們像任何其他函數一樣具有實體。

我不太確定這可以幫助您使用代碼示例(使用msg()方法) - 但這就是您開始提問的方式,所以我希望這有助於您。

相關問題