C++基础(3)

一、类和对象

  1. 通过分析"对象"的属性和行为设计出一个类。

  2. 类就是数据类型
    简单类型:只能表示一个属性,C/C++内建数据类型
    数组类型:可以表示多个属性,类型必须相同
    结构类型:可以标是多个属性,但是缺少行为(函数)
    类类型:既能表示属性,也能表示行为,一种复合的数据类型

  3. 对象就是类这种数据类型创建出的实例,相当于结构变量
    class Student
    {
    成员变量;
    成员函数;
    };

    Student stu;

二、类的定义与实例化

  1. 类的一般形式

    class 类名:继承方式 父类
    {
    public/private/protected//访问控制限制符
    成员变量
    //构造函数
    类名(行参表)
    {
    }
    ~类名(void)
    {
    }

    };

  2. 类的访问控制限定符

    public:公有成员,任何位置都可以访问

    private:私有成员,只能类(自己)的成员函数中访问

    protected:受保护成员,只有在类(自己)和子类中访问

    类中的成员和属性默认是 private ,结构体中的成员变量、成员函数默认是 public

    注意:C++中类和结构的区别,只有成员函数和成员变量的默认访问权限不同

  3. 构造函数
    1、什么是构造函数:构造函数没有返回值,类的同名函数就是构造函数
    2、什么时候调用,调用几次,谁调用?
    创建对象的时候,会被自动调用每创建一个类对象就会被调用一次,而且对象整个生命周期中一定会被调用一次且只能被调用一次
    3、负责干什么
    成员变量的初始化,分配相关资源,设置对象的初始状态

  4. 对象的创建过程
    1、分配类所需要的空间,无论堆栈
    2、传递实参调用构造函数,完成如下任务:
    1)根据继承表依次调用父类的构造函数
    2)根据成员变量的顺序依次调用成员变量的构建函数
    3)执行构造函数体中的代码
    注意:执行构造函数的代码,是整个构造函数的最后一步
    要保证构造函数代码所需要的一切资源和先决条件在该代码执行前已经准备充分,并得到初始化

  5. 对象的创建方法
    在栈上创建:类名 对象;//加括号可能出错
    类名 对象(实参)
    在堆上创建:类名* 对象指针 = new 类名
    类名* 对象指针 = new 类名(实参)
    创建多个:初始化部分

    类名 对象 = {(实参),(实参)}
    User user[10]={User(“he1”,“123456”),User2(“he2”,“123456”)}

    类名* 对象指针= new{(实参),(实参)}
    User* user= new User[10]{User(“he1”,“123456”),User2(“he2”,“123456”)}
    注意:通过malloc创建的类对象构造函数不会被调用
    注意:通过 new[]创建的对象,一定要通过delete[]释放

  6. 类的声明、实现、调用
    1)头文件中声明
    class 类名 :继承方式 父亲
    {
    成员变量;
    public:访问控制符
    //构造函数
    //析构函数
    //返回值
    },
    2)源文件实现相关函数
    返回值 类名::函数名(参数列表)
    3)调用时之需要导入头文件,然后与类函数所在的源文件一起编译
    注意:如果一个类的内容不多
    注意:类中自动生成的函数,在源文件中实现时也需要在头文件中声明

三、构造函数与初始化列表

  1. 构造函数是可以被重载(同名函数的不同版本)
  2. 缺省构造,也就是编译器自动生成的一个什么都不做的构造函数,唯一的作用是避免编译错误
    注意:当类中实现一个缺省构造后,缺省构造不会自动生成,如果有需要,必须显式的调用
  3. 无参构造未必无参,当给有参构造的所有参数设置默认行参,调用这种函数就不需要传参
    Student stu()//函数声明
    注意:所谓的编译器生成的xx函数,其实不是真正意义上的函数,而是功能意义上的函数,编译器作为可执行指令的生成者,他会直接生成具有某项功能的二进制指令,不需要高级语言语意上的函数完成此任务
    注意:一个类A是类B的成员变量,那么一定要保证它有一个无参构造,当B的构造函数执行时会先执行

成员变量的无参构造,而此时类B是无法给类A成员提供参数的

  1. 单参构造与类型转换
    调用了单参构造,有点像是类型转换
    如果构造函数的参数只有一个,Test t=n可能会成功,它会自动调用单参构造来达到类型转换的效果
    如果想禁止,就需要在单参构造前加 explicit

  2. 初始化列表
    为类成员进行初始化用的。
    一定是构造函数(参数):成员1(参数1)、成员2(参数2)
    通过初始化列表可以给类成员变量传递参数,以此调用类成员的有参构造
    初始化列表也可以给 const 成员、引用成员进行初始化
    成员的初始化顺序,和初始化列表没有关系
    注意:初始化列表运行时,类成员变量还没有定义成功

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值