c++笔记第五天

类和对象
  c++三大特性封装、继承、多态。
  C++认为万物皆对象 有属性和行为

封装
  1、将属性和行为作为一个整体,表现生活中的事物。
  2、将属性和行为加以权限控制。

意义
  在设计时属性和行为写在一起,表现事物。

  格式
      class 类名{访问权限:属性 / 行为};

 1 const dobule PI=3.14;
 2 class Circle
 3 {
 4     public://公共权限
 5     //行为
 6     int m_r;
 7     //行为
 8     //获取元的周长
 9     dobule calculateZC()
10     {
11         return 2*PI*m_r
12     }
13 };
14 Circle c1;//通过圆类创建具体对象
15 c1.m_r=10;
16 cout<<""圆的周长"<<c1.calculateZC( )<<endl;    

 

 

 


封装访问权限
  public     公共权限,类内可以访问 类外可以访问
  proteced     保护权限,类内可以访问 类外不可以访问 子类可以访问继承类的权限
  private     私有权限,类内可以访问,类外不可以访问 子类不可以访问据称的权限


    c++中struct 和class唯一区别就在于默认的权限不同
      1、struct默认权限为公共
      2、class默认权限为私有

    成员属性设置为私有,可以自己控制读写权限,对于写权限可以检测数据有效性


    一个类中可以包含之前定义好的类的变量成员
#pragma once 仅包含一次用于多文件工程

类名::函数成员 告诉作用域 用于多文件中,头文件中


对象的初始化和清理
对象初始化由编译器调用构造函数实现,清理有系统调用析构函数清理数据。

构造函数语法: 类名(){}
    1、构造函数没有返回值也不写void
    2、函数名与类名相同
    3、构造函数可以有参数,因此可以发生重载
    4、程序在调用对象时会自动调用构造,无需手动调用且调用一次。

 

析构函数    ~类名(){}

    1,析构函数没有返回值也不用写void
    2、函数名与类名相同,在名称前加~
    3、析构函数不可以有参数,因此不可以发生重载
    4、程序在销毁对象时会自动调用析构,无需手动调用且调用一次。

 


构造函数分类和调用
    参数:有参构造和无参构造;
    按类型:普通构造和拷贝构造

    拷贝构造函数写法

    Persion(const Persion &p){}

    调用
    括号 --------->Persionp2(10);
    显示法 -------> Persion p2=Persion(10)显示调用法
    隐式转换法 -------> Persion p4=10 相当于写了Persion p4=Persion(10)


    Persion(10) 叫做匿名对象,特点:当前执行结束后,系统立即回收匿名对象

注意:
  1、调用默认构造函数时不要加().,因为编译器会认为是一个函数声明
  2、不要利用拷贝构造函数初始化匿名对象;--------> Persion(p3) 编译器认为是一个对象声明重定义;

 


拷贝构造函数调用时机
  1、使用一个已经创建完毕的对象来初始化一个新对象
  2、值传递的方式给函数参数传值
  3、以值方式返回局部对象

 

 


构造函数的调用规则
  默认情况下c++编译器至少会添加3个函数
  1、默认构造函数,无参,函数体为空
  2、默认析构函数,无参,函数体为空
  3、默认拷贝构造函数,对属性进行值拷贝

构造函数调用规则
  1、如果用户定义有参构造函数,c++编译器不提供默认无参构造,但是会提供默认拷贝构造
  2、如果用户定义拷贝构造函数,c++编译器不会再提供其他构造函数。

 

深拷贝和浅拷贝

  浅拷贝:简单的赋值操作;
  深拷贝:在堆区新申请空间,进行拷贝
  如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

 

 

构造函数初始化列表

  C++提供了初始化列表语法,用来初始化属性
语法
  构造函数():属性1(值1),属性2(值2)...{}

 


类对象作为类成员

c++类中的成员可以是另一个类的对象,称为该成员的对象成员;

 

class A{};
class B
{
A a;
};

在声明类变量时a的构造函数先以运行后在运行B的构造函数,当释放时先运行B的析构函数再运行A的析构函数。

 


静态成员

  静态成员就是在成员变量和成员函数之前加上关键字static,
  静态成员分为:


静态变量
  1、所有对象共享同一份数据
  2、在编译阶段分配内存
  3、类内声明,类外初始化 ,必须做的操作

 1 class    A
 2 {
 3   static int m_ A;//类内声明
 4 };
 5 int a::m_A=100;//类外初始化
 6 //此时m_A可通过对象访问如:
 7 //    A p1;
 8 //    p1.m_A;
 9 //也可以用通过类名访问,即 A::m_A
10 
11  

 

静态成员函数
  1、所有对象共享同一函数
  2、静态成员函数只能访问静态成员变量

 


4.3C++对象模型和this指针

  成员变量和成员函数分开存储
  在c++中类内的成员变量和成员函数分开存储,只有非静态变量成员才属于类的对象上。

  空对象占用一个字节内存,是为了区分空对象占用内存的位置
  每个空对象也应该占用唯一的内存地址

 


this指针概念

C++中类成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会公用一块
代码。这块代码通过this指针来指向被调用的成员函数所属的对象

  this指针是隐含每一个非静态成员函数内的一种指针,
  this指针不需要定义,直接使用即可

this 指针的用途
1、当形参和成员便同名时,可用this 指针来区分

 1 class Persion
 2 {
 3         Persion(int age)
 4       {
 5             this->age=age;    //用this 指针区别成员变量和形参同名的
 6                                 //this 指向被调用的成员函数所属的对象
 7       }
 8     int age;
 9 };
10 
11                         

 

2、在类的非静态成员函数中返回对象本身,可使用return *this

 

 1 class Persion
 2 {
 3 public:
 4     Persion (int age)
 5     {
 6         this->age=age;
 7     }
 8     Persion & addage(Persion & p)
 9     {
10         this->age+=p.age;
11         return *this;//返回对象本身
12     }
13     int age;
14 };
15 
16 
17 int main()
18 {
19     Persion p1(10);
20     Persion p2(10);
21         p2.addage(p1).addage(p1).addage(p1).addage(p1).addage(p1);//链式编程思想
22     cout<<p2.age<<endl;
23     return 0;
24 }        

 

 

 

 


4.3.3空指针访问成员函数

c++中空指针也可以调用成员函数的,但是也要注意有没有用到this指针,如果
用到this指针,需要加以判断保证代码的健壮性。

 1 class Perison 
 2 {
 3    public:
 4         void ShowPersionName()
 5         {
 6             cout<<"ShowPersionName"<<endl;    
 7         }
 8         void Showage()
 9         {
10             if(this ==NULL)//防止this指向空指针时程序崩溃
11         {
12             return;
13         }
14         cout <<m_Age<<endl;//cout<<m_Age相当于cout<<this->m_Age
15         }
16         int m_A;
17  };
18 
19 int main()
20 {
21 
22   Persion *p1 =NULL;
23   p1->ShowPersionName();
24   p1->Showage();
25   return 0;
26 }
27  
28 
29      

 

4.3.4const修饰成员函数
常函数:成员函数后加const后叫常函数 //void showpersion () const{}
    常函数内不可以修改成员属性
    成员属性声明时加关键字mutable后,在常函数和常对象中依然可以修改
常对象:声明对象前加const称常对象
    常对象只能调用常函数

    

 

posted @ 2021-02-16 22:45  两天阿来  阅读(103)  评论(0)    收藏  举报