C++静态成员函数和变量

news/2024/7/2 0:36:00

代码一:

[cpp]  view plain copy print ?
  1. class Point{  
  2. public:  
  3.     void output()  
  4.     {  
  5.     }  
  6.     static void init()  
  7.     {  
  8.     }  
  9. };  
  10. int main()  
  11. {  
  12.     Point pt;  
  13.     pt.init();  
  14.     pt.output();  
  15. }  
代码二:

[cpp]  view plain copy print ?
  1. class Point{  
  2. public:  
  3.     void output()  
  4.     {  
  5.     }  
  6.     static void init()  
  7.     {  
  8.     }  
  9. };  
  10. int main()  
  11. {  
  12.     Point::init();  
  13.     Point::output();//报错  
  14. }  

两个代码编译运行,代码一成功,代码二报错。错误信息:

test1.cpp(16) : errorC2352: “Point::output”: 非静态成员函数的非法调用。

错误信息提示:非法调用非静态成员函数Point::output。但为什么init函数的调用没有错呢?该函数是一个静态函数。静态成员函数和静态成员变量属于类本身,在类加载的时候,即为他们分配了空间,所以可以通过类名::函数名或类名:变量名来访问。而非静态成员函数和非静态成员变量属于对象的方法和数据,也就是应该首先产生类的对象,然后通过类的对象去引用。


代码三:

[cpp]  view plain copy print ?
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class Point{  
  5. public:  
  6.     void output()  
  7.     {  
  8.     }  
  9.     static void init()  
  10.     {  
  11.         x = 0;  
  12.         y = 0;  
  13.     }  
  14. private:  
  15.     int x,y;  
  16. };  
  17. int main()  
  18. {  
  19.     Point::init();  
  20.     //Point::output();//报错  
  21. }  
运行报错:

1>e:\学习\程序练习\test1\test1\test1.cpp(11): error C2597: 对非静态成员“Point::x”的非法引用

1>e:\学习\程序练习\test1\test1\test1.cpp(12): error C2597: 对非静态成员“Point::y”的非法引用

在静态成员函数中非法引用Point对象的x和y数据成员。因为init是静态函数,不属于某个具体的对象,也就是说在还没有产生Point类的任一个具体的对象时,该函数就已经存在于程序的代码区了。但是,Point类的数据成员x和y还没有分配内存空间,这样,在init函数中对他们进行赋值操作会失败。也就是说,在静态成员函数中不能调用非静态成员,包括非静态成员函数和非静态成员变量。静态成员函数只能访问静态成员变量。

如果把上述代码中对x、y的赋值操作放在非静态函数中,就会成功。

但是,在非静态成员函数中可以调用静态成员函数。


我们可以在上述代码中,将Point类的数据成员x和y的定义之前加上static限定符,使他们成为静态成员变量。

staticintx,y;

编译运行,程序报错。错误信息:

1>test1.obj: error LNK2001: 无法解析的外部符号"private:static int Point::y" (?y@Point@@0HA)

1>test1.obj: error LNK2001: 无法解析的外部符号"private:static int Point::x" (?x@Point@@0HA)

这是链接时发生的错误。出错的原因是对于静态成员变量,必须对他们进行初始化,并且应在类的定义之外进行此操作。我们在Point类的定义之外,加上如下两条初始化语句:

[cpp]  view plain copy print ?
  1. intPoint::x = 0;  
  2. intPoint::y = 0;  

则运行成功。


http://www.niftyadmin.cn/n/4487786.html

相关文章

有限元分析50年发展之路

计算机辅助工程&#xff08;CAE&#xff09;作为一门新兴的学科已经逐渐的走下神坛&#xff0c;成为了各大企业中设计新产品过程中不可缺少的一环。传统的CAE技术是指工程设计中的分析计算与分析仿真&#xff0c;具体包括工程数值分析、结构与过程优化设计、强度与寿命评估、运…

BestCoder Round #11 (Div. 2)

太菜&#xff0c;仅仅能去Div2.&#xff08;都做不完 ORZ。。。 各自是 HDU&#xff1a; 5054 Alice and Bob 5055 Bob and math problem 5056 Boring count 5057 Argestes and Sequence # 1001 碰面仅仅能在坐标中间。 所以推断一下就好了。 #include<cstdio> #includ…

通俗易懂:非线性与线性的区别是什么?

文章来源-公众号&#xff1a;有限元仿真分析 非线性是自然界复杂性的典型性质之一&#xff0c;那么你对非线性了解多少呢&#xff1f;以下可见一斑&#xff1a; 什么是非线性 非线性(non-linear)&#xff0c;即 变量之间的数学关系&#xff0c;不是直线而是曲线、曲面、或不确…

一个有N个整数元素的一维数组{A[0],A[1],....,A[N-1],A[N]},这个数组有很多连续的子数组,那么连续子数组之和的最大的一个的值是什么?...

1.动态规划的思想解决 /*** 在时间复杂度为O(N)内找出数组中最大的子序列的累加和*/public static int sumNum(int[] array) {int n array.length;int all array[n - 1], start array[n - 1];int count 0;for (int i n - 2; i > 0; i--) {if ((start array[i]) > a…

Abaqus-复合材料自行车架的研究

文章来源-公众号&#xff1a;有限元仿真分析 原文链接:https://mp.weixin.qq.com/s/JEeRPg5WCkxoVOk3eIn0wQ 荷兰人喜欢骑自行车有点轻描淡写&#xff0c; 1700万人却拥有2300 万英镑的自行车产业。更令人惊讶的是&#xff0c;一些荷兰人拥有山地自行车&#xff0c;尽管没有任…

【LSGDOJ 2015】数页码

题目描述 一本书的页码是从 1-n 编号的连续整数&#xff1a;1, 2, 3, ... , n。请你求出全部页码中所有单个数字的和&#xff0c;例如第 123 页&#xff0c;它的和就是 1236。输入 一行为 n(1 < n < 10^9)。 输出 一行&#xff0c;代表所有单个数字的和。 样例输入 34567…

如何选择一个合适的网格来进行网格收敛研究

文章来源-公众号、有限元仿真分析 原文链接&#xff1a;https://mp.weixin.qq.com/s/ZjAdsmtxxA2FEnXhTEWHDA 一、几何单元的类型 目前有四种不同的三维单元类型&#xff1a;四面体、六面体、棱柱&#xff0c;以及金字塔形&#xff1a;可以任意组合这四种单元来对任何三维模型…

IDEA打jar包,且通过pom引入使用

工具&#xff1a;IDEA 2017.1.2 maven&#xff1a;apache-maven-3.3.9 转载于:https://www.cnblogs.com/anpieBlog/p/7055195.html