C++笔记2•类和对象1•

1.面向过程和面向对象的认识

面向过程:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

面向对象:C++语言是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

举个形象的例子说明一下

在家吃饭做面:先去菜市场买菜和面->回家->洗菜->筹备其他食材->烧水煮面->炒菜->放不同的调料达到合适的口味->吃饭->饭后洗碗。(面向过程

点买卖吃面:外卖平台点餐->商家接单->骑手配送->本人接收外卖(面向对象

在上面吃饭的例子中可以看到面向过程重在过程,在这个过程之间需要买菜、洗菜、炒菜等工作之后才能吃到饭,需要一步一步地够达到自己的目的。而面向对象是对于吃饭,其实就是外卖平台、商家、骑手、点餐人,四个对象之间的交互,你不用管是如何做饭的,只用等骑手把餐送到你手里就行了。

 2.类的定义

class 类名

{

    //成员变量

    //成员函数

};//分号不要忘记

//这个写法在C语言中是不是和结构体很相似

C语言中是用struct来定义的

struct 结构体名

{

    //结构体变量

   //结构体函数

};

所以一般在C++语言中,我们用class定义这样的类;

C++语言class与struct区别:

C++ 需要兼容 C 语言,所以 C++ struct 可以当成结构体使用。另外 C++ struct 还可以用来
定义类。和 class 定义类是一样的,区别是 struct 定义的类默认访问权限是 public class 定义的类 默认访问权限是private 。注意:在继承和模板参数列表位置, struct class 也有区别,后序再 介绍。

3. 类的访问限定符及封装

(1).访问限定符定义

C++ 实现封装的方式: 用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选 择性的将其接口提供给外部的用户使用
(2).访问限定符:public(共有)、protected(保护)、private(私有)
  1)public 修饰的成员在类外可以直接被访问
  2)protected private 修饰的成员在类外不能直接被访问 ( 此处 protected private 是类似的 )
  3)访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4)如果后面没有访问限定符,作用域就到 } 即类结束。
  5)class的默认访问权限为 private struct public( 因为 struct 要兼容 C)
  注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

4.封装 

面向对象的三大特性: 封装、继承、多态
封装的定义:

       将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质上是一种管理,让用户更方便使用类。

5.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

class Person
{
public:
 void PrintPersonInfo();
private:
 char _name[20];
 char _gender[3];
 int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域,就要用到作用域操作符::
void Person::PrintPersonInfo()
{
 cout << _name << " "<< _gender << " " << _age << endl;
};

 6.类的实例化

用类类型创建对象的过程,称为类的实例化:
1. 类是对对象进行描述的 ,是一个 模型 一样的东西,限定了类有哪些成员,定义出一个类 并没 有分配实际的内存空间 来存储它;比如:入学时填写的学生信息表,表格中姓名、学号、性别等等就可以看成是一个类,来描述具体学生信息。
2. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量
int main()
{
 Person._age = 100;   // 编译失败:error C2059: 语法错误:“.”
 return 0;
}
//这个就相当于,入学时填写的学生信息表,表格中姓名、学号、性别等等就可以看成是一个类,来描述具体学生信息。空白表你去访问名字,肯定是啥也没有;等到有张三、李四来报到后,填写了他们的信息,你才能去找到这些信息,张三、李四就是空白表实例化的对象,用这个对象(张三)去访问他的年龄,才有效。

       这个就相当于,入学时填写的学生信息表,表格中姓名、学号、性别等等就可以看成是一个类,来描述具体学生信息。空白表你去访问名字,肯定是啥也没有;等到有张三、李四来报到后,填写了他们的信息,你才能去找到这些信息,张三、李四就是空白表实例化的对象,用这个对象(张三)去访问他的年龄,才有效。

7.类对象的存储方式

(1)类对象的存储方式: 只保存成员变量,成员函数存放在公共的代码段,这样节约内存。
(2)类的大小:
// 类中既有成员变量,又有成员函数
class a {
public:
    void f1(){}
private:
    int _a;
};
// 类中仅有成员函数
class b {
public:
   void f2() {}
};
// 类中什么都没有---空类
class c
{};

//sizeof(a) : 4
//sizeof(b) : 1
//sizeof(c) : 1
说明:
一个类的大小,实际就是该类中 成员变量 之和,当然要注意内存对齐, 注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。
结构体内存对齐详见:

8.this指针 

(1)this指针的引入

class Date
{ 
public:
 void Init(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 void Print()
 {
 cout <<_year<< "-" <<_month << "-"<< _day <<endl;
 }
private:
 int _year;     // 年
 int _month;    // 月
 int _day;      // 日
};
int main()
{
 Date d1, d2;
 d1.Init(2022,1,11);
 d2.Init(2022, 1, 12);
 d1.Print();
 d2.Print();
 return 0;
}

对于上述类,有这样的一个问题:
Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成,这里说的就是this指针。

(2) this指针的特性
1)this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2)只能在“成员函数”的内部使用。
3)this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
this形参。所以对象中不存储this指针。
4) this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
递,不需要用户传递。

//假设有一个class Time的类
void show()
{
   cout << _day << endl;
}//这是我们正常写的代码

//编译处理成员函数之后的代码如下👇👇👇:

void show(Time* this)
{
   cout << this->_day << endl;
}//这是编译器编译后的代码,会自动把这个this加进去,我们写的时候不用去写。

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值