這是一個從http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/爲什麼我需要在有私有變量時使引用保持不變?
代碼的位我一直在調查運營商從幾個自我教育網站和瀏覽論壇重載。我問了一個關於使用不同方法重載的問題,現在我明白了。那Q &鏈接在這裏How is this returning a value when it has not been defined?
但是,這種方法引用我不明白。我試圖用不同的方式來實現代碼,並且看到了一些不那麼複雜的工作方式。
我知道做到這一點的方法是使一個類的實例作爲操作功能,操作函數的臨時實例的參數,與=運算符返回的值。這種方式要複雜得多,我爲此甚至需要解決一些問題。因爲你去的代碼,但這裏有三個問題我有
這些問題的措辭。
(問題1)Ceteris parabis,爲什麼我需要參數中的const關鍵字?我知道,如果我公開變量,我不知道,但爲什麼如果有一個朋友類,或者如果代碼寫入類本身,我需要使用const。
(問題2)如果我將朋友功能放在課堂內,我仍然需要關鍵字「朋友」爲什麼?
(問題3)初始化類別c1和c2在哪裏?他們有一個參考,但在返回之前沒有初始化,但是低於參考。我認爲編譯時會出現錯誤。
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents) { m_nCents = nCents; }
//I know this assigns each
//instance to the private variable m_nCents since it's private.
// Add Cents + Cents
friend Cents operator+(const Cents &c1, const Cents &c2);
//why do we need
//to make this a friend? why can't we just put it inside the class and not
//use the "friend" keyword? also why do I need to make the variables public
//if i remove const from the parameters
int GetCents() { return m_nCents; }
//I know how this is used to return the
// variable stored in m_nCents, in this program it is for cout
};
// note: this function is not a member function!
Cents operator+(const Cents &c1, const Cents &c2)
//where are these references
//actually defined? I do not see c1 or c2 anywhere except in the return, but
//that is below the code that is referencing the class
{
// use the Cents constructor and operator+(int, int)
return Cents(c1.m_nCents + c2.m_nCents);
}
int main()
{
Cents cCents1(6);
Cents cCents2(8);
Cents cCentsSum = cCents1 + cCents2;
std::cout << "I have " << cCentsSum .GetCents() << " cents." << std::endl;
return 0;
}
這是非常簡單和有益的。我現在理解問題3。對於問題1,我瞭解const的重要性,但是當我刪除const關鍵字時,我的編譯器XCode會拋出所有其他東西保持不變的錯誤。那是因爲我的編譯器知道結果可能是災難性的,所以它決定不編譯它,或者這會導致任何編譯器錯誤? – Scott
@Scott您是否已經爲'friend'聲明*和*實際定義刪除了'const'?他們需要匹配,你不能刪除其中的一個'const'。 –
@Scott我在回答中增加了一段,希望能幫助你理解Q2。 –