深入浅出MFC读书笔记——c++对象重要性质

工作需要,开始学习MFC,最近在读《深入浅出MFC》,将所看的内容整理作为笔记

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

************************************************

**勿在浮沙筑高台——c++重要性质              **

**date:27/12/2013     edit by linuxsbird        **

************************************************

c++的重要性质:封装性(encapsulation)继承性(inheritance)多态性(polymorphism)

1 封装性:

class与struct的区别:

1 关于使用大括号初始化:

  class和struct如果定义了构造函数的话,都不能用大括号进行初始化

  如果没有定义构造函数,struct可以用大括号初始化。

  如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。

2 关于默认访问权限:

  class中默认的成员访问权限是private的,而struct中则是public的。

3 关于继承方式:

  class继承默认是private继承,而struct继承默认是public继承。

2 继承性:

主要需要我们掌握this指针

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子:
void Date::setMonth( int mn )
{
month =mn;
this->month =mn;
(*this).month =mn;
//这三句是等价的
}
1.this只能在成员函数中使用。
全局函数,静态函数都不能使用this。
实际上,成员函数默认第一个参数为T*const register this。
如:
class A
{
public:
int func( int p){}
};
其中,func的原型在编译器看来应该是: int func(A*const register this, int p);
2. 由此可见,this在成员函数的开始前构造的,在成员的结束后清除。
这个生命周期同任一个函数的参数是一样的,没有任何区别。
当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如:
A a;
a.func(10);
此处,编译器将会编译成: A::func(&a, 10);
编译器通常会对this指针做一些优化的,因此,this指针的传递效率比较高--如vc通常是通过ecx寄存器来传递this参数。
3 虚函数
对于子类指针指向父类,或者父类指针指向子类,我觉得书上总结的比较透彻:

   1.如果你以一个“基类之指针”指向“派生类之对象”,那么经由该指针你只能够调用基类所定义的函数。

    2.如果你以一个“派生类之指针”指向一个“基类之对象”,你必须先做明显的转型。这种做法很危险,不符合真是的生活经验,在程序设计上也会给程序员带来困惑。

    3.如果基类和派生类都定义了“相同名称的成员函数”,那么通过对象指针调用成员还数时,到底调用的是哪一个函数,必须视该指针的原始类型而定,而不是视实际所指的对象的类型而定。


虚函数正是为了对“如果你以一个"基类之指针"指向一个"派生类之对象",那么经由该指针你只能调用该基类所定义的函数”进行反其道而行之。
对于虚函数的相关结论:
 1.如果你期望派生类重新定义一个成员函数,那么你应该在基类中把此函数设为virtual。
 2.以单一指定调用不同函数,这种性质称为Polymorphism,也就是多态。
3.虚函数是C++语言的多态性质以及动态绑定的关键。
4.既然抽象类中的虚函数不打算调用,我们就不应该定义他,应该把它设为纯虚函数(在函数声明后加上“=0”) 
5.我们可以说,拥有纯虚函数的为抽象类。
6.抽象类不能产生出对象的实例,但是我们可以拥有指向抽象类的指针,以便于操作抽象类的各个派生类。
7.虚函数派生下去仍为虚函数,而且可以省略virtual关键字。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值