C++:类

类的可见性(权限)与初始化

可见性

类的可见性(有的书上也称之为权限)共有三种: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成员)初始化只能在初始化列表。原因初始化列表做的是初始化,而构造函数做的是赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值