当前位置: 首页 > C/C++, cpp > 正文

对象和类继承

对象和类继承

面向对象(OOP)是一种特殊的,设计程序的方法,C++经过改进C语言,使得这些方法更容易使用其特性:
抽象,封装和数据隐藏,多态,继承,代码的可重用性。

构造函数:

构造函数的参数表示的不是类的成员,而是赋给类成员的值,因此,参数名不能与类成员相同,否则最终的代码会很混乱,通常的做法是在数据成员名中使用m_前缀。
C++提供了两种使用构造函数来初始化对象的方式。显示的调用,隐式调用
默认构造函数:

当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。就是什么都不做,不初始化数局成员,但是类还是创建了类的实体,如果为类定义了构造函数后,程序员就必须为它提供默认构造函数,如果提供了非默认构造函数,但是没有提供默认构造函数,这时当编译器调动默认构造函数就会出错。在设计类的时候,通常应该提供对所有类成员做隐式初始化的默认构造函数。带参数的构造函数也可以是默认构造函数,只要所有参数都有默认值。

复制构造函数:
复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是赋值过程。按值传递返回对象时都将调用复制构造函数。默认的复制构造函数逐个复制非静态成员,也称之为潜复制。如果类中包含一个静态数据成员,即其值将在新对象被创建时发生变化,则应该提供一个显示复制构造函数来处理计数问题。使用默认复制构造函数的另一个问题,当调用这个函数后,它只复制值,假设在这个个过程中需要复制一个字符串,那么复制构造函数会复制这个字符串指针,所以如果第一个对象被释放了,被赋值的对象就会完蛋。所以请使用显示复制函数来解决问题。

复制问题:
在默认情况下,将下一个对象赋给同类型的另一个对象时,C++将源对象的每个数据成员的内容复制到目标对象中相应的数据成员中。

const 成员函数:
只要类方法不修改调用对象,就应将其声明为const.
this 指针:
每个成员函数(包括构造和析构函数)都有一个this指针,this指针指向调用对象,如果方法需要引用整个调用对象,则可以使用表达式*this 在函数后边使用const 限定符将this限定为const,这样将不能使用this 来修改对象的值。*this 为这个变量的地址也可以当作是引用。

重载操作符限制:

重载后的操作符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符,还有不要将“-”操作符重载成和的形式,不要去修改操作符原意,这样可以减少错误的发生。
不能修改操作符优先级
不能定义新的操作符
不能重载以下操作符:sizeof . * :: ?: typeid const_cast dynamic_cast reinterpert_cast static_cast
以下操作符只能通过成员函数进行重载 = ()[] ->
静态成员函数:
可以将成员函数声明为静态的。不能通过对象调用静态测成员函数,实际上,静态成员函数甚至不能使用this 指针。如果静态成员是在公有部分声明的,则可以使用类名和作用域解析符来调用它。由于静态成员函数不与特定的对象相关联,因此只能使用静态数据成员。

在构造函数中使用new 和 delete 的一些注意事项:

1.在构造函数中使用了new 必须在析构函数中使用delete
2.new 和 delete 必须使用一种统一的模式
3.应该定义一个复制构造函数,通过深度复制将一个对象初始化为另一个对象
4.当定义一个赋值操作符,通过深度复制将一个对象复制给另一个对象

有关返回对象的说明:

1.返回const 对象的引用
1.返回对象将调用复制构造函数(待议),返回引用却不会。引用指向的对象应该在调用函数执行时存在。const 要统一。
2.返回非const 对象的引用
1.常见”<<” “>>” 的重载。
3.返回对象
如果被返回的对象是调用函数中的局部变量,则不应该按引用的方式返回它,因为在被调用函数执行完毕时,局部对象将调用其析构函数.局部对象将不复存在。
4.返回const对象
返回一个不可被修改的对象。

派生类:
派生类构造函数要点:
基类对象首先被创建
派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
派生类构造函数应初始化派生类新增的数局成员
创建派生类时:
首先调用基类构造函数,然后再调用派生类构造函数。基类构造函数负责初始化继承的数局成员,派生类的构造函数总是调用一个基类的构造函数。派生类对象过期时,程序将首先调用派生类析构函数,然后再调用基类析构函数。
纯虚函数,绝对时派生类实现的函数,有纯虚函数的类只能被继承,也就是抽象基类。=0
动态内存与继承
1.派生类中没有new
派生类不需要显示析构函数,对象消亡之时,自动调用基类析构函数。
2.派生类使用new
派生类需要显示的析构函数

本文固定链接: http://zmrlinux.com/2016/01/29/%e5%af%b9%e8%b1%a1%e5%92%8c%e7%b1%bb%e7%bb%a7%e6%89%bf/ | Kernel & Me

该日志由 root 于2016年01月29日发表在 C/C++, cpp 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 对象和类继承 | Kernel & Me