C++类的一个重要成员:静态成员(二)——静态成员的定义
写在前面
【目录】
1 #include <iostream> 2 3 class student 4 { 5 public : 6 const static int grade = 100; 7 static int score; 8 static int number; 9 static void print_welcome(); 10 int phone; 11 12 private : 13 int age = 999; 14 15 }; 16 17 int student::score = 111; 18 int student::number = 222; 19 20 void student::print_welcome() 21 { 22 std::cout<<"welcome welcome!!"<<std::endl; 23 std::cout<<"grade:"<<grade<<std::endl; 24 //std::cout<<"age:"<<student::age<<std::endl; 25 std::cout<<"score:"<<score<<std::endl; 26 std::cout<<"score:"<<student::score<<std::endl; 27 28 } 29 30 //main app 31 int main() 32 { 33 student stu; 34 35 std::cout<<"classObject stu size:"<<sizeof stu<<std::endl; 36 37 std::cout<<"class student grade:"<<student::grade<<std::endl; 38 std::cout<<"class student score:"<<student::score<<std::endl; 39 std::cout<<"class student number:"<<student::number<<std::endl; 40 std::cout<<"classObject stu phone:"<<stu.phone<<std::endl; 41 42 student::print_welcome(); 43 }
一些思考:
(1)上图第6行,如果去掉const,这份代码能编译通过吗?
(2)对于上图的第10行代码,在程序40行输出该值,该值是多少呢?
(3)上图25、26行代码,输出值一样吗?
(4)上图如果取消24行的注释,这份代码能编译通过吗?
(5)上图35行代码的输出值是多少呢?
(1)对于静态成员函数:
和其他成员函数一样,既可以在类的内部也可以在类的外部定义静态成员函数。(注意:当在类的外部定义静态成员时,不能重复static关键字,该关键字只能出现在类内部的声明语句中)。
如何定义静态成员函数:
1 void student::print_welcome() 2 { 3 std::cout<<"welcome welcome!!";
4
}
(2)对于静态数据成员:
因为静态数据成员不属于类的任何一个对象,所以它们不是在创建类的对象时被定义。故静态数据成员不是由构造函数初始化的。(注意:一般来说,不能在类的内部初始化静态成员,必须在类的外部定义和初始化每个静态成员,一个静态数据成员只能被定义一次)。
静态数据成员的生命周期:
与全局变量类似,静态数据成员定义在任何函数之外。因此一旦被定义,将一直存在于程序的整个生命周期中。
如何定义并初始化一个静态成员:
1 int student::score = 111;
通常情况下,类的静态成员不应该在类的内部初始化。但是,可以为静态成员提供const整数类型的类内初始值,不过需要静态成员变量必须是字面值常量类型的constexpr。例如如下代码:
1 const static int grade = 100;
关于本文:本文所有知识点来源于《C++ Primer 第五版》