类和对象(1)

简介: 类和对象(1)

1 对象的初步认识

C语言在解决问题的时候需要考虑如何一步一步的去解决!这种我们称之为面向过程!面向对象,就是将问题变成几个对象之间的交互就可以了,不需要具体关心怎么做!举个例子来理解一下:如果我们要吃西红柿炒蛋这个菜,我们是不是需要一系列的步骤才可以将西红柿炒蛋做好!而如果从面向对象这个角度来看,我们只需要关注商家,app,骑手等这几个对象来交互,我们也可以吃到西红柿炒蛋,至于是怎么做的,我们并不关心!


2 struct和class关键字

C++是兼容C语言的,在C语言的基础之上,将struct关键字进行了升级,也可以用来定义类,代码如下:

struct Person {
  int age;
  double weight;
  double height;
  void print()
  {}
  void init()
  {}
};
int main()
{
  Person p;
  return 0;
}

我们可以看到,在C++中我们可以直接利用Person进行定义类型,而C语言是必须带上struct的!并且可以直接定义函数!此时的Person准确来说其实就是一个类,p是一个对象。类中的age,weight,height称为成员变量,里面的函数称为成员函数。

而我们一般采用class关键字来进行定义类!


2.1 类的定义

从上面我们可以知道,类一般是由class关键字进行定义的,定义的方式一般有两种:

第一种就是我们上面写的那样,函数的声明与定义全部写在类体里面。

这种写法需要注意的是编译器可能会将成员函数当做内联函数来处理


第二种就是用法如下:

我们一定要加上域限定符,让编译器知道定义的这个init函数是属于Person这个类的!

2.2 成员函数的命名规则

对于以上辨别传入的值是赋给形参的还是类中声明的呢?根据局部优先,这里应该是形参,可是这样写代码的阅读性是很差的,所以我们应该做出区分!在类的声明时,我们应当做出区别:


2.3 类的访问限定符

通常有private,protected,public三种访问限定符

private和protected只能在类里面进行访问(两者的区别在后续会介绍),public在类的外面也是可以访问的

用法如下:


我们可以知道成员变量我们是使用了private,在类外不可以直接进行访问的,成员函数则采用了public限定符!


1 如果我们没有标识访问限定符,struct定义的类默认public,class定义的类默认private

2 限定符是有作用的范围的,以上面为例,private的作用范围就是在下一个限定符之前也就是public前,后面直到类结束

都是public


2.4 类的作用域

其实在C++中{}就是一个作用域,在类外需要使用类中的成员需要::(域操作符来表明是哪一个类域)

3 类的大小的计算

类的大小和类的对象的大小其实是一样的。其实对于类的大小的计算,代码如下:


根据内存对齐规则我们可以发现,其实只计算成员变量的大小。而没有计算成员函数的大小!实际上是因为成员函数的指针并没有存储在对象里面,而是存储在一个公共代码区,需要用到的时候去调用就行了,所以我们计算类的大小是不包括成员函数的!!!

我们再来看看这样一段代码:

对于空类的大小我们会有1个标识位来标识对象。

4 类成员函数指针this

从上面我们可以知道,成员函数都是存放到公共代码区,那么我们如何根据对象的不同,来实现不一样的输出呢?其实这里就涉及了this指针!而这个this指针是不可以显式的表现出来,是由编译器自己完成的:

其中,this是不可以更改指向的(如果const在*前面,就说明指针指向的内容是不可以改变的)!

关于this指针这里有一个经典的问题:this指针可以为空吗?

class Person {
private:
  int _age;
  double _weight;
  double _height;
public: 
  
   void print()
   {
     cout << "print" << endl;
   }
  void init(int age, double weight, double height)
  {
    _age = age;
    _weight = weight;
    _height = height;
  }
};

int main()
{
  Person* p = nullptr;
  p->print();
  return 0;
}

你觉得代码的运行结果是什么呢?有许多人认为空指针,会运行错误!事实真的如此吗?我们给上运行结果:

我们上面已经讲过了,成员函数的指针是不存在类的对象里面的,在公共代码区,所以我们是可以通过这样一个 Person类型来调用函数的!!!我们再来看这样一段代码:

此时还是可以调用函数的,但是由于this指针是空指针,访问成员变量是非法的,所以就会出现运行错误!!!

目录
相关文章
|
5月前
|
存储 编译器 C++
3.C++类和对象(中)
3.C++类和对象(中)
|
6月前
|
编译器 C# C++
【C++】类和对象(四)
【C++】类和对象(四)
|
6月前
|
存储 编译器 C语言
C++:类和对象(上)
C++:类和对象(上)
82 0
|
存储 编译器 C++
|
3月前
|
存储 安全 编译器
【C++】类和对象(下)
【C++】类和对象(下)
【C++】类和对象(下)
|
3月前
|
编译器 程序员 C语言
C++ --> 类和对象(一)
C++ --> 类和对象(一)
28 5
|
6月前
|
Java 编译器 Linux
C++:类和对象(下)
C++:类和对象(下)
44 1
|
6月前
|
存储 编译器 C语言
C++-类和对象(2)
C++-类和对象(2)
38 0
|
6月前
|
存储 安全 编译器
|
11月前
|
存储 安全 Java
类和对象(二)
类和对象(二)
47 1