C++中类包含三种成员访问说明符:public, private 和 protected.
在程序能访问类对象的任何地方都可以访问任何在成员访问说明符public后面声明的数据成员和成员函数.成员访问符private后面的数据成员和成员函数只能由该类的成员函数或友元访问.基类的protected成员只能被基类的成员和友元已及派生类的成员和友元访问.
在C++中还存在三中继承方式:public, private, protected.
对于它们的论述可以在任意一本关于C++的书中都可以找到.大家对public继承都比较熟悉.但我们偶尔也会看到private继承.private继承时基类中的public,private成员变成派生类中的private成员.基类中的private成员在派生类中隐藏.
这里简单介绍一下以下两种情况的异同:
(1)B private 继承A
(2)A是B的一个私有成员的异同.
相同点:A的接口(public 成员函数)都只对B开放,不对外开放.
不同点:在(1)中A的public, protected成员都为B的private成员,B的成员函数可以直接访问.在(2)中A的成员都不是B的成员,并且B不能访问A的protected成员,要访问A的public成员也要借助A的对象.
下面再讲一些编译器在构造类时所采取的缺省操作:
1.如果类没有声明构造函数,编译器会声明一个默认构造函数.
2.如果没有声明拷贝构造函数,编译器会隐式地生成一个.
3.如果没有声明赋值操作符,编译器会隐式地生成一个.
4.如果没有声明析构函数,编译器会隐式地生成一个.
隐式生成的函数都是public的.
如果接受一个副本是有效的行为,就该声明并定义拷贝构造函数和赋值操作符.如果接受一个副本是禁止的,你可以将拷贝构造函数和赋值操作符声明为private,并且不实现它们,这样可以阻止编译器生成缺省的操作,从而防止客户复制类对象.
下面是代码实例:
class test{
};
该类中不包含任何成员,也没声明任何方法.编译器会缺省生成下列方法:
test::test()
{
}
test::~test()
{
}
test::test(const test& rt)
{
...
}
test& test::operator=(const test& rt)
{
...
}
这些方法都是public的.
如果想阻止编译器生成缺省的拷贝构造函数,和赋值操作,可以进行如下操作:
class test{
private:
test(test& rt); // 该方法被定义为private,并且不被实现.
test& operator=(test& rt); // 该方法被定义为private,并且不被实现.
};