c++中的静态成员变量

C++ 类中的静态变量

静态数据成员:

下面看一个例子:

#include <iostream.h>

class Point

{

public:

void output()

{

}

static void init()

{

}

};

void main( void )

{

Point pt;

pt.init();

pt.output();

}

这样编译是不会有任何错误的。

下面这样看

#include <iostream.h>

class Point

{

public:

void output()

{

}

static void init()

{

}

};

void main( void )

{

Point::output();

}

这样编译会处错,错误信息:illegal call of non-static member function,为什么?

因为在没有实例化一个类的具体对象时,类是没有被分配内存空间的。

好的再看看下面的例子:

#include <iostream.h>

class Point

{

public:

void output()

{

}

static void init()

{

}

};

void main( void )

{

Point::init();

}

这时编译就不会有错误,因为在类的定义时,它静态数据和成员函数就有了它的内存区,它不属于类的任何一个具体对象。

好的再看看下面的例子:

#include <iostream.h>

class Point

{

public:

void output()

{

}

static void init()

{

x = 0;

y = 0;

}

private:

int x;

int y;

};

void main( void )

{

Point::init();

}

编译出错:

illegal reference to data member ‘Point::x‘ in a static member function

illegal reference to data member ‘Point::y‘ in a static member function

在一个静态成员函数里错误的引用了数据成员,

还是那个问题,静态成员(函数),不属于任何一个具体的对象,那么在类的具体对象声明之前就已经有了内存区,

而现在非静态数据成员还没有分配内存空间,那么这里调用就错误了,就好像没有声明一个变量却提前使用它一样。

也就是说在静态成员函数中不能引用非静态的成员变量。

好的再看看下面的例子:

#include <iostream.h>

class Point

{

public:

void output()

{

x = 0;

y = 0;

init();

}

static void init()

{

}

private:

int x;

int y;

};

void main( void )

{

Point::init();

}

好的,这样就不会有任何错误。这最终还是一个内存模型的问题,

任何变量在内存中有了自己的空间后,在其他地方才能被调用,否则就会出错。

好的再看看下面的例子:

#include <iostream.h>

class Point

{

public:

void output()

{

}

static void init()

{

x = 0;

y = 0;

}

private:

static int x;

static int y;

};

void main( void )

{

Point::init();

}

编译:

Linking...

test.obj : error LNK2001: unresolved external symbol "private: static int Point::y" ()

test.obj : error LNK2001: unresolved external symbol "private: static int Point::x" ()

Debug/Test.exe : fatal error LNK1120: 2 unresolved externals

执行 link.exe 时出错.

可以看到编译没有错误,连接错误,这又是为什么呢?

这是因为静态的成员变量要进行初始化,可以这样:

#include <iostream.h>

class Point

{

public:

void output()

{

}

static void init()

{

x = 0;

y = 0;

}

private:

static int x;

static int y;

};

int Point::x = 0;

int Point::y = 0;

void main( void )

{

Point::init();

}

在静态成员数据变量初始化之后就不会出现编译错误了。

再看看下面的代码:

#include <iostream.h>

class Point

{

public:

void output()

{

}

static void init()

{

x = 0;

y = 0;

}

private:

static int x;

static int y;

};

void main( void )

{

}

编译没有错误,为什么?

即使他们没有初始化,因为我们没有访问x,y,所以编译不会出错。

c++中的静态成员变量

时间: 2024-08-27 08:07:59

c++中的静态成员变量的相关文章

C++类中的静态成员变量与静态成员函数

最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员先于类的声明而存在于内存,也可以根据类声明的对象来访问.而非静态成员必须实例化之后才会分配内存. 非静态成员的概念: 所有没有加static的成员都是非静态成员.而类被实例化后,可以通过实例化的类

C++ 类中的静态成员变量,静态成员函数

//类中的静态成员变量,静态成员函数 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* 静态成员函数是属于整个类, static修饰的变量,是属于类,,所有的对象都能共享用. 在类的静态数据成员函数中,是不能调用具体的对象的变量的属性, 这是因为static修饰的变量是整个类共享,在静态成员函数中使用一个对象的成员属性 c++编译器无法知道这个成员属性是哪个对象的 所以在静态成员函数中只能使用静

关于c++中的静态成员变量

下面通过1个例子来解释一下: 1 #include <iostream> 2 #include <string> 3 using namespace std ; 4 5 6 class student 7 { 8 private://把变量声明为私有的 9 int num ; 10 string name ; 11 int math ; 12 int english ; 13 int total ; 14 static string teacher; 15 void cacu_to

C++类中的静态成员变量与静态成员函数的使用

代码: 1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 5 using namespace std; 6 7 class A{ 8 public: 9 static int a; 10 //static int a = 0; //编译不通过,无法在类内初始化 11 int b; 12 static void func1(){ 13 cout<<"static func&

OC中的静态成员变量

代码: main.m: #import <Foundation/Foundation.h> #import "MyObject.h" int main(int argc, const char * argv[]) { @autoreleasepool { [MyObject setFlag:YES]; NSLog(@"%@", [MyObject flag] ? @"YES" : @"NO"); } return

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

静态成员:在定义前面加了static 关键字的成员.如下: class CRectangle { public: CRectangle(); ~CRectangle(); static void PrintTotal(); private: int w, h; static int nTotalArea; static int nTotalNumber; }; CRectangle::CRectangle(int w_, int h_) { w = w_; h = h_; nTotalNumbe

第25课 类的静态成员变量

1. 成员变量的回顾 (1)通过对象名能够访问public成员变量 (2)每个对象的成员变量都是专属的 (3)成员变量不能在对象之间共享 2. 静态成员变量 (1)C++中的静态成员变量 ①静态成员变量属于整个类所有 ②静态成员函变量的生命期不依赖于任何对象 ③可以通过对象名,也可以通过类名直接访问公有静态成员变量 ④所有对象共享类的静态成员变量 (2)静态成员变量的特性 ①在定义时直接通过static关键字修饰 ②静态成员变量在程序内部位于全局数据区,所以需要类外为其单独分配空间.(因为new

spring注入静态成员变量提示invalid setter method

果然还是不够细心啊,被坑一晚上.. 一个极其简单的小程序,但是需要通过xml文件配置注入一个值,唯一的特别是要注入的属性是类中的静态成员变量.. 如下,然后自动生成get和set方法..坑就从此开始了... public class Food{ private static String desc; public static String getDesc(){ return desc; } public static void setDesc(String desc){ Food.desc =

[email&#160;protected]类的静态成员变量和静态成员函数

参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2011/01/24/1943199.html 分析Qt程序时,碰到下面代码. QString str = QString("QFrame#avatar{border-image:url(%1.jpg)}").arg( QString::number(i) );   静态成员变量 静态成员函