对象和类继承
来源:互联网 发布:mac版梦幻西游鼠标右键 编辑:程序博客网 时间:2024/05/18 00:36
对象和类继承
面向对象(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/
- 对象和类继承
- 类和对象 -----继承
- 类和对象:继承
- 类继承和对象组合
- javascript类对象和继承
- 类和对象与继承
- 类和对象、封装和继承
- 面向对象继承总结:拷贝继承、类式继承和原型继承
- 虚拟继承和多重继承中类对象的大小
- 类、抽象类、接口、继承和对象
- js中的类,对象和继承
- C++类和对象的继承
- 关于C++继承类和对象
- lua类对象创建继承和使用
- exercise 42 继承 包含 对象和类
- 类的继承和对象引用
- Python-28 类和对象:继承
- 原型对象和继承
- 提取元素的轮廓及形状描述子
- 友元,异常和其它
- Linux 常用指令---Sort排序
- 软件工程师的工作总结
- rsync两台服务器文件同步
- 对象和类继承
- SQL to mongo Shell to C++
- VR有五种全局光照渲染引擎和各自的优缺点
- 【BZOJ】1005 明明的烦恼
- 使用OpenSSL实现证书操作
- Java位运算总结:位运算用途广泛
- 不期望明天
- Android studio 使用Lambda
- android app -- Picasso 二级缓存加载图片,可控制加载图片大小(附小demo)