bosthhe1 / cpushpush

0 stars 0 forks source link

对于函数成员声明的一些小补充(static) #11

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago
    对于函数成员声明的一些小补充

当我们写成这样的时候,编译器也不会报错,难道我们这里就是成员变量的声明加成员变量的初始化吗? 答案是错,我们必须遵守原则再成员函数在类中只能存在声明,不能定义,那么我们这里其实是相当于产生了一个默认参数,我们不对参数进行传参初始化,这个参数就会调用这个默认参数进行初始化,所以这里实际上还是成员变量的声明 image

Originally posted by @bosthhe1 in https://github.com/bosthhe1/cpushpush/issues/5#issuecomment-1333067814

bosthhe1 commented 1 year ago

static 修饰的成员变量和函数一样不属于类里面的成员变量,只是用类把它限制住,要想访问static的成员变量,就必须在类中找到 image 我们可以看到只传一个参数也不会报错,而且初始化列表里面也没有static成员变量,a1的大小也为4,所以我们可以知道static修饰的成员变量不在类的成员变量中 我们知道static的成员变量是定义出来是需要初始化的,且只能初始化一次 不可以像一般的成员变量给一个默认值,因为只能初始化一次,默认值是有新的参数传进来,默认值就失效了 image 对于static的成员变量我们只能在类的外面定义,只需要声明类域就行 image

bosthhe1 commented 1 year ago

那么static修饰的成员变量有什么用呢? static修饰的成员变量属于类域的所有对象函数,所以对象函数对static的访问都是对一个static的访问,改变这个static,全部对象函数里面的static的成员变量都会改变,这里我们就可以计算前面的一道题,一共调用了多少次拷贝构造 L)_R F(MGE3DQDWAAG`IH_D 因为上图的static是私有的,所以我们不能直接访问,但是类的成员函数又可以直接访问,所以需要调用函数来获取成员变量的值 下图的static改成了共有的,那么我们可以像调用成员函数一样,调用static修饰的成员变量 以下将static改变成共有,所有成员对象都可以访问,且访问的都是一个成员变量 U43H5T46NZ6WN6ZQTI5E @5

bosthhe1 commented 1 year ago

static修饰的函数,是用来初始化static变量的,可以指定函数的域,直接初始化static的私有成员变量,且static函数不能调用类成员变量 image

bosthhe1 commented 1 year ago

我们需要区别const和static,const和static在创建出来的时候,都需要初始化,但是const和static初始化的方式却大不相同,我们先看到static不能用初始化列表初始化,但是const可以,因为static在全局只能初始化一次,是静态的,不存在私有变量中,但是const不同,虽然const只能初始化一次,但是对于同一个实例化,对于同类的不同实例化,会创建出不同的const,这些const互不干扰 9 OER7@_SDDG}F1D(VG 1GD 以下是正确的初始化,static的变量也可以用static的函数初始化 ZMW5S`X70}%OR4L(V(R}@8F