Static成员变量,static成员函数解析

最近看Effective C++经常看到一些和static相关的内容,希望综合整理一下,如果有不全,还望补充:

1 类中的Static成员变量

static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!

一般为类申请一个对象,是对类中成员变量申请一个副本,各个对象之间的成员变量和函数互不影响,但是static成员变量不是在栈空间而是在静态存储区,所有的类对象共享static变量。静态成员是可以独立访问的,无需创建任何对象就可以访问

只是定义一个static变量,这个变量不能在类当中进行初始化,当然包括类的构造函数,static成员的初始化在类的外部进行。

静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中(在VS中也不报错)。 

注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef
#define #endif或者#pragma once也不行。

#include "static.h"
#include <iostream>
	using namespace std;
	class Person
	{
	private:
		string name;
		static int age;
	public:
		Person(const string&nm):name(nm)
		{}
		void Print()
		{
			cout<<name<<" is "<<age<<endl;
		}
	};
	int Person::age=20;
int main()
{
	Person person("tom");
	person.Print();
	cout<<endl;
	return 0;
}

static成员只能被static成员函数访问

static成员可以实施封装,为public,private,protect

这里要求static成员必须在类外部进行定义;

注意:const static int 成员可以在类内部进行定义,因为是const成员,除int之外,类中不能声明别的类型的const static成员

const static int age=20;  //OK
const static string address= "XT";  //error

静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的
指针或引用。举例如下:

class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
}; 

2 类中static成员函数

由于static成员并不属于类中的某一个对象,所以static成员函数没有this指针,一般成员函数可以声明为const说明函数不会修改所属类

的信息,由此可见,没有this指针,静态成员函数不能被声明为const

static成员函数只能够访问static成员不能使用非static成员

	class Person
	{
	private:
		string name;
		const static int age=20;
	    static string address;
	public:
		Person(const string&nm):name(nm)
		{}
		static void Print()
		{
			cout<<"name is "<<age<<endl;
			cout<<"adress is "<<address<<endl;
		}
	};
	string Person::address = "XT";<pre name="code" class="cpp">         const int Person::age;//<尽管已经初始化,还是给出定义(C++ primer中规定必须定义,但是在VS中编译运行不定义也没问题)

其中 const static成员函数:这里应该是有一点迷惑性,其实就是返回类型为const

静态成员函数的地址可以赋值给普通的函数指针储存,普通成员函数地址只能赋值给类成员指针

class base{
static int func1();
int func2();
}; 

int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针 

3 继承

静态成员变量同样被类的派生类对象共享

#include "static.h"
#include <iostream>

class base{
public :
	static int _num;//声明
};
int base::_num=0;//静态数据成员的真正定义
class derived:public base{
};
void main()
{
	base a;
	derived b;
	a._num++;
	cout<<"base class static data number _num is"<<a._num<<endl;
	b._num++;
	cout<<"derived class static data number _num is"<<b._num<<endl;
}

输出是1,2

const static int age=20;
const static string address= "XT";
时间: 2024-12-30 05:50:11

Static成员变量,static成员函数解析的相关文章

2.2 C++类的成员变量和成员函数

参考:http://www.weixueyuan.net/view/6334.html 总结: 类成员的声明和定义: 类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换为内联函数). 类是一种数据类型,该类型类似于普通的数据类型,但是又有别于普通的数据类型.类这种数据类型是一个包含成员变量和成员函数的一个集合.下面是student类的定义. [例1] 类可以包含成员变量和成员函数: class student { char name[20]; //姓名 int i

【好程序员训练营】Objective-C学习笔记----------成员变量和成员函数的封装

<A href="http://www.goodprogrammer.org/" target="blank">ios培训</A>------我的OC语言笔记,期待与您交流! 前言--在我们开发项目的过程中,很多时候我们不想程序里面的成员变量或者成员函数暴露出来,我们只希望别人通过一些方法来调用这些变量或者函数, 这时就需要用到成员变量和成员函数的封装 一.成员变量的封装 @interface Person:NSObject{ @privat

5.this调用成员变量、成员函数、构造函数

this的两种用法: 1.this调用成员变量和成员函数    System.out.println("my name is "+this.name) this代表调用这个函数的对象. 可以用来区分成员变量和参数,必须加this 2.使用this调用构造函数 person(Sting name,int age,String address) { this.name=name; this.age=age; this.address=address;//前面是成员变量,后面是参数 } th

【转】C++ const成员变量和成员函数(常成员函数)

转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字.初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击<C++初始化列表>回顾. const成员函数(常成员函数) const 成员函

C++ const成员变量、成员函数和对象

const成员变量 const成员变量和const普通变量用法相似.初始化const成员变量只有一种方法,就是通过构造函数的初始化列表. const成员函数 const成员函数可以使用类中的所有成员变量,但是不能修改它们的值. 注意:const成员函数需要在声明和定义的时候在函数头部的结尾加上const关键字 函数开头的const用来修饰函数的返回值,表示返回值是const类型,也就是不能被修改. 函数头部的结尾加上const表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值.

C++学习10 static静态成员变量和静态成员函数

一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局变量来达到共享数据的目的.例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败.因此在实际开发中很少使用全局变量. 如果想在同类的多

访问权限PPP(public、private、protected、default)之成员变量、成员变量权限解析

首先,我们需要清楚一下方法是由哪些部分构成的: [权限修饰符列表][别的修饰符列表] 返回值类型 方法名(参数列表){   方法体:} 然后我们需要知道成员变量和成员方法访问有几种情况:1.当前包同一个类  2.当前包里面别的类  3.别的包里别的类  4.自己包继承关系的类  5.从别的包里有继承关系的类 第一步先创建一个别的类的代码,示例: package com.java; public class admin{ //成员变量的访问权限 public int i1 = 10; protec

[原]Unity3D深入浅出 - 常用类的成员变量和成员函数(Tranform、Time、Random、Mathf、Input)

Transform的成员变量 Transform的成员函数 Time类,获取和时间相关的信息,可用来计算帧速率,调整时间流逝的速度等. Random类,可用来生成随机数,随机点和旋转. Mathf类提供了常用的数学运算 Input类是处理输入的接口:

面向对象(多态-成员变量和成员函数)

如果父类中没有show()方法,编译会失败!!!!! 原文地址:https://www.cnblogs.com/pomodoro/p/9537547.html

c# 通过反射输出成员变量以及成员变量的值

/*** @Author rexzhao* 工具类 仅限于* public variable*/using System.Collections;using System.Collections.Generic;using System.Reflection;using System.Text;using UnityEngine;//#if !UNITY_ANDROID && UNITY_EDITOR #if __DEBUGpublic static class ObjectUtils{