c++
面向对象的三大特性
封装,继承,多态
1,封装
对象有属性和行为,在设计时一并
class+名称
{
//访问权限
//属性==变量,成员属性
//行为==函数,成员函数
};
2,三类权限;
1,public:类内外都可以访问
2,protected:类内可以,类外不可以
3,private:类内可以,类外不可以 主要的不同体现在继承
struct 默认权限是公共
class 的默权限是私有
为什么要设置get和set
成员属性设置为私有的好处
具体操作步骤:可以在类内设置一个公共函数,来对private属性进行读写的操作
1,将成员属性设置为私有,可以自己控制读写权限
2,对于写权限,我们可以检测数据的有效性
3,封装案例:成员函数和全局函数
4,在一个类中,可以让另一个类作为本类的成员
构造函数和析构函数
对象的初始化和清理
语法
构造函数的分类和调用
有参构造 和 无参(默认)构造
按照类型来分类
拷贝构造函数(将张三的属性赋值给李四)
example{
person ( const person &p)
{
age=p.age;
}
普通构造
调用
1,括号法
person p1;//无参 调用默认构造函数的时候不要加“ ( ) ”因为这会导致编译器认为是一个函数的声明,不会认为这是一个对象
person p1 (10);//有参
person p3 (p2);//拷贝构造函数的调用
2,显示法
person p1;
person p2=person( 10 );//有参构造
person p3 =person(p2);//拷贝构造
person ( 10 );这是一个匿名对象;当前执行结束后,系统会立即回收掉匿名对象
不要利用一个拷贝函数来初始化一个匿名对象,编译器会认为我们重定义
3,隐式转换法
person p4 =10;相当于person p4 =person( 10 );
拷贝构造函数的调用时机
运算符重载
对运算符进行重载,使其适应不同的数据类型,(包括自己定义的)
可以通过成员函数和全局函数
区别:传函数引用的数量不同
example:
成员函数重载运算符
class person
{
public:
person operate+( preson &p )
person temp;
temp.m_A =this->m_A+p.m_A;
temp.m_A =this->m_A+p.m_A;
return temp;
}
全局函数重载
两个重载的本质
对于内置的数据类型的表达式运算的运算符是不可能改变的
vector
为什么要使用链表
链表是由结点组成的,一个节点至少有两个元素
各个成员的结点不是连续存储的
最后一个成员的指针是NULL
链表的代码实现
1,结点(node)
struct node {
int value;
struct node* next;//指向一个结构体的指针
};
int main(void){
struct node a;'//是一个结点
struct node b;
struct node* list = NULL;//空链表
list = &a;//list 链表
a.next=&b;
b.next =NULL
return 0 ;
}(该代码仅供参考理解性使用,没有具体使用价值)
链表的类型
1,有没有头节点
2,单双链表
3,有没有环(链表和循环链表)
1,不带头结点的链表:每一个结点都包含数据,比较原始
2,带头结点的链表:每一个数据结点都有一个前驱
链表的基础操作
1,创建链表
struct node{
int value;
struct node*next;
};
struct node* list_create(){
struct node *list = (struct node *)malloc(sizeof(struct node));//申请动态堆空间内存
//可以设置个函数来检查内存是否分配成功
if(list==NULL){
return NULL;
}
list->next =NULL;
return list;
}
使用数组来创建列表
struct node*list_create(int data[],int n){
}
3,