`
yfy_cpp
  • 浏览: 12897 次
  • 来自: 南昌
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++ 类的静态成员详细讲解(转)

阅读更多
原文地址:http://blog.csdn.net/morewindows/article/details/6721430

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。



在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。希望阅读本文可以使读者对类的静态成员变量和成员函数有更为深刻的认识。



第一个例子,通过类名调用静态成员函数和非静态成员函数
class Point
{
public:	
	void init()
	{  
	}
	static void output()
	{
	}
};
void main()
{
	Point::init();
	Point::output();
}


编译出错:error C2352: 'Point::init' : illegal call of non-static member function

结论1:不能通过类名来调用类的非静态成员函数。

第二个例子,通过类的对象调用静态成员函数和非静态成员函数

将上例的main()改为:

void main()
{
	Point pt;
	pt.init();
	pt.output();
}


编译通过。

结论2:类的对象可以使用静态成员函数和非静态成员函数。

第三个例子,在类的静态成员函数中使用类的非静态成员

#include <stdio.h>
class Point
{
public:	
	void init()
	{  
	}
	static void output()
	{
		printf("%d\n", m_x);
	}
private:
	int m_x;
};
void main()
{
	Point pt;
	pt.output();
}


编译出错:error C2597: illegal reference to data member 'Point::m_x' in a static member function

因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。

结论3:静态成员函数中不能引用非静态成员。

第四个例子,在类的非静态成员函数中使用类的静态成员

class Point
{
public:	
	void init()
	{  
		output();
	}
	static void output()
	{
	}
};
void main()
{
	Point pt;
	pt.output();
}


编译通过。

结论4:类的非静态成员函数可以调用用静态成员函数,但反之不能。

第五个例子,使用类的静态成员变量

#include <stdio.h>
class Point
{
public:	
	Point()
	{  
		m_nPointCount++;
	}
	~Point()
	{
		m_nPointCount--;
	}
	static void output()
	{
		printf("%d\n", m_nPointCount);
	}
private:
	static int m_nPointCount;
};
void main()
{
	Point pt;
	pt.output();
}

按Ctrl+F7编译无错误,按F7生成EXE程序时报链接错误

error LNK2001: unresolved external symbol "private: static int Point::m_nPointCount" (?m_nPointCount@Point@@0HA)

这是因为类的静态成员变量在使用前必须先初始化。

在main()函数前加上int Point::m_nPointCount = 0;

再编译链接无错误,运行程序将输出1。

结论5:类的静态成员变量必须先初始化再使用。



结合上面的五个例子,对类的静态成员变量和成员函数作个总结:

一。静态成员函数中不能调用非静态成员。

二。非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。

三。静态成员变量使用前必须先初始化(如int MyClass::m_nNumber = 0;),否则会在linker时出错。
分享到:
评论

相关推荐

    C++类的静态成员初始化详细讲解

    在C++编程语言中,类的静态成员是一个特殊类型的成员,它属于整个类,而不是类的每个实例。静态成员在内存中只有一份拷贝,所有类的对象共享这个拷贝。这里我们将深入探讨静态成员的初始化,特别是针对整型和枚举型...

    c++基础例题及详细讲解

    C++基础例题及详细讲解 本资源总结了C++基础...本资源总结了C++基础知识中的类和对象部分,涵盖了静态对象的构造、对象指针的使用、类数据成员指针的使用、类的设计等多个知识点,为学习C++提供了详细的知识点讲解。

    实现易语言类静态数据成员的方法

    在C++或Java等其他面向对象的语言中,我们通常使用`static`关键字来声明静态成员,而在易语言中,也有类似的方式。 在易语言中,声明静态数据成员的语法如下: ```易语言 .静态变量名 类型 ``` 例如,如果我们要...

    吕鑫:【C++语法与数据结构第06天】【第3堂课】静态成员变量与静态成员函数(面试题)

    1、讲解static静态局部变量的原理与特点; 2、讲解static静态全局变量的原理与特点; 3、讲解static静态成员变量的原理与特点; 4、讲解static静态成员函数的原理与特点;

    实验4 含有类的静态成员与类的友元的C++程序设计.docx

    本实验主要讲解了C++程序设计中的静态成员和友元关系概念。通过实验,我们可以更好地理解类的静态成员解决共享问题的机制,掌握类的静态数据成员与静态函数成员的实现方法,并学习多文件结构在C++程序中的使用。 一...

    c++类的讲解

    类与对象 友元 从面向过程到面向对象 静态成员 构造函数和析构函数 结构 引用与复制构造函数 名字空间域和类域 运算符的重载 面向对象的程序设计和Windows编程

    第4次(静态成员).rar

    在“第4次(静态成员).rar”这个压缩包中,可能包含了关于C++静态成员的详细讲解和示例。下面将深入探讨这一主题。 静态成员分为静态数据成员和静态成员函数。 1. 静态数据成员: - **存储位置**:静态数据成员...

    关于C++静态数据成员的实现讲解

    "关于C++静态数据成员的实现讲解" C++静态数据成员是指在一个类中用关键字static声明的数据成员。它们可以被所有类对象共享,并且可以在类体外进行初始化和使用。下面是关于C++静态数据成员的一些重要知识点: ...

    C语言调用C++类中的方法

    要注意的是,这种方法只适用于C++类的静态成员函数,因为非静态成员函数有隐含的`this`指针,这是C语言不具备的。若要调用非静态成员函数,需要在C++端创建一个全局对象或者传递一个对象实例到C语言接口。 此外,还...

    C++利用静态成员或类模板构建链表的方法讲解

    静态成员在C++中属于类的所有实例共享,这意味着它们不随对象的创建和销毁而改变。在链表中,我们可以使用一个静态成员变量来存储链表的头结点。以下是一个简单的链表节点类定义: ```cpp class Node { public: ...

    c++类的练习_C++类_

    以下是对C++类的详细解释: 1. 类的定义: C++中的类是一个蓝图,它描述了对象的属性(数据成员)和行为(成员函数)。你可以通过关键字`class`来定义一个类。例如: ```cpp class MyClass { // 数据成员 int ...

    GOF23设计模式讲解及C++源代码实现

    例如,单例模式在C++中通常使用静态成员变量和私有构造函数来确保一个类只有一个实例。工厂方法模式则通过定义一个创建对象的接口,但让子类决定实例化哪一个类,将类的实例化延迟到子类。而建造者模式则通过分步骤...

    C++类成员构造函数和析构函数顺序示例详细讲解

    (2)类的非静态数据成员,按照声明的顺序创建。 (3)执行该类的构造函数。 即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数。 下面看一个例子吧 代码如下:class c{public: c(){ printf(“c\n”...

    C++期末试题讲解.pdf

    造函数可以调用类 B 的构造函数 ...以上就是C++编程语言中关于类、对象、成员函数、构造函数、析构函数、友元和静态成员等关键概念的详细解释。理解并掌握这些知识点对于编写和维护C++程序至关重要。

    C++期末试题讲解.docx

    在C++编程语言中,类(class)是创建对象的...这些知识点涵盖了C++类、对象、成员访问、构造函数、析构函数、静态成员、常量成员、友元和运算符重载等核心概念。了解并掌握这些知识点对于理解和编写C++程序至关重要。

    c++ 经典例题详解

    通过八道经典例题,讲解了类的声明、构造函数、析构函数、成员变量和成员函数的使用。同时,也涉及到了类的继承和多态等高级主题。 第一个例题讲解了类的基本声明和成员变量的使用。通过 Sample 类的声明,讲解了...

    C++抽象机制重要概念简明讲解

    类可以包含成员函数(如构造函数、析构函数、常量成员函数、静态成员函数等)、成员变量(包括静态和非静态成员,常量和非常量成员)以及访问控制(公有、保护、私有)。 - **构造函数**:用于初始化新创建的对象...

Global site tag (gtag.js) - Google Analytics