martin

thinking

常用链接

统计

software

最新评论

C++的一些基础知识

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,并且不被实现.
};
 

posted on 2009-03-04 14:51 martin_yahoo 阅读(1393) 评论(2)  编辑 收藏 引用

评论

# re: C++的一些基础知识 2009-03-05 19:00 Sandy

这里简单介绍一下以下两种情况的异同:
(1)B private 继承A
(2)A是B的一个私有成员的异同

你好,对于第二中情况,我不是很懂,A是B的一个私有成员的异同
class A
{
};

class B: private A
{
};

这是第一种情况,

那么第二种是什么情形呢?
  回复  更多评论   

# re: C++的一些基础知识[未登录] 2009-03-05 22:00 martin_yahoo

@Sandy
第一种情况
class B : private A
{
....
};
B 从A私有继承.
第二种情况:
class B{
...
private:
A a;
...
};
B含有一个A对象为实例,并且为B的私有成员.  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理