
1.面向对象的三大特性(核心都是为了代码重用)
- 封装:把客观事物抽象成类,并且将属性和 *** 作属性的方法放在一起。
- 继承:是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
- 多态:所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体 *** 作不同,但通过一个公共的类,它们(那些 *** 作)可以通过相同的方式予以调用。
实现方法?编译器怎么支持?
2.类的访问权限
- public
- protected:可以被类中的函数,子类的函数,友元函数访问,但不可以由该类的对象访问
- private:可以被类中的函数,友元函数访问,但不可以由子类或者类的对象直接访问
class 的默认访问级别是private,struct的默认访问级别是public
3.类的构造函数、析构函数、赋值函数、拷贝构造函数、移动构造函数
- 构造函数:一种特殊的类成员函数,无返回值,函数名与类 同名。它提供了对成员变量进行初始化的方法(函数体内赋值或者使用初始化列表),使得在声明对象时能自动的初始化对象。
- 析构函数:一种特殊的类成员函数,无返回值,无参数,不能重载,用来在系统释放对象前做一些清理工作。
- 拷贝构造函数:特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。(适合如下场景:一个对象以值传递的方式传入函数体、一个对象以值传递的方式从函数中返回,一个对象需要通过另一个对象进行初始化)
- 赋值函数:重载了赋值运算的类成员函数
- 移动构造函数:特殊的构造函数。考虑如下场景,当用对象a初始化对象b后,a不再使用了。如果b直接使用a的空间,就避免了新的空间的分配,大大降低了构造的成本。具体的讲,移动构造函数首先接管参数的内存地址空间,然后将其内部所有指针设置为nullptr,并且在原地址上进行新对象的构造,最后调用原对象的析构函数。(因为移动构造函数是对传递的参数进行浅拷贝,也就是说如果参数为指针变量,进行拷贝之后将会有两个指针指向同一地址空间,这个时候如果前一个指针对象进行了析构,则后一个指针将会变成野指针,从而引发错误)
注意!
- 如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,则必须通过构造函数的初始化列表为这些成员提供初始值。
- 拷贝构造函数首先是构造函数,体现了初始化作用。而赋值函数体现在赋值,即被赋值的对象肯定是已经存在了的。
- 默认的拷贝构造函数(编译器帮你合成的)使用浅拷贝(逐bit复制)
- 移动构造函数的参数是右值引用,而构造函数的参数是左值引用。
#include
using namespace std;
class demo{
public:
demo():num(new int(0)){
cout<<"construct!"<<endl;
}
demo(const demo &d):num(new int(*d.num)){
cout<<"copy construct!"<<endl;
}
//添加移动构造函数
demo(demo &&d):num(d.num){
d.num = NULL;
cout<<"move construct!"<<endl;
}
~demo(){
cout<<"class destruct!"<<endl;
}
private:
int *num;
};
demo get_demo(){
return demo();
}
int main(){
demo a = get_demo();
return 0;
}
4.深拷贝与浅拷贝的区别
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)