友元和static类成员


看了友元和static类成员。分享笔记和说一下认识。


友元

1、友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。有缘的生命以关键字friend开始。它只能出现在类定义的内部。

2、通常将友元声明成组的放在类定义的开始或结尾时个好主意。

3、将一个类设为友元,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。

4、当我们将成员函数声明为友元时,函数名必须用该函数所属的类名字加以限定。

static类成员

1、非static数据成员存在于类类型的每个对象中,static数据成员独立于该类的任意对象而存在。每个static数据成员是与类关联的对象。并不与该类的对象相关联。

2、static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。

3、当我们在类的外部定义static成员时,无需重复指定static保留字,该保留字只出现在类定义体内部的声明处。

4、static成员是类的组成部分,但不是任何对象的组成部分。

5、static成员函数不能被声明为const也不能被声明为虚函数。

6、static数据成员必须在类定义体的外部定义,。他不是通过类的构造函数进行初始化,卫士应该在定义是进行初始化。

7、static数据成员的类型可以是该成员所属的类类型。非static成员被限定声明为其自身类对象的指针或引用。

8、static数据成员可用作默认实参,非static数据成员不能用作默认实参,因为他的值不能独立于所属的对象而使用。


开始看static的时候我其实一下子就蒙了,觉得云里雾里看不懂。咬咬牙觉得看完全部static部分可能就豁然开朗水到渠成。结果看完还是不懂。问了健辉对这部分的认识,听完他说的我再去看书,就慢慢明朗起来了。他说的我觉得就是第十二章的里面讲static的核心:static成员不属于任何一个类的对象,它属于类又独立于类的所有对象,他只有一个副本,所有的对象共享static成员,比如类A的对象a1,a2,a1对类的static数据成员操作的结果可以被a2继续使用。听他说完我再看书,哎呀书上说的不就是健辉表达的意思嘛我一开始怎么就看不懂。
接着我又想,到底友元能不能访问类的static成员,百度了一下,还真有人问。情况是这样的;
提问:
类的友元函数能访问类所有成员,那静态的呢?我试过了不可以
#include<iostream>
using namespace std;
class A
{
public: static int number; 
friend void hanshu();
};
void hanshu()
{
cout<<A::number;
}
nt A::number=456; //注意这里,你对静态成员初始化有错误
int main()
A a; 
hanshu(); 
return 0;
}
为什么?

回答者:
class A
{
public: static int number; 
friend void hanshu();
};
void hanshu()
{
cout<<A::number;
}
int number=456;
int main()
A a; 
hanshu(); 
return 0;
}

还要注意,并不是友元函数能访问类中的所有成员,这样理解是错误的,正确的理解是,友元函数能通过类的对象访问类中的所有成员,友元函数是不能直接访问类中的私有成员的,比如
class A
{
int a;
public: friend void f();
} void f(){a=1;
}
//这样就会出错,只能通过类的对象来访问,比如
void f()
{
A ma; 
ma.a=1;
}
//这样就正确,如果函数f不是友元,则ma.a是错误的。



结论是可以的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值