類指針訪問
1. C++類指針在訪問的時候何時用"->",何時候用"."
很高興你能問這個問題,我想很多學程序設計不久的學生真不知道->的用法,我仔細說給你聽吧:
簡單來說,「->」的前面一定是一個「指向結構體的指針」或「對象指針」,後面是結構或對象的一個"成員" 。
如有:A->B,則可以肯定A是一個結構體指針或類的對象指針,而B是A中的一個成員。
以你的便子為例:
class A{...假設裡面含有一個set()函數...}
A a,*p;
a是一個對象名,所以可以用a.set(),當然你還可以用(&a)->set( ),兩者是等價的。
p如果指向一個結構體或對象,可以這樣使用其中的成員:
p->set( )或者 p[0].set( ) 或者 (*p).set( )
當然如果p指向一個結構體數組或對象數組的話,則可以這樣用:p->set( )表示對數組的第0個元素進行操作,等價於p[0]->set( )或*(p+0).set( ),如果想訪問數組的第i個對象中的成員,則可以有這樣幾種方式,他們是等價的:
p[i],set( ) , *(p+i).set( ), (p+i)->set( ),
(&p[i])->set( )
可以看出符號"->"的左邊必須是結構體或對象指針,而不能是普通變數。右邊肯定是結構體或對象的成員。
特別說明的是:簡單地認為「->」的左邊是一個指針過於簡單了。這個符號是用來代替*和.的合成,因為一般情況下通過「指針」訪問結構體或對象成員,是「先求值,再取分量」,即上述的(*p).set( ),因為用兩個符號過於麻煩,所以才使用「->」來代替,這樣直觀、簡單得多。
2. void類型的指針訪問內存,為什麼錯誤 ps對於void類型指針了解非常少,希望能夠給點簡單的介
int *p;這一句定義了一個指針變數,但是沒有指向任何值,不安全的指針。
p=100;這一句是錯誤的,指針不能顯式的賦以地址。
void 指針可以網路。void相當與萬能指針,可以指向任何類型的變數。
但是不是很建議用,例如 malloc()可以申請內存,且返回空指針,可以我們一般顯式轉換成int,之類。。。
3. C++類中,用指針訪問對象成員問題
test是棧對象,不需要顯示的初始化,會默認調Tclass的構造函數。
pt是堆對象,需要顯示的初始化,不會自動調Tclass的構造函數。
正確的方式如下:
int main() {
Tclass test;
Tclass *pt = new Tclass();
pt->x = 100;
pt->y = 200;
pt->print();
test.x = 150;
test.y = 450;
test.print();
cout << "x+y=" << add(&test);
return 0;
}
4. C++類成員包含另一個類的指針對象,怎麼對這個指針對象操作來訪問它的成員
問題1:
A*p;
沒有指向任何地址的指針,而你又用這個沒指向任何地址的指針去修改值:p->data=1
問題2
指針訪問數據都是用->來訪問的。。如果你非要用.來訪問,可以這樣寫:(*p[0]).data
正確的代碼應該是這樣的:
#include<iostream>
usingnamespacestd;
classA
{
public:
intdata;
};
classB
{
public:
A*p;
public:
B();
voidf();
};
B::B()
{
this->p=newA();
}
voidB::f()
{
this->p->data=1;
printf("%d ",this->p->data);
}
intmain(void)
{
Bb;
b.f();
return0;
}
5. 談談基類指針對類的成員函數的訪問許可權問題
基類指針
對其自己的成員函數:隨便訪問
對子類成員函數:不可訪問(對於虛函數,都是子類的指針對子類重寫的新的虛函數的引用,或者未重寫時候,父類的虛函數的引用,父類即使用指針引了虛函數,也是引自己的)
6. 類的指針如何訪問類的引用
聲明:類名*對象指針名(point*ptr)
賦值:ptr=&p1(point p1)
訪問:對象指針名->成員名(ptr->data)
(*對象指針名).成員名
不知道你是不是問的這個東西?
7. 在c++中,類的靜態成員函數可以通過類的指針訪問類的非靜態數據成員嗎
可以的,不過要間接訪問。看下面的例子
#include<iostream>
usingstd::cout;
usingstd::endl;
classA{
intdata;
public:A(inti):data(i)
{
cout<<"new"<<endl;
};
A():data(0)
{
cout<<"newA"<<endl;
};
A(constA&a){
data=a.data;
cout<<"newA"<<endl;
};
~A()
{
cout<<"delete"<<endl;
};
staticvoidaccess(A*a)//靜態成員,參數為對象指針
{
a->data++;
cout<<a->data<<endl;//通過指針訪問內部非靜態對象;但不能用this指針直接來訪問
}
};
intmain()
{
Ab(2);
b.access(&b);//靜態成員函數訪問
return0;
}
8. 未初始化的類的指針可以訪問類的成員
其實,在調用類的成員函數時,默認會將this的值傳入第一個形參,這個參數主要是用來訪問類的成員變數的。
如果在成員函數的實現中,沒有引用任何成員變數(為對象分配的空間),使用空指針去調用都不會發生錯誤,因為在實現中你並未使用它。例如:
classB
{
public:
voidTest()
{
printf("運行時不會core掉 ");
}
voidTest2()
{
printf("運行下面的代碼時會報錯,因為引用成員變數時是基於0地址的 ");
a=100;
}
private:
inta;
};
intmain()
{
B*lpB=NULL;
lpB->Test();
lpB->Test2();
return0;
}
9. 為什麼一個類的空指針可以訪問類的成員函數
class MyClass{public:int i;void hello(){printf("hello/n");}void print(){printf("%d/n", i);}};void main(){MyClass* pmy = NULL;
pmy-hello();}看上面的這段代碼,似乎很詭異。 用一個空指針調用成員函數,簡直是天大的錯誤,可以遺憾的是,卻是可行的,至少對於上面的這段程序來說,不會照成錯誤。
之前運行的原因。
大家知道,每個對象,都有一個指向自己的this指針,這個指針的值,將會因為對象的不同而不同,它的作用主要就是用來區分不同的對象,這樣你就可以根據它
來訪問不同的對象的成員變數。然而,我們main函數中的hello函數並沒有使用類中的任何成員變數,所以,它也就不會用到this指針,此時的this指針是NULL。從而
我們就可以沒有障礙的使用hello函數,然而相對的是,如果你在pmy-hello()之後接著調用pmy-print(),那麼將會報空指針錯誤,因為這個函數試圖用this指針訪問成員變數i。
10. C++有關問題,基類的指針可以訪問訪問基類的虛函數嗎
沒說不可以訪問吧,
編譯報的錯是「rror C2259: 「A」: 不能實例化抽象類」
因為你的類A中有純虛函數,所以A也就是抽象類的,抽象類是不能定義對象的,你那對象a(main函數中的第一行)是不允許定義的。
證明A*的指針可以訪問A里的方法寫個函數就可以了,如下的編譯沒問題。:
voidRunT(A*p)
{
p->Show();
}