• 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

    • Vivaldi 8.0.4033.48 by Razvan Serea Vivaldi is a cross-platform web browser built for – and with – the web. A browser based on the Blink engine (same in Chrome and Chromium) that is fast, but also a browser that is rich in functionality, highly flexible and puts the user first. A browser that is made for you. Vivaldi is produced with love by a founding team of browser pioneers, including former CEO Jon Stephenson von Tetzchner, who co-founded and led Opera Software. Vivaldi’s interface is very customizable. Vivaldi combines simplicity and fashion to create a basic, highly customizable interface that provides everything a internet user could need. The browser allows users to customize the appearance of UI elements such as background color, overall theme, address bar and tab positioning, and start pages. Vivaldi features the ability to "stack" and "tile" tabs, annotate web pages, add notes to bookmarks and much more. Vivaldi 8.0.4033.48 changes: [Chromium] Update to 148.0.7778.267 ESR (includes security fixes from 149.0.7827.114/115) [Crash] When closing devtools with input caret in a CSS property field (VB-128998) [Linux][Media] Fetch an updated proprietary media support file (VB-129132) [Permissions] Global Permissions counter shows all permissions (64) as overridden (VB-127713) Download: Vivaldi 64-bit | 139.0 MB (Freeware) Download: Vivaldi 32-bit | ARM64 View: Vivaldi Home Page | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Two variants of the KAMRUI H2 mini PC receive deeper discounts on Amazon by Steven Parker KAMRUI (sister company of AceMagic) reached out to us, letting us know that they are applying further discounts to two of their H2 mini PC variants, and in times like these, every little helps. First off, it's the Core i5 14450HX 32GB+1TB variant, which already received a discount from $699 to $567.99 on Amazon, so you may be asking what you get for that. Its most important features are listed below. 32GB Memory Configuration, Exceptional Value. Driven by rising AI demand, the DDR memory supply is tightening, making high-capacity memory more valuable. KAMRUI maintains high-quality standards while offering strong value with a 32GB RAM + 1TB SSD configuration, which delivers excellent performance and storage. Intel i5-14450HX, HX-Class Performance Powered by the Intel Core i5-14450HX (10 cores/16 threads, up to 4.8GHz, 54W TDP)-HX series delivers desktop-class performance. Enjoy up to 120% higher multi-core performance vs. i7-1185G7 and stronger sustained performance than Ryzen 9 6900HX under heavy workloads. With 14450HX performance, it handles coding, compiling, Docker with ease, runs 10+ apps simultaneously—Excel, Chrome, Zoom, video editing—with smooth multitasking and fast load times. 32GB RAM & 1TB NVMe SSD - expandable up to 4TB Mini pc W-11 Pro equipped with 32GB (16GB×2) DDR4 dual-channel memory and a 1TB NVMe PCIe 4.0×4 SSD, mini pc delivers fast system response and efficient data access for demanding workloads. Dual M.2 slots support storage expansion up to 4TB. Large memory support running multiple virtual machines simultaneously, enabling fast deployment and isolated sandbox testing, significantly improving development efficiency and multitasking performance. HX-Class Heat Dissipation, Higher Productivity 14450HX Mini computers W-11 pro equipped with upgraded silent centrifugal fans, dual copper heat pipes, dual fin-stack cooling modules, and an optimized dual-airflow design, the processor can maintain ≥95% of multi-core performance even under long-duration heavy workloads. The HX platform is specifically designed for multitasking, rendering, and content creation, and multitasking, delivering desktop-class stability and powerful performance. Triple 4K Productivity Power Supports triple 4K displays and handles complex workflows like coding, data processing, and multitasking with ease. WiFi 6 delivers fast, reliable connectivity for video, conferencing, and transfers. Bluetooth 5.2 ensures stable, low-latency wireless connections. Versatile Connectivity This mini computer comes with 1x Type-C(10Gbps data transfer), 1x RJ45 Ethernet, 2x USB3.2 Gen2 (10Gbps), 4x USB3.2 Gen1 Type-A (5Gbps), PD output, 1x HDMI 2.0, 1x DP 1.4, and 1x 3.5mm audio jack. It offers versatile connectivity to connect multiple devices effortlessly, reducing the need for frequent plugging and unplugging. Small Size, Big Performance Mini PC measures just 5.04 × 5.04 × 1.63 inches, over 80% smaller than a traditional desktop, yet equipped with the high-performance 14450HX processor for near-desktop-level power. With VESA mounting support, it transforms cluttered desks into clean, organized setups. Normally costing $699, but now down to $ 535.79, which includes an additional 6% off the Amazon listed price. That equals a total of 24% off the MSRP. KAMRUI Hyper H2 (Core i5 14450HX 32GB+1TB) for $ 535.79 (was $699) Use code 2UD2IW7D for the above price during checkout (expires on June 30) Editors note: This appears to be listed as a "frequently returned item" on Amazon, but you should take into account the reviews on the page that discuss a completely different PC, it would seem that this is yet another recycled sales page that is now listing this newer item, possibly to retain the positive 4.5 star rating on the page. Next up, we have the Core i9 14900HX/32GB+1TB variant, which normally costs $799.99 but is already discounted to $759.99 on Amazon. Again, the most important highlights for this variant are listed below. Upgrade 14th Intel Core i9-14900HX Processor KAMRUI Mini Computers features the 14th Gen Intel Core i9-14900HX processor (up to 5.8GHz, TDP 55W, 36MB cache, 24C/32T), delivering 25%–40% higher performance than the i5-14450HX (24C/32T) and i7-1280P in multitasking, creative work, and high-load applications. Manufactured using Intel 7 (10 nm) process technology, Mini Computer efficiently allocates workloads to deliver faster response times, smoother operation, and heightened productivity. 32GB DDR4 & 1TB SSD - Expandable to 4TB KAMRUI Intel Core i9-14900HX mini PC features dual-channel 32GB DDR memory (expandable to 64GB) and 1TB NVMe PCIe 4.0×4 SSD, delivering speeds 40% faster than PCIe Gen3. The KAMRUI Micro PC features two M.2 2280 SSD slots, each expandable up to 2TB, effortlessly accommodating a high-capacity system drive and an ultra-fast cache drive. This achieves a perfect balance of speed, capacity, and flexibility, effortlessly handling large projects and high-speed workflows. 4K UHD Triple Display KAMRUI 14900HX Mini PC features a 4K@60Hz UHD graphics card (Intel UHD Graphics), supporting 4K@60Hz high-definition video playback for a premium visual experience. Mini Gaming PC incorporates an HDMI 2.0 port + DP 1.4 port + USB3.2 Gen2 Type-C port, supporting 4K triple display output. Mini PC can connect to three monitors to fulfil your multi-screen collaboration requirements. Ultra-high-definition visuals and ultra-fast connectivity significantly enhance your productivity. RJ45 LAN Port+WiFi6E+BT5.2 KAMRUI Mini PC features a 1.0Gbps LAN port, suitable for high-speed broadband environments in homes, offices, and large enterprises. Bluetooth 5.2 enables connection to peripherals such as headphones, mice, and keyboards. Dual-band WiFi 6E and BT 5.2 deliver enhanced interference resistance and more stable wireless signals. Regardless of your network environment's complexity, the KAMRUI H2 mini computer delivers a relatively stable and smooth network experience. Professional-Grade Cooling System KAMRUI Mini gaming PC features an upgraded silent centrifugal fan, dual copper heat pipes, and a dual-fin module. Its all-copper structure enhances thermal conductivity, boosting airflow efficiency by 35% and overall heat dissipation by 40%, ensuring the CPU can stably deliver up to 55W performance under full load. Upgraded aluminum heatsink keeps the SSD cool to maintain read/write speeds, ensuring desktop-level stability and power for demanding workloads. Compact Size, Infinite Possibilities KAMRUI H2 mini computers measure just 5.04 x 5.04 x 1.63 inches, a fraction of the size of a traditional desktop, yet deliver powerful performance for demanding workloads. With the included VESA mount, you can easily attach a small pc behind a monitor or place it in your TV cabinet, turning your display into a sleek mini PC while saving valuable desk space. Versatile Connectivity This KAMRUI mini gaming computer comes with 1*USB3.2 Gen2 Type-C(up to 10Gbps data transfer), 1*RJ45 Ethernet, 2*USB3.2 Gen2 (10Gbps), 4*USB3.2 Gen1 Type-A (5Gbps), 1*HDMI 2.0, 1*DC, 1*DP 1.4, and 1*3.5mm audio jack. It offers versatile connectivity to connect multiple devices effortlessly, reducing the need for frequent plugging and unplugging. Normally costing $799, but now down to $721.99, which includes an additional 5% off the Amazon listed price. That equals a total of 10% off the MSRP. KAMRUI Hyper H2 (Core i9 14900HX/32GB+1TB) for $ 721.99 (was $799) Use code AQ5Z6A47 for the above price during checkout (expires on June 30) KAMRUI claims that they offer lifetime technical support along with a 12-month warranty. For either of these mini PCs, should you encounter any issues during use, KAMRUI claims it will do its utmost to assist customers. As an Amazon Associate, we earn from qualifying purchases.
    • Good. I hope more people sue them for focusing on this worthless junk.
    • How about fire the guy who approved all the bad decisions? The guy who bought these studios in the first place? Oh wait, Satya is safe with his billions while the workers pay the price.
  • Recent Achievements

    • One Year In
      Console General earned a badge
      One Year In
    • One Year In
      Twozo Technologies earned a badge
      One Year In
    • One Month Later
      Twozo Technologies earned a badge
      One Month Later
    • Week One Done
      Twozo Technologies earned a badge
      Week One Done
    • Veteran
      branfont went up a rank
      Veteran
  • Popular Contributors

    1. 1
      +primortal
      514
    2. 2
      +Edouard
      200
    3. 3
      PsYcHoKiLLa
      108
    4. 4
      Steven P.
      89
    5. 5
      Nick H.
      71
  • Tell a friend

    Love Neowin? Tell a friend!