C++/Language/Static
Содержание
- 1 A shared resource example.
- 2 A static member variable example.
- 3 Init static data before object creation
- 4 Static function and static variable
- 5 Static function variable
- 6 Static Member Functions: its strictions
- 7 Static member functions: "preinitialize" private static data
- 8 Usage and effect of a static data member
- 9 Use a static member variable independent of any object.
<source lang="cpp">
- include <iostream>
- include <cstring>
using namespace std; class output {
static char sharedResource[255]; // this is the shared resource static int inuse; // buffer available if 0; in use otherwise static int oindex; // index of sharedResource char str[80]; int i; // index of next char in str int who; // identifies the object, must be > 0
public:
output(int w, char *s) { strcpy(str, s); i = 0; who = w; } int putbuf() { if(!str[ i ]) { // done outputting inuse = 0; // release buffer return 0; // signal termination } if(!inuse) // get buffer inuse = who; if(inuse != who) // in use by someone else return -1; if(str[ i ]) { // still chars to output sharedResource[oindex] = str[ i ]; i++; oindex++; sharedResource[oindex] = "\0";// always keep null-terminated return 1; } return 0; } void show() { cout << sharedResource << "\n"; }
}; char output::sharedResource[255]; // this is the shared resource int output::inuse = 0; // buffer available if 0; in use otherwise int output::oindex = 0; // index of sharedResource int main() {
output object1(1, "This is a test"), object2(2, " of statics"); while(object1.putbuf() | object2.putbuf()) ; // output chars object1.show(); return 0;
}
</source>
A static member variable example.
<source lang="cpp">
- include <iostream>
using namespace std; class myclass {
static int i;
public:
void setInt(int n) { i = n; } int getInt() { return i; }
};
int myclass::i; // Definition of myclass::i. i is still private to myclass. int main() {
myclass object1, object2; object1.setInt(10); cout << "object1.i: " << object1.getInt() << "\n"; // displays 10 cout << "object2.i: " << object2.getInt() << "\n"; // also displays 10 return 0;
}
</source>
Init static data before object creation
<source lang="cpp">
- include <iostream>
using namespace std; class StaticMemberClass {
static int i;
public:
static void init(int x) { i = x; } void show() { cout << i; }
}; int StaticMemberClass::i; // define i int main() {
StaticMemberClass::init(100); StaticMemberClass x; x.show(); return 0;
}
</source>
Static function and static variable
<source lang="cpp">
- include <iostream>
using namespace std; class MyClass {
static int i;
public:
static void init(int x) { i = x; } void show() { cout << i; }
}; int MyClass::i; int main() {
// init static data before object creation MyClass::init(30); MyClass x; x.show(); return 0;
}
</source>
Static function variable
<source lang="cpp">
- include <iostream>
using namespace std; void printMessage(void); int main () {
char choice; do { cout << "Enter Q to quit, any other character to continue: "; cin >> choice; if (choice == "Q") cout << "Input stopped"; else printMessage(); } while (choice != "Q"); return 0;
} void printMessage (void) {
static int times = 0; times++; cout << "This function called " << times << " times\n";
}
</source>
Static Member Functions: its strictions
<source lang="cpp"> //A static member function does not have a this pointer. //cannot be a static and a non-static version of the same function. //A static member function may not be virtual. //static functions cannot be declared as const or volatile.
- include <iostream>
using namespace std; class MyClass {
static int resource;
public:
static int getResource(); void freeResource() { resource = 0; }
}; int MyClass::resource; // define resource int MyClass::getResource() {
if(resource) return 0; // resource already in use else { resource = 1; return 1; // resource allocated to this object }
} int main() {
MyClass myObject1, myObject2; if(MyClass::getResource()) cout << "myObject1 has resource\n"; if(!MyClass::getResource()) cout << "myObject2 denied resource\n"; myObject1.freeResource(); if(myObject2.getResource()) cout << "myObject2 can now use resource\n"; return 0;
}
</source>
Static member functions: "preinitialize" private static data
<source lang="cpp">
- include <iostream>
using namespace std; class static_type {
static int i;
public:
static void init(int x) { i = x; } void show() { cout << i; }
}; int static_type::i; int main() {
static_type::init(100); // init static data before object creation static_type x; x.show(); return 0;
}
</source>
Usage and effect of a static data member
<source lang="cpp">
- include <iostream>
using namespace std; class shared {
static int a; int b;
public:
void set(int i, int j) { a=i; b=j; } void show();
} ; int shared::a; void shared::show() {
cout << "This is static a: " << a; cout << "\nThis is non-static b: " << b; cout << "\n";
} int main() {
shared x, y; x.set(1, 1); x.show(); y.set(2, 2); y.show(); x.show(); return 0;
}
</source>
Use a static member variable independent of any object.
<source lang="cpp">
- include <iostream>
using namespace std; class myclass { public:
static int i; void setInt(int n) { i = n; } int getInt() { return i; }
}; int myclass::i; int main() {
myclass object1, object2; myclass::i = 100; // set i directly, no object is referenced. cout << "object1.i: " << object1.getInt() << "\n"; // displays 100 cout << "object2.i: " << object2.getInt() << "\n"; // also displays 100 return 0;
}
</source>