本篇主要学习总结C++类的相关知识,希望可以帮助到大家,如果错误,还望大佬不吝赐教。

与C的区别

  • C是面向过程编程,关注解决问题的步骤,通过函数的逐步调用解决实际问题;C++是面向对象编程,将一件事情拆分为不同的对象,靠对象之间的交互完成。
  • 语法差异:C++在C语言的基础上增加了一些新的语法元素,如类、对象、继承、多态等。这使得C++在编程时更加灵活和强大。
  • 性能差异:由于C++是C语言的扩展,因此在性能上两者相差无几。在大多数情况下,C++程序的性能与C语言程序相当。
  • 应用领域:C语言通常用于底层系统开发、嵌入式系统、游戏开发等领域,而C++则广泛应用于各种大型软件系统、网络编程、图形界面开发等领域。

一、基本知识

  1. 定义

    类似于C中的结构体类型,二者都是用户自定义的复合数据类型。但C++中的类拥有成员函数,还具有继承、访问控制等特性。

    定义:

// class为类的关键字,classname是这几行代码定义出类的名。
class classname
{
    // 类的内部
 public:
    // 公共区间
 private:
    // 私有区间
    
};

其中public与private访问标号分别标识了公共空间和私有空间,在 public 部分定义的成员可被使用该类型的所有代码访问;在 private 部分定义的成员可被其他类成员访问。

通俗来说,private:好比一个人的身体与四肢,未经允许的情况下,只有自己可以调用;

public:好比一个人的工作,比如程序员,老板让程序员写代码,写代码就是程序员的一个功能,并且是public 的,可以被老板调用,但是程序员写代码的时候要用到自己private的东西,比如两只手;

  1. 作用域

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

    因而,类的定义方式也会因为作用域的存在,有两种不同的定义方式:

  • 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
  • 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
  1. 类的实例化

    类型创建对象的过程,就是类的实例化。

    类就好像图纸,对象就是使用此图纸设计出来的房子,虽然图纸设计出了房子,但图纸本身并不会导致实体建筑的存在。

    一张图纸可以设计出多个房子,同理,一个类也可以实例化出多个对象;

二、类的小知识

1、类对象的大小计算

  • 类实例化出的对象占用空间大小与成员函数无关,只取决于成员变量的大小
  • 成员变量在类的public与private部分均须参与大小的计算,简言之,类内部的成员变量,均须参与对象大小的计算
  • 类对象大小的计算遵循内存对齐原则

举个例子:

class A
{
public:
	void func1(); //函数不参与计算
    // char _e;
	int _d;
    char _e;
private:
	void func2() //函数不参与计算
	{
		int a = 1;
		int b = 3;
	};
	char _a;
	int _b;
	int _c;
	
};

遵循内存对齐原则:最大对齐数为:4(所有变量类型最大者与默认对齐参数取最小,VS默认对齐数为8);

当_e在_d后时,由于内存对齐,_e与_a会连续放置,所以占用空间为16;

当_e在_d前时,由于内存对齐,后续三个空间会被闲置,所以占用空间为20;

如下: image-20240425110731046.png

2、this指针

C++Primer介绍:this指针为成员函数的隐式形参。this 指针指向调用该函数的对象,是指向类类型的指针。在 const 成员函数中,该指针也指向 const 对象。

  • **每个成员函数都有一个额外的、隐含的形参 this。**在调用成员函数时,形参 this 初始化为调用函数的对象的地址。

    举例来说:

    void Date::Print() const
    {
    	cout << _year << " " << _month << " " << _day << endl;
    }
    
    void Date::Print1() const
    {
    	cout << this->_year << " " << this->_month << " " << this->_day << endl;
    }
    

    image-20240508212332762.png

    上述代码中,Print()与Print1()的功能是完全一样的;

  • this指针的类型:类类型 const*,即成员函数中,不能给this指针赋值;

    this总是指向现在的对象,不可修改;也就是说,this指针是一个常量指针, 其中保存的地址不可被修改。

    当在上述Print1中,加入一行代码,我们可以打印出d1的地址,但其实,地址也就是d1这个对象的地址,如下:

    void Date::Print1() const
    {
        cout << this << endl;
    	cout << this->_year << " " << this->_month << " " << this->_day << endl;
    }
    

image-20240511160742353.png

  • this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this,所以对象中不存储this指针。