C++中的类有两个成分:
(1)成员变量
成员变量按照作用域分为静态成员变量和非静态成员变量,C++中成员变量的默认控制符是private,这点与Java不太一样。;按照控制符又可以分为public, private, protected;
静态成员变量本质上只是说明了该变量的持续性和作用域,而不是定义
静态成员变量不能重复定义,故静态成员变量不能在类中或者构造函数中初始化,因为对象创建的时候会执行一次;静态成员变量一般在类的外部进行初始化,并且要放在所有代码块之外(全局作用域)。如果静态成员变量是const类型则可以在类定义中初始化。
静态成员变量的初始化格式 type class::variable=value;
非静态成员变量在对象创建时(分配内存)才被定义,并由构造函数初始化
(2)成员函数
C++中的成员函数定义的位置有两种:
(1)定义在类中
优点:简单方便明了
缺点:类定义包含类实现,可定制性差
(2)定义在类外
优点:可定制性好
缺点:每次定义的时候要加上类名class:: class_function(){}
同样的,按照作用域来分,有静态成员函数和非晶态成员函数,按照控制符来分,有public, private, protected
静态成员函数在类没有定义前就可以使用,故静态成员函数无法访问非静态成员变量,它只能访问静态成员函数内部定义的变量或者静态成员变量
Java中的类是可以访问私有成员变量的;
静态成员函数要想访问私有成员变量,有两种方案:
方案一:将所有访问的数据都定义成静态成员变量;
方案二:
class a
{
public: static FunctionA(a* _a)
{ a-> menber = 1; }
private: int menber;
}
静态成员函数与非静态成员函数的根本区别是:非静态成员函数有 this 指针,而静态成员函数没有 this 指针。由此决定了静态成员函数不能访问本类中的非静态成员
注:友元
成员函数是属于类的,而类中的私有成员变量只有成员函数才能访问,非成员函数想访问私有成员函数,可以在函数定义前加上friend。成员函数的调用形式是
class A{};
A a;
a.function();
非成员函数可以直接调用;
在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
注:Java与C++中关于static的区别与联系
java中的“static”和C++中的“static”含义并不完全一样!!!C++中的关键字static被复写了三次,有三种含义,分别为:
1:变量一直存在
2:不能被其他文件访问的全局变量和函数
3:属于类且不属于对象的全局变量和函数
在一大部分人心中可能只把它理解为“静态”的意思,实际上Java仅仅取了C++中static的最后一个含义:即,不与类的实例相关联,仅与类相关联。