Logo

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.