這兩條語句有什麼區別?這兩條語句有什麼區別
ob.A::ar[0] = 200;
ob.ar[0] = 200;
其中ob
是類A
class A
{
public:
int *ar;
A()
{
ar = new int[100];
}
};
這兩條語句有什麼區別?這兩條語句有什麼區別
ob.A::ar[0] = 200;
ob.ar[0] = 200;
其中ob
是類A
class A
{
public:
int *ar;
A()
{
ar = new int[100];
}
};
在這種情況下,沒有區別。
這個符號:
obj.Class::member
只是爲了解決來自繼承來的含糊之處:
class A {
public:
int a;
}
class B {
public:
int a;
}
class C : public A, B {
void func() {
// this objects holds 2 instance variables of name "a" inherited from A and B
this->A::a = 1;
this->B::a = 2;
}
}
的目的沒有區別。在這種情況下,ar
的顯式名稱空間限定是多餘的。
在(多重,非虛擬)繼承重新定義名稱ar
的情況下,它可能不是多餘的。樣品(人爲):
#include <string>
class A
{
public:
int *ar;
A() { ar = new int[100]; }
// unrelated, but prevent leaks: (Rule Of Three)
~A() { delete[] ar; }
private:
A(A const&);
A& operator=(A const&);
};
class B : public A
{
public:
std::string ar[12];
};
int main()
{
B ob;
ob.A::ar[0] = 200;
ob.ar[0] = "hello world";
}
看到它在http://liveworkspace.org/code/d25889333ec378e1382cb5af5ad7c203
在這種情況下是沒有區別的。然而,想象ob是從類A和類B繼承的類C,並且A和B都有一個字段ar。那麼就沒有其他的方法可以訪問ar,而是明確地指定你正在引用哪個繼承的數據成員。
你應該閱讀本
ob.A::ar[0] = 200;
ob.ar[0] = 200;
這樣
A::ar[0]
它是ar[0]
同樣的事情,所以2行基本上是相同的事情,運營商::
用於指示所謂分辨率的命名空間,或者僅僅是命名空間。
因爲ob
是類型A的對象,所以命名空間分辨率是隱含的,在訪問ar[0]
之前,您不需要A::
。
你能解釋一下你在A班寫的私人代碼嗎? – Rushil
@Rushil嗯,這是非常關鍵的問題:這是防止「A」被複制的最快方法(這會導致'A :: ar'的雙重刪除)。它被稱爲[Rule Of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree),或者在C++ 11 [Rule Of Zero](http:// rmartinho) .github.com/2012/08/15/rule-of-zero.html)代替:) – sehe
好的。我知道這是脫離主題,但我想知道這意味着什麼。 :-) – Rushil