相关文章推荐
苦闷的领带  ·  PHP错误解决: count(): ...·  1 年前    · 
鼻子大的柑橘  ·  Kotlin Vocabulary | ...·  1 年前    · 

static数据成员

  • static成员不属于对象,属于类,是所有对象共有的--->调用可以不需要对象(当然也可以用对象调用)

  • static成员依旧受权限限定 (public、protected、private)

  • 用static修饰的数据成员,必须在类外初始化

在类中直接初始化是错误的--->不能采用初始化参数列表方式初始化,和普通数据成员写法的区别

class MM
public:
	MM(string name=""):name(name),num(num){} 
protected:                   /*报错:num不是类MM的非静态数据成员或基类*/  
	string name;
	static int num=0;        //报错:带有类内初始值设定项的成员必须为常量

static成员在类外初始化不再需要static修饰,但是受权限限定,定义变量写在protected属性会报错

class MM
public:
	MM(string name=""):name(name){}
	static int num;
protected:
	string name;
//必须在类外初始化,此时不再需要static修饰,但是需要类名限定
int MM::num = 1;
int main()
//静态数据成员访问,可以不需要对象--->但是需要类名限定
	cout <<MM::num << endl;

 什么叫做共有?深刻认识共有的概念--->所有对象用的都是用一份

class MM
public:
	MM(string name = "") :name(name)
		num++;                  //对static成员++
	static int num;
protected:
	string name;
int MM::num = 1;
int main()
//理解什么叫做共有的
	MM mm("mm");                 //2
//静态数据成员通过对象的方式去访问
	cout << mm.num << endl;      //此时num==2
	MM array[3];			     //5
	MM* p = new MM("newMM");	 //6
	cout << MM::num << endl;
	cout << p->num << endl;
	cout << mm.num << endl;
	delete p;
	p = nullptr;
/*输出*/

static成员函数

  • static写在函数前面即可

  • 调用非静态数据成员 必须要指定对象

  • 没有static构造函数

  • 可以在类中声明,在类外实现/在类中实现,不需要static修饰词,需要类名限定      

怎么调用非静态数据成员--->必须指定对象

静态函数调用静态数据没有要求

class MM
public:
	MM(string name=""):name(name) 
		num++;
	static void printMM();
	static void printData(MM& mm)    //调用非静态成员--->指定一个对象进来,就可以调用了
	    cout << mm.name <<" "<<num <<endl;//静态数据可以用对象指定,也可以不用对象指定
protected:
	string name;
public:
	static int num;
int MM::num = 1;
void MM::printMM() 
	/*报错:调用非静态数据成员,必须要指定对象--->否则不知道这个属性属于哪个对象,传 
      对象或者定义对象的方式,printMM()这个函数不采用对象去调用,name就没有来源*/
	cout << name << endl;  
    //静态函数调用静态数据没什么要求
	cout << num << endl;
	cout << "静态成员函数" << endl;
int main() 
//调用静态成员函数--->不需要对象
	MM::printMM();
//调用静态成员函数--->通过创建一个对象的方式调用
    MM mm("mm");
	mm.printMM();
//调用静态成员函数--->通过传参的方式(传入对象的参数)调用
	MM::printData(mm);
	return 0;
/*输出*/
静态成员函数
静态成员函数
mm   2    

static对象

生命周期到程序关闭--->最后释放

相关内容可以看看这篇博客:c++构造、析构顺序问题_考拉爱睡觉鸭~的博客-CSDN博客

小知识:~static成员不属于对象,属于类---&gt;所有对象共有---&gt;调用可以不需要对象(当然也可以用对象调用)~static成员依旧受权限限定 (public、protected)static数据成员 ·类中初始化是错误的---&gt;不能采用初始化参数列表方式初始化 ---&gt;注意和普通数据写法的区别class Student{public: Student(string name=""):name(name),num(num){} /*报错:num不是类
【问题1】C++类中的数据成员能否在定义类的时候就初始化?(注:在最新的C++11标准中已经支持在定义类的时候进行成员初始化。但初始化不是在编译时发生,这只是语法糖,而成员变量是在默认构造函数中初始化的) 如前所述,它是语法糖。但由于规则可能太难记住,通过一个逻辑实验来验证: struct foo { int size = 3; }; template<int N> struct experiment { enum { val = N }; }; 假设初始化发生在编译时,然
综合而言,C++中类的初始化操作有四个部分组成:1.初始化列表:所有类静态数据成员都可以在这里初始化, 所有类静态数据成员都不能在这里初始化 2.构造函数体:对于类静态数据成员: const型成员不能在这里初始化 引用型成员不能在这里初始化 没有默认构造函数的成员不能在这里初始化 对于类静态数据成员
文章目录一、初步认识面向过程和面向对象二、类的引入C 和 C++ 中「 struct 」的区别三、类的定义四、类的访问限定符及封装4.1 类的访问限定符4.2 类的封装五、类的作用域六、类的实例化6.1 类成员的声明与定义(要搞清楚)七、类对象模型7.1 类对象的存储方式7.2 计算类对象的大小7.3 结构体内存对齐规则八、this 指针8.1 this 的引出8.2 this 指针的特性 一、初步认识面向过程和面向对象 面向对象:OO, Object - Oriented 面向过程:PO, Procedu
1、神奇的inline语法与语义 inline语义C99和C++98都有。之前在单源文件编写的时候一直没有发现问题,但是一考虑到多文件的链接,就发现矛盾了。 一些inline的原则: 1. inline 只是建议,不是写了 inline 编译器就一定会内联该函数。内联失败的原因有很多,识别方法也有不少,这里就不一一阐述。 2. 标准以及目标文件的本质就决定了真正的内联函数是不存在外部链接 exte...
在C语言中,static有多种用途: 1. 在函数内部使用static修饰局部变量,可以使变量的生命周期延长到整个程序运行期间,并且只能在定义该变量的函数内部访问。这对于需要保持变量的值在函数调用之间保持不变的情况常有用。 2. 在全局变量前使用static修饰,可以将变量的作用域限制在定义该变量的文件内部,避免与其他文件中同名的全局变量产生冲突。 3. 在函数的声明前使用static修饰,可以将函数的作用域限制在定义该函数的文件内部,使得该函数对其他文件不可见。 4. 在结构体或联合体成员前使用static修饰,可以使该成员成为静态成员,不与结构体或联合体的具体实例相关,可以通过结构体或联合体类型直接访问。 5. 在函数内部使用static修饰函数的局部变量,使得该函数只能在定义该函数的文件内部调用。