• 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

    • MVS subscribers got the proper 26200.8655 Win11 25H2 ISO downloads as of 6/16/2026 avoiding this whole MCT fiasco by MS. I'll obtain the official 8655 MVS ISO download instead.
    • too bad the "backend" June 2026 ESD files are still at build 26200.8653 and not at the correct build 26200.8655 release. I'll avoid using the MCT for several weeks until late July 2026
    • Qualcomm's new Snapdragon Reality Elite chip brings on-device AI to Android XR devices by Pradeep Viswanathan Qualcomm has been delivering dedicated SoCs for mixed reality and spatial computing devices for several years. The journey started with the Snapdragon XR1, followed by the Snapdragon XR2 in 2019, the Snapdragon XR2 Gen 2 in September 2023, and finally the Snapdragon XR2+ Gen 2 in 2024. Today, Qualcomm announced a major upgrade with the new Snapdragon Reality Elite Platform, which targets premium mixed reality and spatial computing devices. OEMs can use this SoC to power both all-in-one video-see-through headsets and lightweight, tethered optical-see-through glasses. Qualcomm highlighted that the Snapdragon Reality Elite will power the next wave of Android XR devices coming later this year. These wearables will offer better visuals, improved power efficiency, and deeper on-device AI integration compared to the previous generation. The Snapdragon Reality Elite can deliver up to 48 TOPS of AI performance, allowing large language models and large vision models to run directly on the device for the first time. In addition to enabling new spatial AI experiences, these new AI capabilities will improve head and hand tracking, as well as see-through features. On the performance side, the Snapdragon Reality Elite offers up to 60% higher GPU performance, up to 30% higher CPU performance, and up to 160% higher NPU performance compared to the previous generation. The platform supports visuals of up to 4.4K per eye at 90 frames per second for sharper images and smoother motion. Qualcomm is also claiming significant efficiency improvements. The Snapdragon Reality Elite can offer up to 20% longer battery life under the same workload. More importantly, the chipset can run up to 12 degrees Celsius cooler under load, making headsets more comfortable for users to wear for longer periods. The platform also includes improvements to video see-through, featuring lower latency and better image quality. Qualcomm states that its EVA hardware block helps accelerate demanding computer vision workloads, improving how digital content blends with the real world.
    • Umm... GitHub continues to use AWS. That's the story, that's the headline. There's no "new" news here. GitHub continues to require additional capacity beyond the originally-planned Azure allocations. There's nothing special about this; nothing noteworthy. They're still using AWS' infra until the cutover is complete.
    • Hello, Also known for https://www.theguardian.com/technology/2009/jan/29/adware-internet.   Regards, Aryeh Goretsky    
  • Recent Achievements

    • Collaborator
      vjlex earned a badge
      Collaborator
    • Reacting Well
      Dys Topia earned a badge
      Reacting Well
    • Conversation Starter
      NovaEdgeX earned a badge
      Conversation Starter
    • One Year In
      Console General earned a badge
      One Year In
    • Week One Done
      Twozo Technologies earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      516
    2. 2
      +Edouard
      182
    3. 3
      PsYcHoKiLLa
      106
    4. 4
      Steven P.
      88
    5. 5
      ATLien_0
      68
  • Tell a friend

    Love Neowin? Tell a friend!