c++类的 static 和const那些事

1.static成员变量(非const)必须在类外定义,在类中只是作为声明(声明其scope为该类),不能使用类初始化成员列表来初始化,只能在定义的时候初始化。

2.static const的成员变量必须在类中定义的时候就初始化,不能在类外再定义,不能使用类初始化成员列表初始化。

3.static 与 virtual不能共存于一个函数上,即没有静态虚函数,原因在于静态函数没有this指针,无法通过对象实例来调用,而虚函数与普通成员函数一样必须通过this指针来调用。但是static成员可以通过类实例或类来调用,即A a; a.b或A::b都可。

4.非static的const成员,和引用类型的成员,因为在定义的时候就必须初始化,所以必须使用类初始化成员列表来初始化。

5.在一个函数的最后加上const,则这个函数只能是一个成员函数,而且是非静态的。因为const的函数就隐含着“this指针所指的对象不能被修改”这个意思。同时,const函数不能对任何成员函数做赋值等修改的动作,而且如果一个实例是const实例,这个实例只能调用const函数。

6.static成员在编译的时候就已经确定了(未显式初始化的则为0)。而普通成员则在创建实例的时候初始化。

故一个类对象里面的成员的初始化顺序:

程序加载时确定:

a.静态成员变量的空间及值。

b.成员函数的空间及地址。

创建对象时(运行时)确定:

c.虚函数表(如果该类或该类的任一个基类,超类有虚函数)

e.普通成员变量的空间及值。

#include<iostream>
using namespace std;

class A
{
public:
    int a;
    static int b;
    const int c;
    static const int d = 4;
public:
    A(int i,int j):c(i),a(j){}
    void print(){}
};

int A::b;//这个值默认为0,因为static成员放在全局静态区。

int main()
{
    A a(1,2);
    cout<<a.a<<endl;
    cout<<a.b<<endl;
    cout<<a.c<<endl;
    cout<<a.d<<endl;
}
时间: 2024-10-17 09:42:00

c++类的 static 和const那些事的相关文章

C++ Primer 学习笔记_25_类与数据抽象(11)--const 用法小结、static与const以及static const(const static)

一.const 用法总结 1.可以对const 的用法做个小总结: const int n = 100;  //定义常量 const Test t(10); const int & ref = n;   //const引用 int& ref = n;  //Error [const与指针] const int* p; //const出现在*前面,表示*p是常量 (*p = 200; //Error) int * const p2;  //const出现在*后面,表示p2是常量 (p2 =

C++类中的static和const

本文列举C++类中的static和const的规则和用法. 以下代码用来举例说明. class A { public: A():m(10) //const成员必须在构造函数的初始化构造列表中初始化 { q = 40; } void fun1()const { m++; //错误.const成员是常量,不能改变其值. n++; //正确.static变量n属于类,但是每个对象的函数都可以访问和改变它. q++; //错误.const成员函数不能改变数据成员的值. } static void fun

PHP 面向对象中常见关键字使用(final、static、const和instanceof)

PHP 面向对象中常见关键字的使用: 00x1.Final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用final标识的成员方法,在子类中不能覆盖. 总结:final表示为最终的意思,所以使用final关键字的类或者类中的成员方法是不能被更改的. 00x2.Static :static关键字将类中的成员属性或者成员方法标识为静态的,static标识的成员属性属于整个类,static成员总是唯一存在的,

static和extern使用 /static和const联合使用

static: 1.修饰局部变量,被static修饰局部变量,延长生命周期,跟整个应用程序有关 * 被static修饰局部变量,只会分配一次内存 * 被static修饰局部变量什么分配内存? 程序一运行就会给static修饰变量分配内存 2.修饰全局变量,被static修饰全局变量,作用域会修改,只能在当前文件下使用 extern:声明外部全局变量,注意:extern只能用于声明,不能用于定义 extern工作原理:先会去当前文件下查找有没有对应全局变量,如果没有,才回去其他文件查找 exter

如何初始化类的static成员变量?

类的static成员变量不被某一个对象所独有,而是被所有同类型的对象所共有. 只能在头文件中声明类的static成员变量,不可在头文件中初始化,否则会造成重定义.必须在另外一个.cpp文件中进行初始化.并且,初始化的时候不可以有static修饰词. [email protected]:~/project/test/static-test/static2_cpp$ cat static.h #ifndef STATIC_H #define STATIC_H #include<iostream>

关键字static和const的作用

一.在C语言中,关键字static的作用: (1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: (2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问: (3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内:(4)在类中的static成员变量意味着它为该类的所有实例所共享,也

(转 )C++ static、const和static const 以及它们的初始化

const定义的常量在函数执行之后其空间会被释放,而static定义的静态常量在函数执行后不会被释放其空间.但不论是Const还是static  他们定义的内容都会随着程序的结束而被系统清楚. static 表示的是静态的.类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量.一般的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中. 在c++中,static静态成员变量不能在类内部初始化. 在c++中,const常

static和const关键字

static关键字至少有下列n个作用:   (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值:   (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问:   (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内:   (4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝:   (5)在类中的stat

c++ static及const(开发者在线)

static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一.控制存储方式: static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间. 1.引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用