• 0

C++ A meaning of static


Question

I was reading the Head First Design Patterns Silver C++ translation and came across this:

#ifndef	_HFDP_CPP_VISITOR_INGREDIENT_HPP_
#define _HFDP_CPP_VISITOR_INGREDIENT_HPP_

namespace HeadFirstDesignPatterns {
namespace Visitor {
namespace Menus {

// recommended daily values
static const float dailyCalories = 2000.0f;
static const float dailyCarbs = 300.f;
static const float dailyCholesterol = 0.300f;
static const float dailyFat = 65.0f;
static const float dailyProtien = 50.0f;
static const float dailySodium = 2.400f;

class Visitor;

class Ingredient : MenuComponent {

	protected: float _amount;

	protected: Ingredient( float amount = 1.0f ) :
		_amount( amount ) { assert( amount > 0.0f );
	}
	public: virtual ~Ingredient() = 0 {
	}
	public: virtual void add( MenuComponent* menuComponent ) {
	}
	public: virtual void accept( Visitor* visitor ) = 0;
	public: virtual bool isVegetarian() const = 0;
	public: virtual float getCalories() const = 0;
	public: virtual float getCarbs() const = 0;
	public: virtual float getCholesterol() const = 0;
	public: virtual float getFat() const = 0;
	public: virtual float getProtien() const = 0;
	public: virtual float getSodium() const = 0;
	public: virtual float getHealthRating() const {
		float result = 0.0f;

		result += getCalories() / dailyCalories;
		result += getCarbs() / dailyCarbs;
		result += getCholesterol() / dailyCholesterol;
		result += getProtien() / dailyProtien;
		result += getSodium() / dailySodium;

		return _amount * ( result * 100.0f );
	}
	public: virtual std::string toString() const = 0;
};

} // namespace Menus
} // namespace Vistor
} // namespace HeadFirstDesignPatterns

#endif

What bugs me are the static const float declarations. First, even though they are in the class header file, they are not part of the class declaration. My first serious introduction to programming was VB.NET and C# and I am still confused with things being declared outside of classes. How is their scope defined? And what does the keyword static mean in this place?

Thanks.

Link to comment
https://www.neowin.net/forum/topic/651152-c-a-meaning-of-static/
Share on other sites

10 answers to this question

Recommended Posts

  • 0

A static variable is a variable that holds its value until the end of execution. For example, if you have a static variable inside a function, even when the function ends, that variable will still hold its value.

A static property is a property that is shared among all objects. I will give you an example to clarify the image.

Lets say that you have a class called MyClass and you want to count how many objects have been inistantiated. If you had a property that is not declared as static, on each object creation that property will lose its data and it will be 1 among all objects. However, if it was static, it would increase on each object creation (Given that you're increazing the property in the constructor).

Hopefully I was able to help you out. I don't remember C++ syntax (long, long time since I coded with C++).

EDIT: I forgot to mention that you refer to the static property by Class name, and not by the object itself, remember, it's shared among all objects.

  • 0
Thanks, I get what static means inside classes. What I have difficulty understanding is what it does outside of classes like in this case. And also how the scope of variables or functions declared outside of classes is determined.

It's essentially a global, but it is differentiated by the namespace so you could have 2 or more dailyCalories defined within the project and the names won't collide.

#include "Ingredient.h"
#include <iostream>

using namespace std;

static const float dailyCalories = 1800.0f;
int main(void){
	cout << HeadFirstDesignPatterns::Visitor::Menus::dailyCalories << '\n'; // outputs 2000
	cout << "Global ::" << ::dailyCalories << endl; // outputs 1800
}

  • 0
If it's global that means everyone has read/write access to it, as long as the file in which is declared is #included? Also, what difference does it make that this global is declared static?

1. Yes if it isn't declared const.

2. It's only allocated once when the file is loaded and deallocated when the file is unloaded

  • 0
2. It's only allocated once when the file is loaded and deallocated when the file is unloaded
This is what I don't get: if a variable is global, then how can it ever be allocated more than once? If by being global it can only be allocated once, what is the purpose of writing static? Also, what do you mean that "the file is unloaded"?
  • 0
Objects do not have static data, since static data is class level.

that is why you cannot do the following

public static int x;

object.x

You call static data by the class

Thats what he means when its allocated once, since objects cannot hold that data.

Sorry but we were talking about global variables, look at the static variables in the example, they are declared outside of a class. What does static mean in this case?
  • 0
This is what I don't get: if a variable is global, then how can it ever be allocated more than once? If by being global it can only be allocated once, what is the purpose of writing static? Also, what do you mean that "the file is unloaded"?

There is more than one concept happening here; scope and linkage, which is the source of much confusion for not only you. :)

