คำหลักstatic
น่าเสียดายที่มีความหมายที่ไม่เกี่ยวข้องแตกต่างกันเล็กน้อยใน C ++
เมื่อใช้สำหรับสมาชิกข้อมูลหมายความว่ามีการจัดสรรข้อมูลในคลาสและไม่ได้อยู่ในอินสแตนซ์
เมื่อใช้สำหรับข้อมูลภายในฟังก์ชั่นก็หมายความว่าข้อมูลได้รับการจัดสรรแบบคงที่เริ่มต้นครั้งแรกที่บล็อกจะถูกป้อนและคงอยู่จนกว่าโปรแกรมจะหยุดทำงาน นอกจากนี้ตัวแปรยังสามารถมองเห็นได้เฉพาะภายในฟังก์ชั่น คุณลักษณะพิเศษของสถิตยศาสตร์ท้องถิ่นมักใช้เพื่อสร้างรูปแบบสันหลังยาว
เมื่อนำมาใช้ในระดับที่รวบรวมหน่วย (โมดูล) ก็หมายความว่าตัวแปรเป็นเหมือนทั่วโลก (จัดสรร ie และเริ่มต้นก่อนที่จะmain
มีการเรียกใช้และทำลายหลังจากmain
ออก) แต่ที่ตัวแปรจะไม่สามารถเข้าถึงหรือมองเห็นได้ในหน่วยสะสมอื่น ๆ
ฉันได้เพิ่มการเน้นในส่วนที่สำคัญที่สุดสำหรับการใช้งานแต่ละครั้ง ใช้ (3) ค่อนข้างท้อใจในความโปรดปรานของ namespaces ที่ไม่มีชื่อที่ยังช่วยให้การประกาศคลาสยกเลิกการส่งออก
ในรหัสของคุณstatic
คำหลักจะใช้กับความหมายหมายเลข 2 และไม่เกี่ยวข้องกับคลาสหรืออินสแตนซ์ ... มันเป็นตัวแปรของฟังก์ชันและจะมีเพียงหนึ่งสำเนาเท่านั้น
อย่างที่iammilindพูดอย่างถูกต้องอย่างไรก็ตามอาจมีหลายอินสแตนซ์ของตัวแปรนั้นถ้าฟังก์ชันนั้นเป็นฟังก์ชันเท็มเพลต (เพราะในกรณีนั้นฟังก์ชั่นนั้นสามารถนำเสนอได้ในหลาย ๆ สำเนาในโปรแกรม) แม้ในกรณีของคลาสหลักสูตรและอินสแตนซ์นั้นไม่เกี่ยวข้อง ... ดูตัวอย่างต่อไปนี้:
#include <stdio.h>
template<int num>
void bar()
{
static int baz;
printf("bar<%i>::baz = %i\n", num, baz++);
}
int main()
{
bar<1>(); // Output will be 0
bar<2>(); // Output will be 0
bar<3>(); // Output will be 0
bar<1>(); // Output will be 1
bar<2>(); // Output will be 1
bar<3>(); // Output will be 1
bar<1>(); // Output will be 2
bar<2>(); // Output will be 2
bar<3>(); // Output will be 2
return 0;
}
static int i
เฉพาะเจาะจงเช่นนั้นo1.foo(); // i = 1
และ$o2.foo(); // i = 1
... ?