Visual C++ Keywords: static |
|
Static Variables |
A static variable is one that retains its value when its host function exists. To create such a variable, you can declare it with the static keyword. A function can also be declared as static. Here is an example: |
// This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; static String *CreateFullName(String *FN, String* LN) { String *FullName = String::Concat(FN, " ", LN); return FullName; } int _tmain() { // TODO: Please replace the sample code below with your own. String *Full = CreateFullName(S"Alain", S"Kumar"); Console::WriteLine(S"Full Name: {0}\n", Full); return 0; }
C++ static Classes |
In C++, you must first declare a variable before using it. The C++ language provides an exception to this rule through the static keyword. If you declare a member variable as static in a class, an instance of that class would be made available when the class is used. If you declare a member variable of a class as static, in C++, you must initialize it globally before using the static member variable. Here is an example: |
#include <iostream> using namespace std; class CSquare { public: static double Side; CSquare() {}; void setSide(double S) { Side = S; } double getSide() { return Side; } double Area() { return Side * Side; } }; double CSquare::Side = 30.65; int main() { // TODO: Please replace the sample code below with your own. CSquare Sqr; cout << "Square Characteristics"; cout << "\nSide: " << CSquare::Side; cout << "\nArea: " << Sqr.Area() << endl; Sqr.setSide(44.28); cout << "\nSquare Characteristics"; cout << "\nSide: " << CSquare::Side; cout << "\nArea: " << Sqr.Area(); cout << "\n"; return 0; }
This would produce:
Square Characteristics Side: 30.65 Area: 939.422 Square Characteristics Side: 44.28 Area: 1960.72 Press any key to continue
Notice that, in the above class, we declared the static member variable public, which is sometimes considered bad programming. If you decide to "hide" a member variable in a private section, then you should create a method that would allow the "external world" to access the member variable. Besides a static method that serves as intermediary between a static member variable and other classes, you can use as many methods as you judge necessary. Here is an example: |
#include <iostream> using namespace std; class CSquare { private: static double Side; public: CSquare() {}; static void setSide(double S) { Side = S; } static double getSide() { return Side; } static double Area() { return Side * Side; } }; double CSquare::Side = 30.65; int main() { // TODO: Please replace the sample code below with your own. CSquare Sqr; cout << "Square Characteristics"; cout << "\nSide: " << CSquare::getSide(); cout << "\nArea: " << Sqr.Area() << endl; Sqr.setSide(44.28); cout << "\nSquare Characteristics"; cout << "\nSide: " << CSquare::getSide(); cout << "\nArea: " << Sqr.Area(); cout << "\n"; return 0; }
The result is the same as above
Managed C++ static Classes |
The managed C++ language continues with support for the static keyword and embellish it a little bit. We saw that, in C++, a static member variable must be initialized before using it. Managed C++ modifies this. In managed C++, a static member variable is automatically initialized to 0. Here is an example: |
// This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; public __gc class CSquare { private: static double Side;// = 0.00; public: CSquare() {}; void setSide(double S) { Side = S; } double getSide() { return Side; } double Area() { return Side * Side; } }; int _tmain() { // TODO: Please replace the sample code below with your own. CSquare __gc *Sqr = __gc new CSquare; Console::WriteLine(S"Square Characteristics"); Console::WriteLine(S"Side: {0}", __box(Sqr->getSide())); Console::WriteLine(S"Area: {0}", __box(Sqr->Area())); Sqr->setSide(44.28); Console::WriteLine(S"\nSquare Characteristics"); Console::WriteLine(S"Side: {0}", __box(Sqr->getSide())); Console::WriteLine(S"Area: {0}", __box(Sqr->Area())); Console::WriteLine(S"\n"); return 0; }
Since a static member variable is automatically initialized to 0, you can change this default value to one you like. In Managed C++, you can initialize a static member variable (only a static member variable) in the class in which in which it is declared. Here is an example: |
// This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; public __gc class CSquare { private: static double Side = 40.26; public: CSquare() {}; void setSide(double S) { Side = S; } double getSide() { return Side; } double Area() { return Side * Side; } }; int _tmain() { // TODO: Please replace the sample code below with your own. CSquare __gc *Sqr = __gc new CSquare; Console::WriteLine(S"Square Characteristics"); Console::WriteLine(S"Side: {0}", __box(Sqr->getSide())); Console::WriteLine(S"Area: {0}", __box(Sqr->Area())); Sqr->setSide(44.28); Console::WriteLine(S"\nSquare Characteristics"); Console::WriteLine(S"Side: {0}", __box(Sqr->getSide())); Console::WriteLine(S"Area: {0}", __box(Sqr->Area())); Console::WriteLine(S"\n"); return 0; } |
As you can see above, unlike C++, in Managed C++, regular member variables give access to static member variables without having to be declared as static. Once again, if you decide to put a static member variable in a private section, you can provide one or more equivalent static methods. Here is an example: |
// This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; public __gc class CSquare { private: static double Side = 40.26; public: CSquare() {}; static void setSide(double S) { Side = S; } static double getSide() { return Side; } static double Area() { return Side * Side; } }; int _tmain() { // TODO: Please replace the sample code below with your own. CSquare __gc *Sqr = __gc new CSquare; Console::WriteLine(S"Square Characteristics"); Console::WriteLine(S"Side: {0}", __box(CSquare::getSide())); Console::WriteLine(S"Area: {0}", __box(CSquare::Area())); CSquare::setSide(68.18); Console::WriteLine(S"\nSquare Characteristics"); Console::WriteLine(S"Side: {0}", __box(CSquare::getSide())); Console::WriteLine(S"Area: {0}", __box(CSquare::Area())); Console::WriteLine(S""); return 0; }
|
||
Home | Copyright © 2004-2010 FunctionX, Inc. | |
|