您的位置:首页 > 编程语言 > C语言/C++

c++类中的静态成员函数总结

2016-09-30 16:57 253 查看
参考http://www.cnblogs.com/carbs/archive/2012/04/04/2431992.html

1.c++中可以对类中私有成员中的静态变量初始化吗?

一般情况下对类中私有部分的访问可以是公共部分的成员函数,也可以是友元函数。那可以直接对私有部分的静态成员进行初始化吗。

(1)static成员的所有者是类本身和对象,但是所有对象拥有一样的静态成员。从而在定义对象时不能通过构造函数对其进行初始化。

(2)静态成员不能在类定义里边初始化,只能在class body外初始化。

(3)静态成员仍遵循public,private,protected的访问准则

(4)静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。 

【示例代码】

#include<iostream>
#include<string>

using namespace std;

class Account{
public:
Account(string name, int money) :owner(name), amount(money) { }
~Account() { }
double applyint()
{
amount += amount * interestRate1;
return amount;
}

static double rate()
{
return interestRate1; // 注意返回值
}
static void rate(double);
static double interestRate1;//public,其他非成员可以访问

private:
string owner;
double amount;
static double interestRate2; //private,成员和友元才可访问
static double initRate();
};

double Account::interestRate1 = 2.0; //正确的静态成员初始化
double Account::interestRate2 = 3.0;

double Account::initRate()
{
return 2.0;
}

//所有的静态成员在类体外定义时都不再写static
void Account::rate(double newRate)
{
interestRate1 = newRate;
}

int main()
{
Account Yang("Yang", 10); //interestRate = 2.0
cout << Yang.applyint() << endl;
cout << Yang.applyint() << endl;//注意两个结果不一样,因为amount第一次调用之后就变了。

Yang.rate(4.0);
cout << Yang.applyint() << endl;//interestRate = 4.0
cout << Account::interestRate1 << endl; //public静态成员

Account::interestRate1 = 3.0; //对应上面的赋值语句
cout << Yang.applyint() << endl;//interestRate = 3.0

Account Ning("Ning", 200);//interestRate = 3.0
cout << Ning.applyint() << endl;
Yang.interestRate1 = 6.0; // 也可以,并且还改了类中的静态成员值

Account Pei("Pei", 2);// interestRate=6.0
cout << Pei.applyint() << endl;

return 0;
}


2.静态成员函数不允许引用类的非静态成员,但可以访问对象中的非静态成员

【示例代码】

#include<iostream>
using namespace std;
class M
{
public:
M(int a)
{
A = a;
B += a;//这里每调用一次构造函数不就重新刷新一次B了吗?用这种方法记录生成对象的个数??
}

static void f1(M m);

private:
int A;
static int B;

};

void M::f1(M m)
{
cout << "A=" << m.A;//在静态成员函数中,只能通过对象访问类的非静态成员
cout << "B=" << B;//B是静态成员,可以在静态成员函数中访问

}

int M::B = 0;//一直不明白这里的B不是私有的吗?为什么可以直接访问?是因为这句话没有在任何函数中吗?

void main()
{
M P(5), Q(10);
M::f1(P);
//访问静态成员函数,前面可以用类名或者对象名,下同
M::f1(Q);
}

C++中初始化类中的静态数组

class A
{
public:
static int arr[3];
};

int A::arr[3]={1,2,3};
int main()
{
A a;
cout<<a.arr[1]<<endl;
system("pause");
return 0;
}

关于静态成员函数的总结还可以参考http://www.cnblogs.com/lzjsky/archive/2011/01/24/1943199.html

http://blog.csdn.net/tobefxz/article/details/14109697
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: