类的可见性(权限)与初始化
可见性
类的可见性(有的书上也称之为权限)共有三种:public,protected,private.
可见性 | 范围 |
---|---|
public | 公有成员,对类内和类外都可见,能直接访问 |
protected | 保护成员,对类内及其派生类可见.类外不可见,类外间接访问 |
private | 私有成员,对类外及派生类都不可见,只能间接访问 |
类内:简单理解为类成员函数内
类外:简单理解为类成员函数外
重点:谈及关于private的时候,有的书上或帖子是这么说的“关键字private将类成员声明为私有成员,不能被类对象直接访问。”针对于类外,这样的描述并没有问题,但并不适用于类内。贴一段代码:
CMyString& CMyString::operator=(CMyString &ObjString)
{
if (this != &ObjString)
{
if (ObjString.m_pStr)
{
this->StrCpy(ObjString.m_pStr);
}
}
cout<<"Operator overloading \"=\""<<endl;
return *this;
}
ObjString是由外界传入类对象,其私有成员对该类成员函数仍然可见,可以看见的是,运行并不会报错
由此可见,即使是类的私有成员,由其类对象调用,但在类成员函数内仍然可见。
成员初始化
类成员的初始化有两种,如果涉及静态成员,应该算是三种。
1.构造函数内初始化
public:
CTest(CMyString &String)
{
m_String = String;
}
2.初始化列表初始化
函数名后接”:“,多个成员初始化”,“隔开
public:
CTest(CMyString &String):m_String(String)
{
}
3.静态成员类外初始化
静态成员初始化要省去关键字
static int ms_nLen;
};
int CTest::ms_nLen = 10;
一般类成员初始化都是在类对象产生时,在构造函数内或在初始化列表初始化。但静态成员只能在类外初始化,这主要由其特性所决定:1.所有对象共享一份 2.早于类对象产生。静态成员函数没有this指针也正因于此。
构造函数内初始化与初始化列表初始化针对内置类型而言,区别不大。主要针对类类型。一般来讲成员初始化列表,效率更高。如果类中有类对象,在构造函数内初始化会先调用一次缺省构造,在调用其运算符重载。而在初始化列表,则是直接调用类对象的拷贝构造。究其原因,无外乎类对象产生时要调用一次构造函数。理论上讲初始化列表效率更高。但也参照实际情况。如果程序员偷懒,类的拷贝构造内部是用运算符重载实现的,依我之拙见,两者效率应该是差不多的。
值得一提:类常成员(const成员)初始化只能在初始化列表。原因初始化列表做的是初始化,而构造函数做的是赋值。