C++ Tutorial/Class/object pointer
Содержание
- 1 Incrementing and decrementing an object pointer
- 2 normal functions accessed from pointer
- 3 Passing References to Objects
- 4 Pointers as data members
- 5 Pointers to Class Members
- 6 Sort person objects using array of pointers
- 7 To use a pointer to the object, you need to use the ->* operator
- 8 Use class pointer and class array together
- 9 Use new to allocate memory for a class pointer
- 10 Use & to get object address
Incrementing and decrementing an object pointer
<source lang="cpp">#include <iostream> using namespace std;
class MyClass {
int x;
public:
void setX(int val) { x = val; } void display(){ cout << x << "\n"; }
};
int main() {
MyClass ob[2], *p; ob[0].setX(10); // access objects directly ob[1].setX(20); p = &ob[0]; // obtain pointer to first element p->display(); // show value of ob[0] using pointer p++; // advance to next object p->display(); // show value of ob[1] using pointer p--; // retreat to previous object p->display(); // again show value of ob[0] return 0;
}</source>
10 20 10
normal functions accessed from pointer
<source lang="cpp">#include <iostream>
using namespace std; class Base{ public: void show(){ cout << "Base\n"; } }; class Derv1 : public Base{ public: void show(){ cout << "Derv1\n"; } }; class Derv2 : public Base{ public: void show(){ cout << "Derv2\n"; } }; int main(){ Derv1 dv1; Derv2 dv2; Base* ptr; ptr = &dv1; ptr->show(); ptr = &dv2; ptr->show(); return 0; }</source>
Passing References to Objects
<source lang="cpp">#include <iostream> using namespace std;
class MyClass {
int id;
public:
int i; MyClass(int i); ~MyClass(); void neg(MyClass &o) { o.i = -o.i; } // no temporary created
};
MyClass::MyClass(int num) {
cout << "Constructing " << num << "\n"; id = num;
}
MyClass::~MyClass() {
cout << "Destructing " << id << "\n";
}
int main() {
MyClass o(1); o.i = 10; o.neg(o); cout << o.i << "\n"; return 0;
}</source>
Pointers as data members
<source lang="cpp">#include <iostream>
class MyClass { public: MyClass(); ~MyClass(); int GetAge() const { return *itsAge; } void SetAge(int age) { *itsAge = age; } int GetWeight() const { return *itsWeight; } void setWeight (int weight) { *itsWeight = weight; } private: int * itsAge; int * itsWeight; }; MyClass::MyClass() { itsAge = new int(2); itsWeight = new int(5); } MyClass::~MyClass() { delete itsAge; delete itsWeight; } int main() { MyClass *objectPointer = new MyClass; std::cout << "objectPointer is " << objectPointer->GetAge() << " years old\n"; objectPointer->SetAge(5); std::cout << "objectPointer is " << objectPointer->GetAge() << " years old\n"; delete objectPointer; return 0; }</source>
objectPointer is 2 years old objectPointer is 5 years old
Pointers to Class Members
<source lang="cpp">#include <iostream> using namespace std;
class MyClass { public:
MyClass(int i) { val=i; } int val; int double_val() { return val+val; }
};
int main() {
int MyClass::*data; // data member pointer int (MyClass::*func)(); // function member pointer MyClass ob1(1), ob2(2); // create objects data = &MyClass::val; // get offset of val func = &MyClass::double_val; // get offset of double_val() cout << "Here are values: "; cout << ob1.*data << " " << ob2.*data << "\n"; cout << "Here they are doubled: "; cout << (ob1.*func)() << " "; cout << (ob2.*func)() << "\n"; return 0;
}</source>
Sort person objects using array of pointers
<source lang="cpp">#include <iostream>
#include <string> using namespace std; class person{ protected: string name; public: void setName() { cout << "Enter name: "; cin >> name; } void printName() { cout << endl << name; } string getName() { return name; } }; int main(){ void bsort(person**, int); person* persPtr[100]; int n = 0; char choice; do { persPtr[n] = new person; persPtr[n]->setName(); n++; cout << "Enter another (y/n)? "; cin >> choice; }while( choice=="y" ); cout << "\nUnsorted list:"; for(int j=0; j<n; j++) { persPtr[j]->printName(); } bsort(persPtr, n); cout << "\nSorted list:"; for(int j=0; j<n; j++) { persPtr[j]->printName(); } cout << endl; return 0; } void bsort(person** pp, int n){ void order(person**, person**); int j, k; for(j=0; j<n-1; j++) for(k=j+1; k<n; k++) order(pp+j, pp+k); } void order(person** pp1, person** pp2){ if( (*pp1)->getName() > (*pp2)->getName() ) { person* tempptr = *pp1; *pp1 = *pp2; *pp2 = tempptr; } }</source>
To use a pointer to the object, you need to use the ->* operator
<source lang="cpp">#include <iostream> using namespace std;
class MyClass { public:
MyClass(int i) { val=i; } int val; int double_val() { return val+val; }
};
int main() {
int MyClass::*data; // data member pointer int (MyClass::*func)(); // function member pointer MyClass ob1(1), ob2(2); // create objects MyClass *p1, *p2; p1 = &ob1; // access objects through a pointer p2 = &ob2; data = &MyClass::val; // get offset of val func = &MyClass::double_val; // get offset of double_val() cout << "Here are values: "; cout << p1->*data << " " << p2->*data << "\n"; cout << "Here they are doubled: "; cout << (p1->*func)() << " "; cout << (p2->*func)() << "\n"; return 0;
}</source>
Use class pointer and class array together
<source lang="cpp">#include "iostream.h" class MyClass { private:
int Price; int Count; long Total;
public:
void Input(int P,int C) { Price=P; Count=C; } void MyClass::Compute() { Total=(long) Price*Count; } void MyClass::Print(){ cout<<"Price="<<Price<<" Count="<<Count <<" Total="<<Total<<"\n"; }
}; int main() {
MyClass *ob; ob=new MyClass[6]; ob[0].Input(5,0); ob[1].Input(3,5); ob[2].Input(1,0); ob[3].Input(5,20); ob[4].Input(4,0); ob[5].Input(8,5); for(int i=0;i<6;i++) ob[i].Compute(); for(int i=0;i<6;i++) ob[i].Print(); delete ob;
}</source>
Price=5 Count=0 Total=0 Price=3 Count=5 Total=15 Price=1 Count=0 Total=0 Price=5 Count=20 Total=100 Price=4 Count=0 Total=0 Price=8 Count=5 Total=40
Use new to allocate memory for a class pointer
<source lang="cpp">#include<iostream.h>
- include<string.h>
class phone {
char name[50]; char tell[15];
public:
void store(char *n,char *num); void print();
}; void phone::store(char *n,char *num) {
strcpy(name,n); strcpy(tell,num);
} void phone::print() {
cout<<name<<":"<<tell; cout<<"\n";
} main() {
phone *p; p=new phone; if(!p) { cout<<"Alloction error."; return 1; } p->store("AA","9999999999"); p->print(); delete p; return 0;
}</source>
AA:9999999999
Use & to get object address
<source lang="cpp">#include <iostream>
class MyClass { public: MyClass(); MyClass(MyClass&); ~MyClass(); int GetAge() const { return itsAge; } void SetAge(int age) { itsAge = age; } private: int itsAge; }; MyClass::MyClass() { std::cout << "Constructor...\n"; itsAge = 1; } MyClass::MyClass(MyClass&) { std::cout << "Copy Constructor...\n"; } MyClass::~MyClass() { std::cout << "Destructor...\n"; } const MyClass * const FunctionTwo (const MyClass * const obj); int main() { MyClass myObject; std::cout << "myObject is "; std::cout << myObject.GetAge() << " years old\n"; int age = 5; myObject.SetAge(age); std::cout << "myObject is "; std::cout << myObject.GetAge() << " years old\n"; std::cout << "Calling FunctionTwo...\n"; FunctionTwo(&myObject); std::cout << "myObject is "; std::cout << myObject.GetAge() << " years old\n"; return 0; } const MyClass * const FunctionTwo (const MyClass * const obj) { std::cout << "Function Two. Returning...\n"; std::cout << "myObject is now " << obj->GetAge(); std::cout << " years old \n"; return obj; }</source>
Constructor... myObject is 1 years old myObject is 5 years old Calling FunctionTwo... Function Two. Returning... myObject is now 5 years old myObject is 5 years old Destructor...