C++:类与对象1

  • 类的定义
    例如:
class className
{
}; 

class为定义类的关键字,className为类的名字,{}中为类的主体,类定义结束时后面加分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数

  • 如何定义一个类
    类有两种定义方式,一种是声明和定义都放在类体中,一种是声明放在.h文件中,定义放在.c文件中
  • 类的访问限定符及封装
    C++实现封装的方式
    用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
    访问限定符:分为三个,分别为publlic(公有),private(私有),protected(保护)。其中public修饰的成员在类外可以直接被访问, protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的),它的作用域是从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,class的默认访问权限为private,struct为public(struct要兼容C语言),在C语言中,struct中不能放成员函数。
    注意:在C++中,struct和class的区别在于struct可以定义结构体和类,class可以定义类,struct的成员默认访问方式是public,class的成员默认访问方式是private,因此要在类外使用类中的成员函数,函数名前面必须加上类的名字+::(作用域解析符),它还属于类内的成员方法。
  • 封装
    封装就是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
  • 类的作用域
    类定义了一个新的作用域,类的所有成员都在类的作用域中(在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域)。
  • 类的实例化
    用类类型创建对象的过程称为类的实例化, 因为类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它,类只是用来描述对象的。
  • 求类的大小
    类中既可以有成员变量,又可以有成员函数,因此在计算类的大小时,我们可以做出以下猜测:
    1、对象中包含类的各个成员,但是会产生问题,每个对象中成员变量是不同的,但是调用同一份函数,按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。
    2、只保存成员变量,成员函数存放在公共的代码段,即虽然类创建了多个对象,但成员函数是相同的,将相同的提取出来,开辟单独存放成员函数的空间,存储成员函数地址,即在成员变量空间中加一个指针指向成员函数首地址。
    3、那么计算机中,类到底是如何存储的,其实一个类的大小,实际就是该类中”成员变量”之和,注意要进行内存对齐,空类的大小是一个字节(主流编译器下),因为当这个类创建了多个对象,如果为0个字节,则创建的对象在同一个位置,为了区分不包含成员变量的类创建的对象,因此编译器设置一个字节给空类。
  • 关于结构体对齐相关问题,见博客:https://blog.csdn.net/qq_41809901/article/details/90742156
  • 面向对象与面向过程的区别
    面向过程是分析出来解决问题所需要的方法,用函数将这些方法一一实现,在使用时一一调用即可,而面向对象是将构成问题的事务分解成各个对象,建立对象并不是为了完成某个步骤,而是为了描述事物在整个解决问题的步骤中的行为。
  • this指针
    一个类中可能有多个成员函数,函数体中并没有关于不同对象的区分,我们会遇到一个问题,成员函数是怎么知道操作哪个对象的,在C++中,我们使用this指针时时刻刻指向类的对象,this指针是类非静态成员函数的第一个隐藏参数,该参数使用指向调用当前函数的对象,在函数体中所有成员变量的操作,都是通过this指针去访问,只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
    this指针的特性
  1. this指针的类型:对于普通类型成员函数,this指针的类型是类类型* const,this指针的指向不能修改,但是可以修改对象的内容;对于const修饰的成员函数,this指针的类型是const 类类型* const,this指针的指向不能修改,并且this指向的对象的内容也不能修改,this指针无法进行取地址操作。
  2. this指针是非静态成员函数的第一个隐藏参数,隐藏的概念就是用户在编写函数时不用给出this的参数,该参数由编译器自己维护,调用该函数也不需要手动传递;
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针,不会影响sizeof()的结果。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递(_thiscall:调用约定),不需要用户传递,还有一种情况是通过参数压栈的方式进行传递:push 对象地址,例如:类中如果包含不定参数的成员函数。
    注意:this指针是否可以为NULL?
    (1)如果成员函数通过对象的方式进行调用,this指针一定不为NULL;
    (2)如果成员函数是通过类类型的指针方式进行调用,this指针可能为NULL,但是代码可能会崩溃,因为如果在成员函数中没有访问非静态的成员变量,代码不会崩溃,反之,代码就会崩溃;
    this指针的位置在栈上;
    注意:类的编译过程
    (1)识别类名;
    (2)识别类中的成员;
    (3)识别类中的成员函数,并对成员函数进行改写,即给非静态的成员函数增加隐藏的this指针参数,并给成员函数中每个访问非静态变量前加this;
  • this指针的使用
    1、在类的非静态变量成员函数中返回类对象本身时,直接使用return *this
    2、当函数参数与成员变量名相同时,形如this.age=age这样来使用。
    源代码(github)
    https://github.com/wangbiy/C-/tree/master/test_2019_7_25_1/test_2019_7_25_1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值