This may help:

http://publib.boulder.ibm.com/infocenter/c...ref/cplr020.htm

  • 0
There is more than one concept happening here; scope and linkage, which is the source of much confusion for not only you. :)

This may help:

http://publib.boulder.ibm.com/infocenter/c...ref/cplr020.htm

Not another set of obscure complex C++ rules!!! When is this going to end!!! Arrrrghlg.. *boom

On a more grateful note, thanks, this goes on my to-read list. :laugh:

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • BS, I've yet to run into a typical pc user that uses it at all, let alone half the population.
    • Codec Tweak Tool 6.7.7 by Razvan Serea This tool is a Swiss army knife for managing codecs and codec settings. Codec Tweak Tool will scan for broken filters and remove them. If the tool detects something that is broken, it will then prompt you with the details and you will be given the option to remove the broken item. Generate a detailed log of all installed codecs and filters, enable/disable more than 250 popular codecs and filters (if they are installed), manage preferred source filters, and reset settings. With this tool you can do things like: Scan the registry to detect and remove broken references to codecs and filters. Enable/disable more than 200 popular codecs and filters (if they are installed). Manage preferred source filters (a.k.a. splitters). Detect broken codecs and DirectShow filters. Fix problems with the standard DirectShow filters of Windows. A fix for a specific sound problem. Generate a text file with detailed information about all installed codecs and DirectShow filters, along with other relevant system information. Reset settings to recommended values for many popular codecs and DirectShow filters. Configure audio output settings for several popular audio decoders. Several configuration options for a few DirectShow filters that don't have an easily accessible interface for those options. Easy access to the configuration interfaces of various codecs and DirectShow filters Backup the settings of several codecs and DirectShow filters. Replace your current settings with those from a previous backup. Manage DirectShow filters - Enable or disable DirectShow filters. Manage ACM/VFW codecs - Enable or disable ACM/VFW codecs. Enable or disable DirectX Media Objects. Configure your preferred DirectShow source filters (a.k.a. splitters) for several common file extensions. Enable or disable the generation of thumbnails for several common video file formats in Windows Explorer. Download: Codec Tweak Tool 6.7.7 | 1.5 MB (Freeware) View: Codec Tweak Tool Website | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • The site is pretty sparse on features / tech specs. Can I plug it into a PC/hone/Switch via USB-C and use it as an external display? If so, what's the virtual resolution of the screen, the refresh rate, PPI of the image etc? Is the text crisp enough to use for coding at say 12pt? Is it good enough for playing dark games, like say Path of Exile 2? How about fast games like car racing games? Just how do they expect anyone to order this thing without giving out all this info?
  • Recent Achievements

    • One Month Later
      Vincian earned a badge
      One Month Later
    • First Post
      Jocimo earned a badge
      First Post
    • Week One Done
      suprememobiles48 earned a badge
      Week One Done
    • One Month Later
      Windows Guy earned a badge
      One Month Later
    • One Month Later
      Prasann earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      547
    2. 2
      +Edouard
      163
    3. 3
      PsYcHoKiLLa
      86
    4. 4
      neufuse
      65
    5. 5
      Steven P.
      65
  • Tell a friend

    Love Neowin? Tell a friend!