目录
1.类:
概念:把同一事物的共同特征提取出来就是类,抽象概念
对象:由类创造的具体实体叫做对象
类中包括属性和行为
属性用来描述类是什么样的 一般都是些名称
行为是描述类可以做什么 一般都是动词
栈内存对象:通过点的方式调用成员,出了所在范围就自动销毁
例如:student s;
堆内存对象:需要通过关键字new来创建,调用方式为:->,需要手动销毁,
销毁时使用关键字delete,并且对指针赋值为NULL;如果不销毁
会造成内存泄漏。
例如:student *s1 = new student;
2.封装:
概念:将类中的一些属性和具体实现细节隐藏,通常表现为把属性设为私有。
访问的话需要通过公告接口。封装可以通过控制属性的读写权限,提高程序安全性。
例如:
class student{
private: //私有
属性列表
public: //公共
};
3.构造函数
概念:用于创建对象时初始化对象中的属性
特点:
1)实例化对象时,必须调用构造函数进行初始化。
2)如果不现实的给出构造函数,会有一个默认的构造函数,参数和函数体都为空
没有实际意义
3)如果给出任意构造参数,默认的无参的构造参数就不会存在
构造函数是一个特殊的函数:
名字和类同名;
不需要返回值;
3.1 有固定值的构造函数
可以在函数内部直接给定值,这样不需要进行传参
例如:
student s(){
属性赋值
}
3.2有参数的构造函数
用参数给属性赋值,可以通过传参方式变的更加灵活
例如:
student s(参数){
属性赋值
}
构造函数可以重载
构造函数支持默认值
4.拷贝构造函数
概念:通过已经存在的对象为新对象完成初始化
拷贝的参数是对象的引用或者const修饰的对象引用,可以将已存在对象的属性赋值给新的对象。
特点:拷贝构造特殊函数,可以与构造函数构成重载
如果不显示给出构造函数,编译器会给出一个默认的构造函数,完成两个对象之间的赋值
对象之间是相互独立的实体,数据也相互独立
例如:
student s1(s);
5.深拷贝和浅拷贝
如果对象的属性中有指针类型的时候,需要显示的写出构造函数
浅拷贝:
定义:如果不显示的给出拷贝构造函数,会有默认的拷贝构造函数,完成对象之间简单的值赋值,
简单值赋值的操作叫做浅拷贝
如果对象中的属性有指针类型的时候,默认拷贝构造也只会简单的进行地址的复制,
导致两个对象的属性指向同一块内存,破坏了对象之间的独立性。
6.析构函数
对象声明期结束前应该完成对象资源的清理,这个工作通过析构函数完成。
比如创建对象时为数据成员开辟的空间,会通过析构函数在对象的生命期结束前进行释放。
若类中没有显式定义析构函数,则编译器会给出一个默认的析构函数,函数体为空,
在对象生命期结束时默认的析构函数被执行。
默认析构函数的形式:~类名(){}
特点:
1)析构函数没有参数,所以不能重载
2) 对象销毁时自动调用
new关键字创建的堆内存对象需要手动delete销毁,才会自动调用析构函数
创建对象时如果为数据成员开辟了空间,需要通过析构函数在对象的生命期结束前进行释放
7.作用域限定符::
7.1名字空间
命名空间实际上是由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间区域,
把一些自己定义的变量、函数等标识符存放在这个空间中,从而与其他实体定义分隔开来。
std是C++标准库的一个名字空间,很多使用的内容都是来自于标准名字空间
例如字符串std::string、std::cout...
当项目中包含using namespace std;时,代码中使用std名字空间中的内容就可以省略前面的std::
可以让不同的名字空间村咋相同的变量名和函数名
7.2类内声明,内外定义
当函数的声明和定义分离时,需要用到作用域限定符::指名函数属于哪个范围
7.3explicit关键字
等号赋值时,等号的左边是对象类型,等号右侧恰好是构造函数可以接受的类型,
这时编译器就会自动把等号右边的数据传入到构造函数中。相当于隐式调用了构造函数。
在对象操作过程中,可能不小心隐式调用了构造函数,造成错误。为了屏蔽隐式构造,可以加explicit关键字